编程语言
首页 > 编程语言> > java-在tomcat中已部署2个应用程序时出现邮件问题

java-在tomcat中已部署2个应用程序时出现邮件问题

作者:互联网

之前,我已经在Tomcat 6.0.24上部署了1个应用程序,并且运行良好.现在,我已经部署了AXIS Web服务,并且在发送邮件时第一个应用程序给出了错误消息.我正在使用Java6并通过mail-1.4.2.jar进行邮寄.

 Error message:
     javax.mail.MessagingException: IOException while sending message;
       nested exception is:
   javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed; 
         boundary="----=_Part_8_85998487.1343293259308"
         at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:779)
             at javax.mail.Transport.send0(Transport.java:191)
         at javax.mail.Transport.send(Transport.java:120)

另外,如果我从部署中删除该Web服务并尝试运行该应用程序,则它可以正常工作.另外,我也能收到邮件.此外,我想补充一点的是,如果我将Webservie部署在不同的tomcat上,则应用程序运行良好.仅当两者同时在同一台服务器上时,才出现问题.

解决方法:

这么晚才回复很抱歉.我能够找到问题背后的原因.
在Web服务中,我正在使用jaxws-rt-2.1.3.jar,其中有一个名为com.sun.xml.ws.encoding.MimeCodec的类.在MimeCodec中,有一个静态块.

static { 
     // DataHandler.writeTo() may search for DCH. So adding some default ones.
     try {
         CommandMap map = CommandMap.getDefaultCommandMap();
         if (map instanceof MailcapCommandMap) {
             MailcapCommandMap mailMap = (MailcapCommandMap) map;
             String hndlrStr = ";;x-java-content-handler=";
             mailMap.addMailcap(
                 "text/xml" + hndlrStr + XmlDataContentHandler.class.getName());
             mailMap.addMailcap(
                 "application/xml" + hndlrStr + XmlDataContentHandler.class.getName());
             mailMap.addMailcap(
                 "image/*" + hndlrStr + ImageDataContentHandler.class.getName());
             mailMap.addMailcap(
                 "text/plain" + hndlrStr + StringDataContentHandler.class.getName());
         }
     } catch (Throwable t) {
         // ignore the exception.
     }
 }

上面的静态块为DCH提供了一些默认的MIME类型,并且它是在WS启动时执行的.现在,在发送邮件之前,代码使用javax.activation,CommandMap(rt.jar / activation.jar)搜索MIME类型.在这种情况下,预期的mime类型加载已被覆盖.仅当MIME类型为以上4种之一时,该邮件才有效.

因此,每次发送邮件之前,我都使用以下代码将CommandMAp重置为预期的功能,并且邮件功能已开始正常运行而没有任何问题.

CommandMap.setDefaultCommandMap(new MailcapCommandMap());

另外,当我检查了较旧版本的jaxws-rt.jar(2.1.1)时,那里不存在静态块,但是其他某些类提供了相同的功能(对不起,我现在不记得这个名字了).

另外,在调试时,我注意到在javax.activation.MailcapCommandMap中,MIME类型是从以下位置加载的

System.getProperty("user.home") + File.separator + ".mailcap";

System.getProperty("java.home") + File.separator + "lib" + File.separator + "mailcap";

因此,如果我们在上述位置提供MIME类型,那么邮件也应该可以工作(我尚未对此进行测试).

标签:tomcat,javamail,web-services,java
来源: https://codeday.me/bug/20191101/1980632.html