最近有個項目,要發郵件給用戶設定的郵箱報警,然后就用了163郵箱,代碼是網上借來的^^,如下:
package com.smartdoorbell.util; import android.os.AsyncTask; import java.util.Date; import java.util.List; import java.util.Properties; import javax.activation.CommandMap; import javax.activation.MailcapCommandMap; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; /** * Created by zhangjie on 15/8/31. */ public class JEmailHelper { private int port = 25; // smtp協議使用的端口 private String host = "smtp.163.com"; // 發件人郵件服務器 private String user = "xxxxxxx@163.com"; // 使用者賬號 private String password = "xxxxxxx"; // 使用者密碼 private List<String> emailTos; private List<String> emailCCs; private String subject; private String body; private List<String> paths; enum SendStatus { SENDING, UNDO, SENDOK, SENDFAIL }; private SendStatus sendStatus; public interface JieEmailInfterface { void startSend(); void SendStatus(SendStatus sendStatus); } private JieEmailInfterface jieEmailInfterface; public void setJieEmailInfterface(JieEmailInfterface jieEmailInfterface) { this.jieEmailInfterface = jieEmailInfterface; } public JEmailHelper() { synchronized (JEmailHelper.class) { sendStatus = SendStatus.UNDO; } } // 構造發送郵件帳戶的服務器,端口,帳戶,密碼 public JEmailHelper(String host, int port, String user, String password) { synchronized (JEmailHelper.class) { this.port = port; this.user = user; this.password = password; this.host = host; sendStatus = SendStatus.UNDO; } } /** * @param emailTos * 主要接收人的電子郵箱列表 * @param emailCCs * 抄送人的電子郵箱列表 * @param subject * 郵件標題 * @param body * 正文內容 * @param paths * 發送的附件路徑集合 */ public void setParams(List<String> emailTos, List<String> emailCCs, String subject, String body, List<String> paths) { this.emailTos = emailTos; this.emailCCs = emailCCs; this.subject = subject; this.body = body; this.paths = paths; } public void sendEmail() { new JieAsynTask().execute(); } private void sendEmailBg() throws Exception { Properties properties = new Properties(); properties.put("mail.smtp.host", host); properties.put("mail.smtp.port", port); properties.put("mail.smtp.auth", "true");// true一定要加引號 properties.put("mail.transport.protocol", "smtp"); JieAuthenticator jieAuth = new JieAuthenticator(user, password); Session session = Session.getInstance(properties, jieAuth); // 創建一個消息 MimeMessage msg = new MimeMessage(session); // 設置發送人 msg.setFrom(new InternetAddress(user)); // 設置主要接收人 if (emailTos != null && !emailTos.isEmpty()) { int size = emailTos.size(); InternetAddress[] addresses = new InternetAddress[size]; for (int i = 0; i < size; i++) { addresses[i] = new InternetAddress(emailTos.get(i)); } msg.setRecipients(Message.RecipientType.TO, addresses); } // 設置抄送人的電子郵件 if (emailCCs != null && !emailCCs.isEmpty()) { int size = emailCCs.size(); InternetAddress[] addresses = new InternetAddress[size]; for (int i = 0; i < size; i++) { addresses[i] = new InternetAddress(emailCCs.get(i)); } msg.setRecipients(Message.RecipientType.CC, addresses); } msg.setSubject(subject); // 創建一個消息體 MimeBodyPart msgBodyPart = new MimeBodyPart(); msgBodyPart.setText(body); // 創建Multipart增加其他的parts Multipart mp = new MimeMultipart(); mp.addBodyPart(msgBodyPart); // 創建文件附件 if (paths!=null){ for (String path : paths) { if (path!=null){ MimeBodyPart fileBodyPart = new MimeBodyPart(); fileBodyPart.attachFile(path); mp.addBodyPart(fileBodyPart); } } } // 增加Multipart到消息體中 msg.setContent(mp); // 設置日期 msg.setSentDate(new Date()); // 設置附件格式 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); msg.saveChanges(); // 發送消息 Transport.send(msg); } class JieAuthenticator extends Authenticator { private String strUser; private String strPwd; public JieAuthenticator(String user, String password) { this.strUser = user; this.strPwd = password; } protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(strUser, strPwd); } } class JieAsynTask extends AsyncTask<Void, Void, SendStatus> { @Override protected void onPreExecute() { super.onPreExecute(); if (jieEmailInfterface != null) { jieEmailInfterface.startSend(); } } @Override protected void onPostExecute(SendStatus result) { super.onPostExecute(result); if (jieEmailInfterface != null) { jieEmailInfterface.SendStatus(result); } sendStatus = SendStatus.UNDO; } @Override protected SendStatus doInBackground(Void... params) { try { sendStatus = SendStatus.SENDING; sendEmailBg(); sendStatus = SendStatus.SENDOK; } catch (Exception e) { e.printStackTrace(); sendStatus = SendStatus.SENDFAIL; } return sendStatus; } } }
然后,隨便輸入了個標題和內容測試,沒有問題。於是,把報警信息整理好,寫入標題和內容,杯具的事情發生了,一直無法發送成功,返回錯誤信息如下:
com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp11,D8CowACnIsnYuENXzwhNBw--.59036S2 1464056024,please see http://mail.163.com/help/help_spam_16.htm?ip=121.34.169.53&hostid=smtp11&time=1464056024
去http://mail.163.com/help/help_spam_16.htm?ip=121.34.169.53&hostid=smtp11&time=1464056024這個網址一看,是被作為垃圾郵件了!@ !
開始了換主題、換內容,換了N次后,才終於不被認為是垃圾郵件了,坑爹的,最啃爹的是,換了N都詞語后都不行后,把“:”(漢語輸入法)換成“:”(英文輸入法),好了,這是什么規則?!!!
ps:上面的代碼需要添加activation.jar、additionnal.jar、mail.jar,可以自行百度下載。