Это конкретный случай, но поскольку я пришел на эту страницу, ища решение и не нашел его, я добавлю его здесь.
Windows (проверена с 7) не принимать специальные символы (например, á
) в именах классов и пакетов. Linux, однако.
Я узнал об этом, когда я построил .jar
в NetBeans и попытался запустить его в командной строке. Он работал в NetBeans, но не в командной строке.
На самом деле, 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) , который использует настроенный сеанс.
Как указано в других ответах: если вам не нужна информация о сеансе в 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;
}
NotSerializableException
вызывается, когда сериализуемый объект не реализует интерфейс java.io.Serializable
. Поскольку javax.mail.internet.MimeMessage не реализует этот интерфейс, он не может быть сериализован .
public class MimeMessage extends Message implements MimePart
Вместо этого попробуйте сериализовать его содержимое; путем его упаковки в пользовательский объект домена (с текстом сообщения и получателями), который реализует Serializable . Де-сериализуйте этот объект домена, если это необходимо, а затем перейдите к его созданию MimeMessage .