【问题标题】:Issue with the mail when 2 applications that has been deployed in tomcat在tomcat中部署了2个应用程序时出现邮件问题
【发布时间】:2012-07-25 04:20:47
【问题描述】:

之前,我在 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 朗姆酒就可以了。只有当两者同时在同一台服务器上时才会出现问题。

【问题讨论】:

  • 您是否有任何“共享”JAR 文件,例如 activation.jarjavamail.jar,它们不是 only 在 webapp 的 WEB-INF/lib 目录中的吗?您是如何获得您的 JavaMail SessionTransport 对象的?
  • 没有。库activation.jar 和javamail.jar 仅在应用程序中使用,而不在服务中使用。我正在使用 getDefaultInstance 获取会话对象,我直接调用 Transport.send(MimeMessageObject)。

标签: java web-services tomcat jakarta-mail


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多