无法使用 Play 2.5 发送异步电子邮件

Dis*_*ive 2 java jakarta-mail playframework-2.5

我最近按照本指南https://www.playframework.com/documentation/2.5.x/Migration25将我的应用程序从 play 2.3 迁移到 play 2.5, 并且我也根据此处指定的内容更新了 play-mailer https://github.com /playframework/play-mailer

现在我的应用程序无法再发送电子邮件。我创建了一个注入器构造函数来注入邮件程序实例

@Inject public SmtpConnector(MailerClient mailer) 
{ 
    this.mailerClient = mailer; 
    MailcapCommandMap mc = (MailcapCommandMap)   MailcapCommandMap.getDefaultCommandMap(); 
    mc.addMailcap("text/html;; x-java-content-  handler=com.sun.mail.handlers.text_html"); 
    mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
    mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
    mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
    mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
    CommandMap.setDefaultCommandMap(mc); 
}
Run Code Online (Sandbox Code Playgroud)

我在异步任务中执行发送电子邮件方法:

CompletableFuture.runAsync( () -> mailerClient.send(email) ).exceptionally(exc -> {exc.printStackTrace(); return null;});
Run Code Online (Sandbox Code Playgroud)

但我不断收到关于缺乏 mimetype multipart 支持的错误:

... java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626) ... 5 更多 原因:javax.mail.MessagingException:发送消息时发生 IOException;嵌套异常是: javax.activation.UnsupportedDataTypeException:没有 MIME 类型 multipart/alternative 的对象 DCH;border="----=_Part_0_1284684208.1469102367572" 位于 com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1177) 位于 javax.mail.Transport.send0(Transport.java:195) 位于 javax.mail .Transport.send(Transport.java:124) at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1411) ... 14 更多 原因:javax.activation.UnsupportedDataTypeException:没有 MIME 类型的对象 DCH多部分/替代;border="----=_Part_0_1284684208.1469102367572" 在 javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:896) 在 javax.activation.DataHandler.writeTo(DataHandler.java:317) 在 javax.mail.internet.MimeBodyPart .writeTo(MimeBodyPart.java:1485) 在 javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1773) 在 com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1121) ... 17 更多

但:

有解决方法吗?有没有一种(另一种)方法可以通过 Play 框架 2.5 使用 java api 发送电子邮件?

更新1:

根据jmehrens的建议,我激活了调试标志,这就是我得到的:

无法加载 DCH com.sun.mail.handlers.multipart_mixed;异常:java.lang.ClassNotFoundException:com/sun/mail/handlers/multipart_mixed

根据此 github.com/playframework/play-mailer/issues/104,问题似乎是通过不从 Play 控制器的上下文调用该方法而触发的

更新 2:在这里您可以找到从开始到异常的 -verbose:class 输出:s000.tinyupload.com/?file_id=50323853839855936002

更新3

在这里您可以找到 jmehrens 建议转储的 getClass() 类加载器:s000.tinyupload.com/?file_id=51200633758480523188

Dis*_*ive 5

这解决了这个问题:

CompletableFuture.runAsync( () -> {
Thread.currentThread().setContextClassLoader( getClass().getClassLoader() ); 
mailerClient.send(email);}, Executors.newSingleThreadExecutor()).exceptionally(exc ->  {
exc.printStackTrace(); 
return null;});
Run Code Online (Sandbox Code Playgroud)