我知道在此之前已经问过很多类似的问题,但是我认为这个问题有些不同:)
我正在编写一个maven报告插件,它将向用户列表发送电子邮件。我现在遇到的问题是,当我使用java5运行该代码时,该代码似乎运行良好,但使用java6失败。实际上,该插件是用Groovy编写的,并使用commons-email实用程序发送html消息:
HtmlEmail email = new HtmlEmail(); email.setHostName(mailhost); email.setSmtpPort(mailport); email.setFrom(args.from); email.addTo(args.receiver); email.setSubject(args.subject); email.setHtmlMsg(args.htmlmessage); email.setDebug(log.isDebugEnabled()); email.send();
该项目依赖于javax.mail:mail:1.4.1和javax.activation:activation:1.1.1。
如果我使用新插件运行Maven项目,则Java6会出现此异常:
javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed; boundary="----=_Part_0_11139111.1262007863993" at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:676) at javax.mail.Transport.send0(Transport.java:189)
使用java5,我没有任何问题。
我尝试了以下解决方法:
以编程方式添加mailcap配置:
// add handlers for main mail MIME types MailcapCommandMap mc = (MailcapCommandMap)CommandMap.getDefaultCommandMap(); mc.getMimeTypes().each{ println "Original MIME-TYPE: $it" } mc.getAllCommands ("multipart/mixed").each { println "Original COMMAND: $it" } 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("multipart/mixed;; 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); MailcapCommandMap mc2 = (MailcapCommandMap)CommandMap.getDefaultCommandMap(); mc2.getMimeTypes().each{ println "Replaced MIME-TYPE: $it" } mc2.getAllCommands ("multipart/mixed").each { println "Replaced COMMAND: $it" }
这也不适用于java6,但实际上表明请求的mimetype未在mailcap中注册(请参阅带有“ println”日志语句的循环)。
Original MIME-TYPE: image/jpeg Original MIME-TYPE: image/gif Original MIME-TYPE: text/* Replaced MIME-TYPE: message/rfc822 Replaced MIME-TYPE: multipart/* Replaced MIME-TYPE: text/plain Replaced MIME-TYPE: text/xml Replaced MIME-TYPE: multipart/mixed Replaced MIME-TYPE: text/html Replaced MIME-TYPE: image/jpeg Replaced MIME-TYPE: image/gif Replaced MIME-TYPE: text/* Replaced COMMAND: javax.activation.CommandInfo@1e5d007 Replaced COMMAND: javax.activation.CommandInfo@bc8f01
我创建了一个名为“ mailcap”的文件,并将其放置在插件的“ META-INF”目录中(请参阅http://java.sun.com/j2ee/1.4/docs/api/javax/activation/MailcapCommandMap.html) 。但这一点都没有得到解决。
所以我的问题是,是否有人对如何在java5和java6上工作的代码/配置有所了解:)
首先检查以确保没有mail.jar,smtp.jar(旧)或activation.jar的其他副本。(最后一个可能性最大,因为您可能捆绑了activation.jar,因为JDK 1.5中未包含该文件)。
如果这不起作用,或者由于运行插件的环境导致您无法控制它,请在创建邮件实例之前尝试将上下文类加载器显式设置为系统类加载器。