发送多部分消息时出现 Javamail ClassCastException
Javamail ClassCastException when sending multipart messages
我在尝试发送多部分消息时遇到以下异常:
java.lang.ClassCastException: com.sun.xml.internal.ws.encoding.StringDataContentHandler cannot be cast to javax.activation.DataContentHandler
at javax.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:609)
at javax.activation.MailcapCommandMap.createDataContentHandler(MailcapCommandMap.java:563)
at javax.activation.DataHandler.getDataContentHandler(DataHandler.java:625)
at javax.activation.DataHandler.writeTo(DataHandler.java:329)
at javax.mail.internet.MimeUtility.getEncoding(MimeUtility.java:268)
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1366)
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1021)
at javax.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:419)
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1345)
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1021)
at javax.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:419)
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1345)
at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2106)
at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2074)
at com.ex.notificationservice.email.MailSender.send(MailSender.java:324)
MailSender.send 方法的代码:
MimeMessage message = new MimeMessage(session);
message.setSubject(subject);
message.setFrom(new InternetAddress(fromAddr));
if (toAddrs != null) {
for (String toAddr : toAddrs) {
if (isEmpty(toAddr) == false) {
message.addRecipient(Message.RecipientType.TO, new InternetAddress(toAddr));
}
}
} else {
throw new MessagingException("MailSender: Destination address(es) not specified.");
}
Multipart multipart = new MimeMultipart("mixed");
MimeBodyPart mbp1 = new MimeBodyPart();
Multipart alternativeMultipart = new MimeMultipart("alternative");
MimeBodyPart textBodyPart = null;
MimeBodyPart htmlBodyPart = null;
MimeBodyPart xmlBodyPart = null;
if (isEmpty(textContent) == false) {
textBodyPart = new MimeBodyPart();
textBodyPart.setText(textContent);
alternativeMultipart.addBodyPart(textBodyPart);
}
if (isEmpty(htmlContent) == false) {
htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setContent(htmlContent, "text/html; charset=utf-8");
alternativeMultipart.addBodyPart(htmlBodyPart);
}
if (isEmpty(xmlContent) == false) {
xmlBodyPart = new MimeBodyPart();
xmlBodyPart.setContent(xmlContent, "text/xml; charset=utf-8");
alternativeMultipart.addBodyPart(xmlBodyPart);
}
mbp1.setContent(alternativeMultipart);
multipart.addBodyPart(mbp1);
if (files != null) {
for (File file : files) {
MimeBodyPart mimeBodyPart = new MimeBodyPart();
mimeBodyPart.attachFile(file);
multipart.addBodyPart(mimeBodyPart);
}
}
message.setContent(multipart);
message.setSentDate(new Date());
//Exception occurs here
message.saveChanges();
Transport.send(message);
通常它会在启动服务器后一段时间正常工作并按预期发送电子邮件。使用 Jax-WS 调用不相关的网络服务似乎会引发问题。
我的理解是这个异常是典型的类加载器问题,尽管我的项目中没有任何库包含异常中显示的包。
是否有可能另一个类加载器正在启动或运行时加载其中一个 类?我看到 JBoss 有一个 javax.activation.api 模块,但是有太多其他模块依赖它,无法使用 jboss-deployment-structure.xml.
排除它
我正在使用 JDK 1.7,JBoss 7.0.2,Java 邮件 1.4.4。
在 JavaMail 和 JAX-WS 的交互中有一个 bug。 JDK 的最新版本包含针对此错误的修复。升级到 JDK 1.8,或 JDK 1.7.
的最新版本
解决方法可能是在 JAX-WS 初始化后执行此操作:
MailcapCommandMap mailMap = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mailMap.addMailcap("multipart/mixed;;x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
如果需要处理多部分消息,这可能会导致 JAX-WS 失败。
我在尝试发送多部分消息时遇到以下异常:
java.lang.ClassCastException: com.sun.xml.internal.ws.encoding.StringDataContentHandler cannot be cast to javax.activation.DataContentHandler
at javax.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:609)
at javax.activation.MailcapCommandMap.createDataContentHandler(MailcapCommandMap.java:563)
at javax.activation.DataHandler.getDataContentHandler(DataHandler.java:625)
at javax.activation.DataHandler.writeTo(DataHandler.java:329)
at javax.mail.internet.MimeUtility.getEncoding(MimeUtility.java:268)
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1366)
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1021)
at javax.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:419)
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1345)
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1021)
at javax.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:419)
at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1345)
at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2106)
at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2074)
at com.ex.notificationservice.email.MailSender.send(MailSender.java:324)
MailSender.send 方法的代码:
MimeMessage message = new MimeMessage(session);
message.setSubject(subject);
message.setFrom(new InternetAddress(fromAddr));
if (toAddrs != null) {
for (String toAddr : toAddrs) {
if (isEmpty(toAddr) == false) {
message.addRecipient(Message.RecipientType.TO, new InternetAddress(toAddr));
}
}
} else {
throw new MessagingException("MailSender: Destination address(es) not specified.");
}
Multipart multipart = new MimeMultipart("mixed");
MimeBodyPart mbp1 = new MimeBodyPart();
Multipart alternativeMultipart = new MimeMultipart("alternative");
MimeBodyPart textBodyPart = null;
MimeBodyPart htmlBodyPart = null;
MimeBodyPart xmlBodyPart = null;
if (isEmpty(textContent) == false) {
textBodyPart = new MimeBodyPart();
textBodyPart.setText(textContent);
alternativeMultipart.addBodyPart(textBodyPart);
}
if (isEmpty(htmlContent) == false) {
htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setContent(htmlContent, "text/html; charset=utf-8");
alternativeMultipart.addBodyPart(htmlBodyPart);
}
if (isEmpty(xmlContent) == false) {
xmlBodyPart = new MimeBodyPart();
xmlBodyPart.setContent(xmlContent, "text/xml; charset=utf-8");
alternativeMultipart.addBodyPart(xmlBodyPart);
}
mbp1.setContent(alternativeMultipart);
multipart.addBodyPart(mbp1);
if (files != null) {
for (File file : files) {
MimeBodyPart mimeBodyPart = new MimeBodyPart();
mimeBodyPart.attachFile(file);
multipart.addBodyPart(mimeBodyPart);
}
}
message.setContent(multipart);
message.setSentDate(new Date());
//Exception occurs here
message.saveChanges();
Transport.send(message);
通常它会在启动服务器后一段时间正常工作并按预期发送电子邮件。使用 Jax-WS 调用不相关的网络服务似乎会引发问题。
我的理解是这个异常是典型的类加载器问题,尽管我的项目中没有任何库包含异常中显示的包。
是否有可能另一个类加载器正在启动或运行时加载其中一个 类?我看到 JBoss 有一个 javax.activation.api 模块,但是有太多其他模块依赖它,无法使用 jboss-deployment-structure.xml.
排除它我正在使用 JDK 1.7,JBoss 7.0.2,Java 邮件 1.4.4。
在 JavaMail 和 JAX-WS 的交互中有一个 bug。 JDK 的最新版本包含针对此错误的修复。升级到 JDK 1.8,或 JDK 1.7.
的最新版本解决方法可能是在 JAX-WS 初始化后执行此操作:
MailcapCommandMap mailMap = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mailMap.addMailcap("multipart/mixed;;x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
如果需要处理多部分消息,这可能会导致 JAX-WS 失败。