Question: 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?

Answer: 
Actually, `MimeMessage` [does not implement `Serializable` by design](http://www.oracle.com/technetwork/java/javamail/faq-135477.html#serialize), you can extend `MimeMessage` to do so but you do not need to as `MimeMessage` has facilities using [writeTo(OutputStream)](https://javamail.java.net/nonav/docs/api/javax/mail/internet/MimeMessage.html#writeTo(java.io.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)](https://javamail.java.net/nonav/docs/api/javax/mail/internet/MimeMessage.html#MimeMessage(javax.mail.Session,%20java.io.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](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/mail/javamail/JavaMailSender.html) then you can also construct new mime messages through the configured session by using [createMimeMessage(InputStream)](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/mail/javamail/JavaMailSender.html#createMimeMessage-java.io.InputStream-) which uses the configured session.
As stated in other answers: if you don't need the session information in the MimeMessage you can make use of the `MimeMessage.writeTo` method to store it in a serializable wrapper object. As a template see the following code (Beware, it's not 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;
    }

```