Android 发送邮件异常:no object DCH for MIME type multipart/mixed

一、问题描述

维护一个Android项目,项目里集成有邮箱功能,gradle添加有:

implementation 'com.sun.mail:android-mail:1.5.6'
implementation 'com.sun.mail:android-activation:1.5.6'

邮箱的收件和发送功能是以前做好的,以往使用正常,然后某一次打出的android包发送邮件功能异常

发送邮件异常提示:

javax.mail.MessagingException: IOException while sending message;
      nested exception is:
        javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed; 
        boundary="----=_Part_0_21477863.1538926492305"
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1308)
        at com.cvte.cvtalk.email.m.g(SendMail.java:378)
        at com.cvte.cvtalk.email.m.a(SendMail.java:479)
        at com.cvte.cvtalk.services.aj.run(MailService.java:295)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:784)

接收的在加载邮件内容时也有一个错误:onError:java.lang.ClassCastException: javax.mail.util.SharedByteArrayInputStream cannot be cast to javax.mail.internet.MimeMultipart

奇怪的是Clean工程后打出的apk又正常了,本以为已经解决,但是一段时间后打出的apk包又出现这个情况;但是打出的安装包要么就是有问题,邮件功能使用不了;要么就是正常,不会出现开始正常使用一段时间又异常的情况。

二、分析问题

根据错误提示,找到方法,说是在发送邮件之前添加以下代码:

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");
CommandMap.setDefaultCommandMap(mc);
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());

似乎是跟使用的html格式有关;于是在发送邮件前添加,测试后发现发送邮件正常,但是接收邮件却还是存在问题,直接用收件箱刷新邮件还是加载不出邮件内容。

但是在成功发送一封邮件后,收件箱就能正常使用了,因此判断出以上代码对收件箱功能同样有影响,在未调用以上代码前使用功能邮箱功能都存在问题。

三、解决方法:

方案一、添加以下代码,但是需要在使用邮件功能前调用以下代码,如在onCreate()或者Application中初始化的时候添加

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");
CommandMap.setDefaultCommandMap(mc);
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());

方案二、

在集成配置邮件时,在build.gradle中会有下面一行代码

packagingOptions {
    //pickFirst 'META-INF/LICENSE.txt' // picks the JavaMail license file
}

注释掉该行重新打包也能恢复正常,不过这一行的作用不是很清楚,不知道注销会不会有其他影响。

当然在注销能够正常打包后,再取消注释打包也是正常的,但是这有点类似于Clean到的效果,未根本解决,不定什么时候又会复现。

猜你喜欢

转载自blog.csdn.net/xuwei7746521/article/details/82997040