Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to serialize a Mimemessage instance?

I have been trying to serialize a MimeMessage instance, but as I read on web it is not possible. What I want to achieve with serializing a MimeMessage instance is that I want to hash that instance and send it along mail itself. What I coded so far is this:

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();

It compiles on GlassFish server, but I get a runtime error when I try to use service. It says:

exception

java.io.NotSerializableException: javax.mail.internet.MimeMessage

I tried it to do in this way; yet it didn't work, either:

Object obj = new Object();
obj = (Object)message;
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("object.ser")));
oos.writeObject(obj);
oos.close();

Is there any way to achieve serializing a MimeMessage instance or to go around and hack it in some other way?

like image 915
Ekrem Doğan Avatar asked Jul 12 '13 06:07

Ekrem Doğan


2 Answers

NotSerializableException is thrown when the Object being serialized does not implement java.io.Serializable interface. Since, javax.mail.internet.MimeMessage does not implement this interface it cannot be serialized.

public class MimeMessage extends Message implements MimePart

Consider serializing its content instead; by wrapping it up in a custom domain object (with the message text and recipients) that implements Serializable. De-serialize this domain object when required and then go on to construct a new MimeMessage from its contents.

like image 34
Ravi K Thapliyal Avatar answered Oct 05 '22 22:10

Ravi K Thapliyal


Actually, MimeMessage does not implement Serializable by design, you can extend MimeMessage to do so but you do not need to as MimeMessage has facilities using writeTo(OutputStream) to allow you to save the content as n RFC-822 mime message.

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

You can then read this message in for later processing using the MimeMessage(Session,InputStream) constructor with the session object.

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);
}

If you happen to be using spring's JavaMailSender then you can also construct new mime messages through the configured session by using createMimeMessage(InputStream) which uses the configured session.

like image 108
Brett Ryan Avatar answered Oct 05 '22 23:10

Brett Ryan