无法使用 Play 2.5 发送异步电子邮件
Unable to send async emails with Play 2.5
我最近按照本指南将我的应用程序从 play 2.3 迁移到 play 2.5 https://www.playframework.com/documentation/2.5.x/Migration25
我也根据此处指定的内容更新了 play-mailer https://github.com/playframework/play-mailer
现在我的应用程序无法再发送电子邮件。我创建了一个用于注入邮件程序实例的 Injector Constructor
@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);
}
我在异步任务中执行发送电子邮件方法:
CompletableFuture.runAsync( () -> mailerClient.send(email) ).exceptionally(exc -> {exc.printStackTrace(); return null;});
但我不断收到关于缺少 mimetype multipart 支持的错误:
...
java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626) ... 5 more Caused by: javax.mail.MessagingException: IOException while sending message; nested exception is: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/alternative; boundary="----=_Part_0_1284684208.1469102367572" at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1177) at javax.mail.Transport.send0(Transport.java:195) at javax.mail.Transport.send(Transport.java:124) at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1411) ... 14 more Caused by: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/alternative; boundary="----=_Part_0_1284684208.1469102367572" at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:896) at javax.activation.DataHandler.writeTo(DataHandler.java:317) at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1485) at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1773) at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1121) ... 17 more
但是:
正如你在上面看到的,我在 Injector 构造函数中设置了它们
我没有更改 IDE/ClassPath 中的任何内容(只是 build.sbt 中的 sbt/package 版本)
我尝试了此处建议的所有方法 javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed; boundary 但没有结果。当前的线程上下文方法导致我出现安全异常
有解决办法吗?有没有一种(另一种)方法可以使用带有 Play 框架 2.5 的 java api 发送电子邮件?
更新 1:
根据jmehrens的建议,我激活了调试标志,这就是我得到的:
Can't load DCH com.sun.mail.handlers.multipart_mixed;
Exception: 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:
在这里您可以找到 getClass() 的 classloader,按照 jmehrens 的建议转储:s000.tinyupload.com/?file_id=51200633758480523188
这解决了问题:
CompletableFuture.runAsync( () -> {
Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );
mailerClient.send(email);}, Executors.newSingleThreadExecutor()).exceptionally(exc -> {
exc.printStackTrace();
return null;});
我最近按照本指南将我的应用程序从 play 2.3 迁移到 play 2.5 https://www.playframework.com/documentation/2.5.x/Migration25 我也根据此处指定的内容更新了 play-mailer https://github.com/playframework/play-mailer
现在我的应用程序无法再发送电子邮件。我创建了一个用于注入邮件程序实例的 Injector Constructor
@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);
}
我在异步任务中执行发送电子邮件方法:
CompletableFuture.runAsync( () -> mailerClient.send(email) ).exceptionally(exc -> {exc.printStackTrace(); return null;});
但我不断收到关于缺少 mimetype multipart 支持的错误:
... java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626) ... 5 more Caused by: javax.mail.MessagingException: IOException while sending message; nested exception is: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/alternative; boundary="----=_Part_0_1284684208.1469102367572" at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1177) at javax.mail.Transport.send0(Transport.java:195) at javax.mail.Transport.send(Transport.java:124) at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1411) ... 14 more Caused by: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/alternative; boundary="----=_Part_0_1284684208.1469102367572" at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:896) at javax.activation.DataHandler.writeTo(DataHandler.java:317) at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1485) at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1773) at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1121) ... 17 more
但是:
正如你在上面看到的,我在 Injector 构造函数中设置了它们
我没有更改 IDE/ClassPath 中的任何内容(只是 build.sbt 中的 sbt/package 版本)
我尝试了此处建议的所有方法 javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed; boundary 但没有结果。当前的线程上下文方法导致我出现安全异常
有解决办法吗?有没有一种(另一种)方法可以使用带有 Play 框架 2.5 的 java api 发送电子邮件?
更新 1:
根据jmehrens的建议,我激活了调试标志,这就是我得到的:
Can't load DCH com.sun.mail.handlers.multipart_mixed; Exception: 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:
在这里您可以找到 getClass() 的 classloader,按照 jmehrens 的建议转储:s000.tinyupload.com/?file_id=51200633758480523188
这解决了问题:
CompletableFuture.runAsync( () -> {
Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );
mailerClient.send(email);}, Executors.newSingleThreadExecutor()).exceptionally(exc -> {
exc.printStackTrace();
return null;});