我一直在尝试序列化一个MimeMessage实例,但是当我在网上阅读时,这是不可能的。我想序列化一个MimeMessage实例要实现的是,我想对该实例进行哈希处理并通过邮件本身发送。到目前为止,我编码的是:
MimeMessage message = new MimeMessage(session);
//...setting up content of MimeMessage
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("object.ser")));
oos.writeObject(message);
oos.close();
它在GlassFish服务器上编译,但是在尝试使用服务时出现运行时错误。它说:
exception
java.io.NotSerializableException: javax.mail.internet.MimeMessage
我尝试过用这种方法来做。但它也不起作用:
Object obj = new Object();
obj = (Object)message;
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("object.ser")));
oos.writeObject(obj);
oos.close();
有什么方法可以序列化MimeMessage实例或以其他方式破解它?
最佳答案
实际上,MimeMessage
does not implement Serializable
by design可以扩展MimeMessage
这样做,但是您不需要这样做,因为MimeMessage
具有使用writeTo(OutputStream)的功能,可以将内容另存为RFC-822 mime消息。
try (OutputStream str = Files.newOutputStream(Paths.get("message.eml"))) {
msg.writeTo(str);
}
然后,您可以使用带有 session 对象的MimeMessage(Session,InputStream)构造函数阅读此消息,以供以后处理。
Session session = Session.getInstance(props);
try (InputStream str = Files.newInputStream(Paths.get("message.eml"))) {
MimeMessage msg = new MimeMessage(session, str);
// Do something with the message, maybe send it.
Transport.send(msg);
}
如果您碰巧正在使用spring的JavaMailSender,则还可以通过使用配置的 session 的createMimeMessage(InputStream)通过配置的 session 构造新的mime消息。