2009-12-28 46 views
1

我知道類似的問題發送郵件已經被問了很多次befor,但我認爲這一個slitly不同:)從Java5中和的Java6

我正在寫一個Maven插件報告將發送電子郵件到列表用戶。我現在有這個問題,當我使用java5運行代碼時,代碼似乎工作正常,但與java6一起失敗。 Actualy該插件在Groovy writen,並使用公共電子郵件工具來發送一個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:郵箱:1.4.1和javax.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工作,但它確實表明,所請求的MIME類型未被登記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: [email protected] 
    Replaced COMMAND: [email protected] 
    
  2. 我創建了一個名爲 'mailcap的' 文件並把它放在插件的 'META-INF' 目錄(見http://java.sun.com/j2ee/1.4/docs/api/javax/activation/MailcapCommandMap.html)。但是這根本沒有得到迴應。

所以我的問題是,是否有人對我如何獲取代碼/配置上Java5的和的Java6 :)

回答

2

首先檢查工作的任何想法,以確保有郵件沒有其他副本.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

一個常見的情況是以某種方式擁有javax.mail的geronimo實現,這是buggy。 – Bozho 2009-12-28 15:35:57

+4

感謝您的支持!我真的發現fullanswer在:http://blog.hpxn。net/2009/12/02/tomcat-java-6-and-javamail -cant-load-dch/ ans通過調用以下代碼可以解決此問題: Thread.currentThread().setContextClassLoader(getClass())。 getClassLoader()) – domi 2009-12-28 17:52:12

+0

啊,最優秀的 – 2009-12-29 05:18:34

1

現在可以通過將java升級到最新的1.6.0.x來解決這個問題。 我不知道什麼時候這是固定的,但從x = 6到x = 27固定這個給我。

0

對於那些在Web應用程序中工作併發生此錯誤的人,將其放入您的startupservlet的service()中可解決此問題。 ()。setContextClassLoader(getClass()。getClassLoader())。ThreadCurrentThread()。setContextClassLoader()。getClassLoader())。謝謝馬克。