1. 程式人生 > >Android 使用javamail傳送郵件

Android 使用javamail傳送郵件

專案需要activation.jar,additionnal.jar,mail.jar 下載三個包

編寫郵件傳送步驟:

  1. 設定伺服器
  2. 新增郵箱認證
  3. 設定認證的Session(重要)
  4. 根據Session獲取郵件物件(MimeMessage)
  5. 郵件物件的填充(發件人,收件人,標題,內容和附件)
  6. 郵件的傳送

編寫程式碼如下:

/*傳送郵件的主要程式碼*/

Properties properties = System.getProperties();//獲取系統屬性
properties.put("mail.smtp.host", "smtp.sina.com");//郵箱對於的伺服器
properties.put("mail.smtp.auth", "true");//設定需要使用者名稱和密碼(客戶端授權碼)認證
Session session = Session.getDefaultInstance(properties,new Authenticator(){//認證Session
     @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password); //發件人郵件使用者名稱、密碼(客戶端授權碼)
    }
});
session.setDebug(true);//Log輸出,方便除錯
MimeMessage message = new MimeMessage(session);//根據Session獲得郵件物件
try {
    message.setFrom(new InternetAddress(from_email));//添加發件人
    message.addRecipient(Message.RecipientType.TO,new InternetAddress(to_email));//新增收件人
    message.setSubject("This is the Subject Line!");//標題
    Multipart multipart = new MimeMultipart();//可以帶附件訊息物件
    BodyPart messageBodyPart = new MimeBodyPart();//文字訊息部分
    messageBodyPart.setText("This is message body");
    multipart.addBodyPart(messageBodyPart);//新增文字訊息
    for (int i=0;i<fileList.size();i++) {//fileList是List<File>
        BodyPart fileBodyPart = new MimeBodyPart();//附件部分
        DataSource source = new FileDataSource(fileList.get(i));
        fileBodyPart.setDataHandler(new DataHandler(source));
        fileBodyPart.setFileName(fileList.get(i).getName());
        multipart.addBodyPart(fileBodyPart);//新增附件訊息
    }
    message.setContent(multipart);//填充訊息
    //解決javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed;
    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());
    
    Transport transport = session.getTransport("smtp");
    transport.addTransportListener(new TransportAdapter() {//郵件傳送監聽
        @Override
        public void messageDelivered(TransportEvent e) {
            super.messageDelivered(e);
            Log.e("監聽郵件傳送","郵件傳送成功....");
        }

        @Override
        public void messageNotDelivered(TransportEvent e) {
            super.messageNotDelivered(e);
            Log.e("監聽郵件傳送","郵件傳送失敗....");
        }

        @Override
        public void messagePartiallyDelivered(TransportEvent e) {
            super.messagePartiallyDelivered(e);
            Log.e("監聽郵件傳送","郵件傳送部分成功....");
        }
    });
    transport.connect();
    transport.sendMessage(message, message.getAllRecipients());
    transport.close();
} catch (MessagingException e) {
    e.printStackTrace();
}

測試郵箱:163郵箱、qq郵箱、139郵箱、sohu郵箱、126郵箱、tom郵箱、新浪郵箱、outlook郵箱、aliyun郵箱

  • aliyun郵箱傳送郵件都被系統退回(個人無解)
  • 163郵箱傳送郵件基本都有遇到com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 問題(個人無解)
  • Log輸出提示傳送成功,但是收件人郵箱沒有收到(郵件被退回或收件人郵箱不存在)
  • 傳送成功,收件箱看不到(在垃圾箱)
  • outlook郵箱註冊但未驗證發郵件會被系統攔截

163郵箱,遇到問題:

1、com.sun.mail.smtp.SMTPSenderFailedException: 550 User has no permission

//設定客戶端授權碼並開啟POP3/SMTP/IMAP

2、com.sun.mail.smtp.SMTPSendFailedException: 553 authentication is required

//新增
properties.put("mail.smtp.auth", "true");(設定完沒有新增使用者名稱和授權碼會遇到下面一個問題)

3、javax.mail.AuthenticationFailedException: failed to connect, no password specified?

//設定
session = Session.getInstance(email.properties,new Authenticator(){
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        //發件人郵件使用者名稱、授權碼
        return new PasswordAuthentication(userName, password);
    }
});

4、javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed

//傳送Multipart訊息前新增
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());
Transport.send(message);//傳送訊息

5、java.io.IOException: javax.mail.MessagingException: Empty multipart: multipart/mixed

//新增內容或附件
multipart.addBodyPart(new MimeBodyPart());//自己設定MimeBodyPart
//•554 DT:SPM 傳送的郵件內容包含了未被許可的資訊,或被系統識別為垃圾郵件。請檢查是否有使用者傳送病毒或者垃圾郵件;
//呵呵
//我試了2個qq郵箱,都是這情況。換了個139郵箱,就傳送成功了。之後再試其他郵箱(包括139)一直被系統識別為垃圾郵件

qq郵箱,遇到問題(已經設定客戶端授權碼並開啟POP3/SMTP/IMAP)

1、com.sun.mail.smtp.SMTPSendFailedException: 503 Error: need EHLO and AUTH first !

//新增
properties.put("mail.smtp.auth", "true");
//設定
session = Session.getInstance(email.properties,new Authenticator(){
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        //發件人郵件使用者名稱、授權碼
        return new PasswordAuthentication(userName, password);
    }
});

2、javax.mail.NoSuchProviderException: Invalid protocol: null(設定addTransportListener監聽郵件傳送狀況時出現)

//設定
Transport transport = session.getTransport("smtp");

搜狐郵箱,遇到問題

1、javax.mail.AuthenticationFailedException: 535 5.7.0 smtp is disabled

//開啟POP3/SMTP/IMAP

126郵箱,遇到問題

1、javax.mail.AuthenticationFailedException: 550 Óû§ÎÞȨµÇ½

//開啟POP3/SMTP/IMAP,並設定客戶端授權碼

2、javax.mail.AuthenticationFailedException: 535 Error: authentication failed

//認證的使用者名稱或客戶授權碼輸入錯誤

新浪郵箱,遇到問題

1、javax.mail.AuthenticationFailedException: 535 5.7.12 SMTP access disabled

//客戶端pop/imap/smtp,設定服務開啟

outlook郵箱,遇到問題

1、com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM [HK0PR01CA0005.apcprd01.prod.exchangelabs.com] 

properties.put("mail.smtp.starttls.enable","true");

2、com.sun.mail.smtp.SMTPSendFailedException: 554 5.2.0 STOREDRV.Submission.Exception:OutboundSpamException; Failed to process message due to a permanent exception with message WASCL UserAction verdict is not None. Actual verdict is HipSend, ShowTierUpgrade. OutboundSpamException: WASCL UserAction verdict is not None.

//發件人郵箱未驗證,被認為垃圾郵件傳送者(驗證後就可以了)