我对Javamail有一个非常令人沮丧的问题。
因此,简单的非加密,无附件电子邮件在Linux和Windows中均可使用。
当我尝试与其一起发送附件,或使用TLS加密发送电子邮件时,javamail仅在Linux上崩溃,而不是在Windows上崩溃。
在Transport.send(msg)中抛出异常,这不是我写的。
完整的堆栈跟踪是这样的。
java.lang.NullPointerException
at org.jpackage.mail.inet.smtp.SMTPConnection.getResponse(SMTPConnection.java:814)
at org.jpackage.mail.inet.smtp.SMTPConnection.getAllResponses(SMTPConnection.java:841)
at org.jpackage.mail.inet.smtp.SMTPConnection.quit(SMTPConnection.java:537)
at gnu.mail.providers.smtp.SMTPTransport.close(SMTPTransport.java:549)
at javax.mail.Transport.doSend(Transport.java:205)
at javax.mail.Transport.send(Transport.java:75)
任何可能的原因?我只是在处理这个应用程序在Linux上失败时非常令人沮丧。
我从Oracle下载并检查了javamail 1.4.4发行版。在包含的jar文件中没有任何地方有任何org.jpackage.*
或gnu.mail.*
包,所以你必须从其他地方获取它们。
我建议你清理你的类路径并消除虚假包,然后再试一次。
我遇到了类似的问题,完全相同的例外。我在相同的操作系统(Windows)上运行相同的代码但在两个不同的上下文(DOS提示符和JOnAS应用程序服务器)中都没有带来相同的结果:邮件在DOS提示符下成功发送,但在JOnAS上失败。
我激活了邮件会话的调试模式并比较了SMTP跟踪。它们或多或少相同,除了用于身份验证的用户名和密码base64值:我注意到在DOS(工作)版本中,base64转换后的密码有填充(例如,密码“test”被转换为“dGVzdA = =“),但在JOnAS版本(不工作)中,base64转换的密码没有填充(密码”test“被转换为”dGVzdA“)。这使得身份验证失败。
坏的base64编码是由JOnAS默认库中存在的gnu-mail.jar
和/或gnu-providers.jar
库引起的,而这些库是加载而不是我的WAR中嵌入的jar。
我通过从JOnAS默认libs文件夹中删除这些jar来修复此问题。 JOnAS重新启动后,邮件已成功发送。