有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法使用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

现在我的应用程序不再能够发送电子邮件。我为注入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); 
}

我在异步任务中执行send email方法:

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

但是:

  • 如上所示,我在喷油器构造函数中设置了它们

  • 我没有更改IDE/类路径中的任何内容(只是build.sbt中的sbt/包版本)

  • 我尝试了这里所有的建议,但没有结果。当前的线程上下文方法导致了一个安全异常

有解决办法吗?是否有(其他)方法使用Play framework 2.5的java api发送电子邮件

更新1:

根据jmehren的建议,我激活了debug标志,这就是我得到的:

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: 在这里,您可以找到从开始到异常s000的-verbose:class输出。tinyupload。com/?文件id=50323853839855936002

更新3

在这里,您可以找到按照jmehrens:s000的建议转储的getClass()类加载器。tinyupload。com/?文件id=51200633758480523188


共 (1) 个答案

  1. # 1 楼答案

    这解决了问题:

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