MimeMultipart не сериализуется, никаких обходных решений? [Дубликат]

Это конкретный случай, но поскольку я пришел на эту страницу, ища решение и не нашел его, я добавлю его здесь.

Windows (проверена с 7) не принимать специальные символы (например, á) в именах классов и пакетов. Linux, однако.

Я узнал об этом, когда я построил .jar в NetBeans и попытался запустить его в командной строке. Он работал в NetBeans, но не в командной строке.

7
задан Ekrem Doğan 12 July 2013 в 07:50
поделиться

3 ответа

На самом деле, MimeMessage не реализует Serializable по дизайну , вы можете расширить MimeMessage, чтобы сделать это, но вам не нужно, поскольку MimeMessage имеет объекты, использующие writeTo (OutputStream) , чтобы вы могли сохранить содержимое как сообщение mime m RFC-822.

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

Затем вы можете прочитать это сообщение для последующей обработки с помощью MimeMessage (сеанс , 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 Spring, вы также можете создавать новые сообщения mime через настроенный сеанс используя createMimeMessage (InputStream) , который использует настроенный сеанс.

8
ответ дан Brett Ryan 26 August 2018 в 23:08
поделиться

Как указано в других ответах: если вам не нужна информация о сеансе в 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;
    }
0
ответ дан fab 26 August 2018 в 23:08
поделиться

NotSerializableException вызывается, когда сериализуемый объект не реализует интерфейс java.io.Serializable. Поскольку javax.mail.internet.MimeMessage не реализует этот интерфейс, он не может быть сериализован .

public class MimeMessage extends Message implements MimePart

Вместо этого попробуйте сериализовать его содержимое; путем его упаковки в пользовательский объект домена (с текстом сообщения и получателями), который реализует Serializable . Де-сериализуйте этот объект домена, если это необходимо, а затем перейдите к его созданию MimeMessage .

1
ответ дан Ravi Thapliyal 26 August 2018 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: