Maven 2 从java5和java6发送邮件

Maven 2 从java5和java6发送邮件,maven-2,groovy,maven-plugin,java-6,java-5,Maven 2,Groovy,Maven Plugin,Java 6,Java 5,我知道类似的问题以前也被问过很多次,但我认为这一次完全不同:) 我正在编写一个maven report插件,它将向用户列表发送电子邮件。我现在遇到了一个问题,当我用java5运行代码时,代码似乎运行良好,但用java6运行失败。 实际上,该插件是用Groovy编写的,并使用commons电子邮件实用程序发送html消息: HtmlEmail email = new HtmlEmail(); email.setHostName(mailhost); email.setSmtpPort(mailpo

我知道类似的问题以前也被问过很多次,但我认为这一次完全不同:)

我正在编写一个maven report插件,它将向用户列表发送电子邮件。我现在遇到了一个问题,当我用java5运行代码时,代码似乎运行良好,但用java6运行失败。 实际上,该插件是用Groovy编写的,并使用commons电子邮件实用程序发送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

如果我使用我的新插件运行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”日志语句的循环)

  • 我创建了一个名为“mailcap”的文件,并将其放在插件的“META-INF”目录中(请参阅)。但这一点也没有得到重视


  • 所以我的问题是,是否有人知道我是如何让代码/配置在java5和java6上工作的:)

    首先检查一下,确保mail.jar、smtp.jar(旧版)或activation.jar没有其他副本。(最后一个最有可能,因为您可能已经绑定了activation.jar,因为它没有包含在JDK1.5中)

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


    参考(页末):

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

    对于那些在Web应用程序中工作并出现此错误的人,将其放入startupservlet的服务()中可以修复此问题


    Thread.currentThread().setContextClassLoader(getClass().getClassLoader())。谢谢Marc。

    一个常见的情况是以某种方式使用javax.mail的geronimo实现,这是有缺陷的。谢谢!我实际上在以下位置找到了完整答案:ans能够通过调用以下命令来解决问题:Thread.currentThread().setContextClassLoader(getClass().getClassLoader())
    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