javax.activation.UnsupportedDataTypeException:没有MIME类型multipart / mixed的对象DCH; 边界

目前我正在编写一个将要监听目录的代码。 当使用.apk文件更新目录时,我会将带有此.apk文件的邮件发送到gmail帐户。 我在我的程序中使用Jnotify和JAVA Mail。

我得到的错误是,

javax.mail.MessagingException: IOException while sending message; nested exception is: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed; boundary="----=_Part_0_145238.1392728439484" 

我在stackoverflow中寻找帮助的解决方案,但没有一个有用。

提前致谢

 public void fileCreated(int wd, String rootPath, String name) { print("created " + rootPath + " : " + name); if (name.contains(".apk")) SendEmail(name); else System.out.println("Not the APK file"); } void SendEmail(String strname){ String Path = "D:/POC/Email/apk folder/"+strname; System.out.println("Path->" + Path); Properties props = new Properties(); props.put("mail.smtp.host","173.194.78.108"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.auth","true"); props.put("mail.smtp.port","465"); System.out.println("Properties has been set properly"); Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator(){ protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication("SenderEmailID@gmail.com", "senderPassword"); } } ); System.out.println("Session Created successfully"); try{ Message message = new MimeMessage(session); message.setFrom(new InternetAddress("SenderEmailID@gmail.com")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("ToReceiverEmailID@gmail.com")); message.setSubject("Android : " + strname); MimeBodyPart msgbody = new MimeBodyPart(); msgbody.setText("This is the message content which is sent using JAVA MAIL 1.4.5"); Multipart mulpart = new MimeMultipart(); mulpart.addBodyPart(msgbody); //Attachement Starts here. msgbody = new MimeBodyPart(); javax.activation.DataSource source = new FileDataSource(Path); msgbody.setDataHandler(new DataHandler(source)); msgbody.setFileName(strname); message.setContent(mulpart); System.out.println("Attached the message going to start transporting the mail"); //If I've the code before sending the email is getting sent but without attachment. //Thread.currentThread().setContextClassLoader( getClass().getClassLoader() ); Transport.send(message); System.out.println("Mail Sent successfully"); } catch(MessagingException msg){ msg.printStackTrace(); } catch(Exception e){ e.printStackTrace(); } } 

JavaMail依赖于一些配置文件来将MIME类型映射到Java类(例如, multipart/mixedjavax.mail.internet.MimeMultipart )。 使用应用程序的ClassLoader加载这些配置文件。 如果ClassLoader无法正常运行,则找不到这些配置文件。

您可以简单地添加以下行…解决问题。

 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"); 

通过以下两个步骤可以解决此问题。

  1. 确保java邮件是1.4.7。(Previosly我使用1.4.5导致所有混淆)。 从http://www.oracle.com/technetwork/java/index-138643.html下载
  2. 在发送消息之前添加这段代码,Thread.currentThread()。setContextClassLoader(getClass()。getClassLoader());

在发送电子邮件之前添加当前线程是解决方案:

 Thread.currentThread().setContextClassLoader( getClass().getClassLoader() ); 

我正忙着将Java 8项目转换为Java 10.同时我一直在更新所有依赖项。 我得到了一个类似的例外,上述解决方案都没有为我工作。

我的pom.xml中有以下内容:

  com.sun.mail javax.mail 1.6.1  

我做了一些研究,发现以下链接:

http://www.jguru.com/faq/view.jsp?EID=237257

所以我尝试将以下依赖项添加到我的pom.xml:

  javax.activation activation 1.1.1  

这解决了问题,我能够再次发送带附件的邮件。

如果它是一个android项目,那么proguard很可能错误地删除了未使用的类,请在proguard文件中添加以下行来修复问题而不直接修改代码:

 -keep class com.sun.mail.handlers.** -dontwarn com.sun.mail.handlers.handler_base 

告诉我有关运行代码的环境的更多信息。 您使用的JDK是什么? 你在应用服务器上运行吗?

JavaBeans Activation Framework(JAF)查找配置文件,该文件告诉如何将MIME类型映射到处理它们的Java类(DataContentHandlers)。 它使用ClassLoader查找配置文件。 如果ClassLoader出现问题,则可能找不到配置文件。

您可能想尝试此处描述的解决方法,但当然最好为您确定问题的根本原因。

最后,您可能希望通过修复一些常见的JavaMail错误来简化您的程序。

如果您的build.xml执行此操作:zipfileset src =“javamail-1.4.7 / mail.jar” excludes =“META-INF / ”**

然后你要剥离配置信息。

Som的回答( MailcapCommandMap )为Liferay 7.1 ga1中的Spring war Portlets工作。 但是,我不得不从tomcat/lib/ext删除Tomcat的mail.jar并将其替换为javax.mail-1.6.2.jar ,然后确保依赖项的范围是项目的pom.xml中提供的:

  com.sun.mail javax.mail 1.6.2 provided