tomcat6使用Jmail邮件无法定时发送邮件

作者:  最后修改:2013年10月29日  浏览数:234
       异常信息为:javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed;
       表现为手动点发送按钮,可以发送,而定时任务自动发送则报该异常,查中文资料:
 
      只要在调用// 发送邮件
       Transport.send(mailMessage);前加上如下代码就行!
 
// add handlers for main MIME types  
MailcapCommandMap mc = (MailcapCommandMap)CommandMap.getDefaultCommandMap();  
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("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");  
CommandMap.setDefaultCommandMap(mc);
 
       经测试,问题依旧;之后解析源码仔细研究后发现,是异常发生了改变,乃Can't load DCH com.sun.mail.handlers.multipart_mixed;  Exception: java.lang.ClassNotFoundException: com/sun/mail/handlers/multipart_mixed,打开mail.jar发现这个类是存在的,莫名其妙,久经折腾。
 
       查google,发现原来是tomcat6的bug。
 
       解决办法有三种:
       1)在调用发送方法之前加Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );
       2)将mail.jar设置为bootclasspath即在tomcat中加启动参数-Xbootclasspath/p:mail.jar,其中p:mail.jar为jar路径;
       3)将activation.jar和mail.jar两个jar包放入endorsed文件夹,使他们具有最高的优先级,设置系统参数,再设置tomcat启动参数,如:-Djava.endorsed.dirs="D:\apache-tomcat-6.0.20\endorsed"。
 
       原文:http://blog.hpxn.net/2009/12/02/tomcat-java-6-and-javamail-cant-load-dch/