我一直在尝试序列化一个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消息。

09-15 17:41