从java 5和java 6发送邮件

时间:2009-12-28 14:18:40

标签: maven-2 groovy maven-plugin java-6 java-5

我知道有很多次问过类似的问题,但我觉得这个问题差别很大:)

我正在编写一个maven报告插件,它会将电子邮件发送到用户列表。我现在遇到的问题是,当我用java5运行它时,代码似乎运行正常,但是与java6一起使用。 Actualy插件在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)。但这根本不会被接受。

  3. 所以我的问题是,是否有人知道我如何使用java5和java6处理代码/配置:)

3 个答案:

答案 0 :(得分:2)

首先检查以确保有其他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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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