1. 程式人生 > >Android 傳送郵件異常:no object DCH for MIME type multipart/mixed

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到的效果,未根本解決,不定什麼時候又會復現。