如何序列化Mimemessage实例?

我一直在尝试序列化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 没有按设计实现Serializable ,你可以扩展MimeMessage这样做但你不需要因为MimeMessage有使用writeTo(OutputStream)的工具允许你将内容保存为n RFC-822 mime消息。

 try (OutputStream str = Files.newOutputStream(Paths.get("message.eml"))) { msg.writeTo(str); } 

然后,您可以使用带有会话对象的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,那么您还可以使用使用配置的会话的createMimeMessage(InputStream)通过配置的会话构造新的mime消息。

当序列化的Object未实现java.io.Serializable接口时,抛出NotSerializableException 。 因为, javax.mail.internet.MimeMessage没有实现这个接口, 所以无法序列化。

 public class MimeMessage extends Message implements MimePart 

考虑序列化其内容; 通过将其包装在实现Serializable的自定义域对象(带有消息文本和收件人)中。 在需要时反序列化此域对象,然后继续从其内容构造新的MimeMessage

如其他答案中所述:如果您不需要MimeMessage中的会话信息,则可以使用MimeMessage.writeTo方法将其存储在可序列化的包装器对象中。 作为模板,请参阅以下代码(注意,它不是Null-safe)。

 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.MimeMessage; import com.sun.mail.smtp.SMTPOutputStream; public class SerializableMimeMessage implements Serializable { /** * */ private static final long serialVersionUID = 3763328805281033284L; private transient MimeMessage mimeMessage; public SerializableMimeMessage(MimeMessage mimeMessage) { this.mimeMessage = mimeMessage; } private void writeObject(ObjectOutputStream oos) throws IOException { // convert ByteArrayOutputStream baos = new ByteArrayOutputStream(); SMTPOutputStream os = new SMTPOutputStream(baos); try { mimeMessage.writeTo(os); } catch (MessagingException e) { throw new IOException("MimeMessage could not be serialized.", e); } os.flush(); byte[] serializedEmail = baos.toByteArray(); // default serialization oos.defaultWriteObject(); // write the object oos.writeInt(serializedEmail.length); oos.write(serializedEmail); } private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { // default deserialization ois.defaultReadObject(); // read the object int len = ois.readInt(); byte[] serializedEmail = new byte[len]; ois.readFully(serializedEmail); // convert ByteArrayInputStream bais = new ByteArrayInputStream(serializedEmail); try { mimeMessage = new MimeMessage((Session) null, bais); } catch (MessagingException e) { throw new IOException("MimeMessage could not be deserialized.", e); } } public MimeMessage getMimeMessage() { return mimeMessage; }