我知道类似的问题以前已经被问过很多次了,但我认为这个问题略有不同:)

我正在编写一个 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我没有任何问题。

我尝试了以下解决方法:

  1. 以编程方式添加 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
    
  2. 我创建了一个名为“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 中)。

如果这不起作用,或者由于运行插件的环境而无法控制,请尝试在创建邮件实例之前将上下文类加载器显式设置为系统类加载器。

参考资料(页末): http://old.nabble.com/javax.activation.UnsupportedDataTypeException:-no-object-DCH-for-MIME-type-multipart-mixed-td12523671.html.

其他提示

现在也可以通过将 java 升级到最新的 1.6.0.x 来修复此问题。我不确定这个问题是什么时候解决的,但是从 x=6 到 x=27 为我解决了这个问题。

对于那些在 Web 应用程序中工作并遇到此错误的人,将其放入startupservlet 的 service() 中可以解决该问题。

Thread.currentThread().setContextClassLoader( getClass().getClassLoader() ) 。谢谢马克。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top