3

之前,我在 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 上,那么 applciation 朗姆酒就可以了。问题仅在于两者同时在同一台服务器上时。

4

1 回答 1

5

这么晚才回复很抱歉。我能够追踪问题背后的原因。在 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 类型,那么邮件也应该可以工作(我还没有测试过)。

于 2012-09-24T15:06:54.180 回答