1. 程式人生 > >Java.Mail 傳送郵件工具類

Java.Mail 傳送郵件工具類

1.首先確保傳送人的郵箱  跟  接收人的郵箱  的smtp協議開著.   ------》可以上郵箱設定裡面開啟.

這裡使用的QQ郵箱   我們可以在郵箱幫助中找到QQ郵箱的pop3跟smtp伺服器地址已經開放的相應埠 一般是465,或者是587

2.極其重要一點:現在很多郵箱都採用授權碼的方式對第三方開放 pop3跟smtp服務   ,所以我們在用郵箱賬戶密碼登入郵箱時,記得要把密碼換成相應的  授權碼.

   (需要我們手機去發簡訊驗證的)

3.我們測試傳送的郵件內容有可能被郵件伺服器當成是垃圾郵件攔截掉,這裡我們需要設定下.將其加入到郵件的白名單中,可避開反垃圾誤判

4.針對傳送失敗的錯誤,我們可以仔細分析出錯的code碼,上網查詢對應的錯誤碼資訊,找到錯誤的原因.

   這裡針對傳送郵箱是網易來說:

http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html   

package com.eedu.diagnosis.common.utils;

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.Properties;

import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Address; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.Message.RecipientType; import javax.mail.MessagingException; 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; import javax.mail.internet.MimeUtility;

import org.apache.commons.lang3.StringUtils; 

/**  * 使用SMTP協議傳送電子郵件  */  public class SendEmailUtils {           // 郵件傳送協議       private final static String PROTOCOL = "smtp";           // SMTP郵件伺服器       private final static String HOST = "smtp.qiye.aliyun.com";           // SMTP郵件伺服器預設埠       private final static String PORT = "25";           // 是否要求身份認證       private final static String IS_AUTH = "true";           // 是否啟用除錯模式(啟用除錯模式可列印客戶端與伺服器互動過程時一問一答的響應訊息)       private final static String IS_ENABLED_DEBUG_MOD = "true";            //發件人郵箱授權碼     private final static String AUTHORIZATION_CODE = "E-eduspace.com";           // 發件人       private static String from = "[email protected]";           // 收件人       private static String to = "";           // 初始化連線郵件伺服器的會話資訊       private static Properties props = null;           static {           props = new Properties();           props.setProperty("mail.transport.protocol", PROTOCOL);  // 使用的協議(JavaMail規範要求)         props.setProperty("mail.smtp.host", HOST);  // 發件人的郵箱的 SMTP 伺服器地址         props.setProperty("mail.smtp.port", PORT);           props.setProperty("mail.smtp.auth", IS_AUTH);  // 需要請求認證         props.setProperty("mail.debug",IS_ENABLED_DEBUG_MOD);       }           public static void main(String[] args) throws Exception {         sendEmail(null,"北京市西城區2017-2018學年度(高三)第一學期期末考試","成功",3,null);//哪一場考試   哪一科     }         /**      * 傳送郵件      */       public static boolean sendEmail(String receiveEmail,String diagnosisName,String reslutMessage,Integer subjectNum,String failCase) throws Exception {           try {             String subject = subject(subjectNum);             if(StringUtils.isNotBlank(receiveEmail)) receiveEmail="[email protected]";             String charset = "utf-8";              // 建立Session例項物件               Session session = Session.getDefaultInstance(props);               // 建立MimeMessage例項物件               MimeMessage message = new MimeMessage(session);               // 設定主題               message.setSubject("上傳的Excel表格生成報告");               // 設定傳送人               message.setFrom(new InternetAddress(from,"北京易教空間",charset));               // 設定收件人               message.setRecipient(RecipientType.TO, new InternetAddress(receiveEmail));             // 設定抄送               message.setRecipients(RecipientType.CC,                       new Address[] {                                // 引數1:郵箱地址,引數2:姓名(在客戶端收件只顯示姓名,而不顯示郵件地址),引數3:姓名中文字串編碼                                new InternetAddress("[email protected]","wangkeqing",charset),                              new InternetAddress("[email protected]", "liyajun", charset),                            }                                           );               // 設定密送               message.setRecipient(RecipientType.BCC, new InternetAddress("[email protected]"));               // 設定傳送時間               message.setSentDate(new Date());               // 設定回覆人(收件人回覆此郵件時,預設收件人)               //message.setReplyTo(InternetAddress.parse("\"" + MimeUtility.encodeText("茄子") + "\" <[email protected]>"));               // 設定優先順序(1:緊急   3:普通    5:低)               message.setHeader("X-Priority", "1");               // 要求閱讀回執(收件人閱讀郵件時會提示回覆發件人,表明郵件已收到,並已閱讀)               // message.setHeader("Disposition-Notification-To", from);             if(StringUtils.isBlank(failCase)) {             //上傳excel表哥成功時                 // 設定html內容為郵件正文,指定MIME型別為text/html型別,並指定字元編碼為gbk               message.setContent("<div style='width: 600px;margin: 0 auto'><h3 style='color:#003E64; text-align:center; '>上傳Excel 表格生成報告"                     + "</h3><p style=''>尊敬的使用者您好:</p><p style='text-indent: 2em'>您上傳的==="+diagnosisName+"==="+subject+"學科"+"===Excel表格生成報告       :"+reslutMessage                             + "</p><p style='text-align: right; color:#003E64; font-size: 20px;'>北京易教空間</p></div>","text/html;charset=utf-8");               }else {             //上傳excel表格失敗時             message.setContent("<div style='width: 600px;margin: 0 auto'><h3 style='color:#003E64; text-align:center; '>上傳Excel 表格生成報告"                         + "</h3><p style=''>尊敬的使用者您好:</p><p style='text-indent: 2em'>您上傳的==="+diagnosisName+"==="+subject+"學科"+"===Excel表格生成報告       :"+reslutMessage                         +"===失敗原因是          :"+failCase+ "</p><p style='text-align: right; color:#003E64; font-size: 20px;'>北京易教空間</p></div>","text/html;charset=utf-8");             }             // 儲存並生成最終的郵件內容               message.saveChanges();               // 獲得Transport例項物件               Transport transport = session.getTransport();               // 開啟連線               transport.connect(from, AUTHORIZATION_CODE);               // 將message物件傳遞給transport物件,將郵件傳送出去               transport.sendMessage(message, message.getAllRecipients());             System.err.println("傳送郵件成功");             // 關閉連線               transport.close();                           return true;         } catch (Exception e) {             e.printStackTrace();             return false;         }     }

    private static String subject(Integer subjectNum) {         String subject = null;         if(subjectNum == 1) {             subject="語文";         }else if(subjectNum == 2){             subject="數學";         }else if(subjectNum == 3){             subject="英語";         }else if(subjectNum == 4){             subject="物理";         }else if(subjectNum == 5){             subject="化學";         }else if(subjectNum == 6){             subject="生物";         }else if(subjectNum == 7){             subject="歷史";         }else if(subjectNum == 8){             subject="地理";         }else if(subjectNum == 9){             subject="政治";         }         return subject;     }             /**      * 傳送簡單的文字郵件      */       public static boolean sendTextEmail(String to,int code) throws Exception {           try {             // 建立Session例項物件               Session session1 = Session.getDefaultInstance(props);                   // 建立MimeMessage例項物件               MimeMessage message = new MimeMessage(session1);               // 設定發件人               message.setFrom(new InternetAddress(from));               // 設定郵件主題               message.setSubject("內燃機註冊驗證碼");             // 設定收件人               message.setRecipient(RecipientType.TO, new InternetAddress(to));               // 設定傳送時間               message.setSentDate(new Date());               // 設定純文字內容為郵件正文               message.setText("您的驗證碼是:"+code+"!驗證碼有效期是10分鐘,過期後請重新獲取!"                     + "中國內燃機學會");               // 儲存並生成最終的郵件內容               message.saveChanges();                   // 獲得Transport例項物件               Transport transport = session1.getTransport();               // 開啟連線               transport.connect("meijiajiang2016", "");               // 將message物件傳遞給transport物件,將郵件傳送出去               transport.sendMessage(message, message.getAllRecipients());               // 關閉連線               transport.close();                           return true;         } catch (Exception e) {             e.printStackTrace();             return false;         }     }                  /**      * 傳送簡單的html郵件      */       public static boolean sendHtmlEmail(String to,int code) throws Exception {           // 建立Session例項物件           Session session1 = Session.getInstance(props, new MyAuthenticator());               // 建立MimeMessage例項物件           MimeMessage message = new MimeMessage(session1);           // 設定郵件主題           message.setSubject("內燃機註冊");           // 設定傳送人           message.setFrom(new InternetAddress(from));           // 設定傳送時間           message.setSentDate(new Date());           // 設定收件人           message.setRecipients(RecipientType.TO, InternetAddress.parse(to));           // 設定html內容為郵件正文,指定MIME型別為text/html型別,並指定字元編碼為gbk           message.setContent("<div style='width: 600px;margin: 0 auto'><h3 style='color:#003E64; text-align:center; '>內燃機註冊驗證碼</h3><p style=''>尊敬的使用者您好:</p><p style='text-indent: 2em'>您在註冊內燃機賬號,此次的驗證碼是:"+code+",有效期10分鐘!如果過期請重新獲取。</p><p style='text-align: right; color:#003E64; font-size: 20px;'>中國內燃機學會</p></div>","text/html;charset=utf-8");                     //設定自定義發件人暱稱          String nick="";          try {              nick=javax.mail.internet.MimeUtility.encodeText("中國內燃機學會");          } catch (UnsupportedEncodingException e) {              e.printStackTrace();          }         message.setFrom(new InternetAddress(nick+" <"+from+">"));         // 儲存並生成最終的郵件內容           message.saveChanges();               // 傳送郵件           try {             Transport.send(message);             return true;         } catch (Exception e) {             e.printStackTrace();             return false;         }             }           /**      * 傳送帶內嵌圖片的HTML郵件      */       public static void sendHtmlWithInnerImageEmail() throws MessagingException {           // 建立Session例項物件           Session session = Session.getDefaultInstance(props, new MyAuthenticator());               // 建立郵件內容           MimeMessage message = new MimeMessage(session);           // 郵件主題,並指定編碼格式           message.setSubject("帶內嵌圖片的HTML郵件", "utf-8");               // 發件人           message.setFrom(new InternetAddress(from));           // 收件人           message.setRecipients(RecipientType.TO, InternetAddress.parse(to));           // 抄送           message.setRecipient(RecipientType.CC, new InternetAddress("[email protected]"));           // 密送 (不會在郵件收件人名單中顯示出來)           message.setRecipient(RecipientType.BCC, new InternetAddress("[email protected]"));           // 傳送時間           message.setSentDate(new Date());               // 建立一個MIME子型別為“related”的MimeMultipart物件           MimeMultipart mp = new MimeMultipart("related");           // 建立一個表示正文的MimeBodyPart物件,並將它加入到前面建立的MimeMultipart物件中           MimeBodyPart htmlPart = new MimeBodyPart();           mp.addBodyPart(htmlPart);           // 建立一個表示圖片資源的MimeBodyPart物件,將將它加入到前面建立的MimeMultipart物件中           MimeBodyPart imagePart = new MimeBodyPart();           mp.addBodyPart(imagePart);               // 將MimeMultipart物件設定為整個郵件的內容           message.setContent(mp);               // 設定內嵌圖片郵件體           DataSource ds = new FileDataSource(new File("resource/firefoxlogo.png"));           DataHandler dh = new DataHandler(ds);           imagePart.setDataHandler(dh);           imagePart.setContentID("firefoxlogo.png");  // 設定內容編號,用於其它郵件體引用               // 建立一個MIME子型別為"alternative"的MimeMultipart物件,並作為前面建立的htmlPart物件的郵件內容           MimeMultipart htmlMultipart = new MimeMultipart("alternative");           // 建立一個表示html正文的MimeBodyPart物件           MimeBodyPart htmlBodypart = new MimeBodyPart();           // 其中cid=androidlogo.gif是引用郵件內部的圖片,即imagePart.setContentID("androidlogo.gif");方法所儲存的圖片           htmlBodypart.setContent("<span style='color:red;'>這是帶內嵌圖片的HTML郵件哦!!!<img src=\"cid:firefoxlogo.png\" /></span>","text/html;charset=utf-8");           htmlMultipart.addBodyPart(htmlBodypart);           htmlPart.setContent(htmlMultipart);               // 儲存並生成最終的郵件內容           message.saveChanges();               // 傳送郵件           Transport.send(message);       }           /**      * 傳送帶內嵌圖片、附件、多收件人(顯示郵箱姓名)、郵件優先順序、閱讀回執的完整的HTML郵件      */       public static void sendMultipleEmail() throws Exception {           String charset = "utf-8";   // 指定中文編碼格式           // 建立Session例項物件           Session session = Session.getInstance(props,new MyAuthenticator());               // 建立MimeMessage例項物件           MimeMessage message = new MimeMessage(session);           // 設定主題           message.setSubject("使用JavaMail傳送混合組合型別的郵件測試");           // 設定傳送人           message.setFrom(new InternetAddress(from,"新浪測試郵箱",charset));           // 設定收件人           message.setRecipients(RecipientType.TO,                    new Address[] {                   // 引數1:郵箱地址,引數2:姓名(在客戶端收件只顯示姓名,而不顯示郵件地址),引數3:姓名中文字串編碼                   new InternetAddress("[email protected]", "張三_sohu", charset),                   new InternetAddress("[email protected]", "李四_163", charset),               }           );           // 設定抄送           message.setRecipient(RecipientType.CC, new InternetAddress("[email protected]","王五_gmail",charset));           // 設定密送           message.setRecipient(RecipientType.BCC, new InternetAddress("[email protected]", "趙六_QQ", charset));           // 設定傳送時間           message.setSentDate(new Date());           // 設定回覆人(收件人回覆此郵件時,預設收件人)           message.setReplyTo(InternetAddress.parse("\"" + MimeUtility.encodeText("田七") + "\" <[email protected]>"));           // 設定優先順序(1:緊急   3:普通    5:低)           message.setHeader("X-Priority", "1");           // 要求閱讀回執(收件人閱讀郵件時會提示回覆發件人,表明郵件已收到,並已閱讀)           message.setHeader("Disposition-Notification-To", from);               // 建立一個MIME子型別為"mixed"的MimeMultipart物件,表示這是一封混合組合型別的郵件           MimeMultipart mailContent = new MimeMultipart("mixed");            message.setContent(mailContent);               // 附件           MimeBodyPart attach1 = new MimeBodyPart();           MimeBodyPart attach2 = new MimeBodyPart();           // 內容           MimeBodyPart mailBody = new MimeBodyPart();               // 將附件和內容新增到郵件當中           mailContent.addBodyPart(attach1);           mailContent.addBodyPart(attach2);           mailContent.addBodyPart(mailBody);               // 附件1(利用jaf框架讀取資料來源生成郵件體)           DataSource ds1 = new FileDataSource("resource/Earth.bmp");           DataHandler dh1 = new DataHandler(ds1);           attach1.setFileName(MimeUtility.encodeText("Earth.bmp"));           attach1.setDataHandler(dh1);               // 附件2           DataSource ds2 = new FileDataSource("resource/如何學好C語言.txt");           DataHandler dh2 = new DataHandler(ds2);           attach2.setDataHandler(dh2);           attach2.setFileName(MimeUtility.encodeText("如何學好C語言.txt"));               // 郵件正文(內嵌圖片+html文字)           MimeMultipart body = new MimeMultipart("related");  //郵件正文也是一個組合體,需要指明組合關係           mailBody.setContent(body);               // 郵件正文由html和圖片構成           MimeBodyPart imgPart = new MimeBodyPart();           MimeBodyPart htmlPart = new MimeBodyPart();           body.addBodyPart(imgPart);           body.addBodyPart(htmlPart);               // 正文圖片           DataSource ds3 = new FileDataSource("resource/firefoxlogo.png");           DataHandler dh3 = new DataHandler(ds3);           imgPart.setDataHandler(dh3);           imgPart.setContentID("firefoxlogo.png");               // html郵件內容           MimeMultipart htmlMultipart = new MimeMultipart("alternative");            htmlPart.setContent(htmlMultipart);           MimeBodyPart htmlContent = new MimeBodyPart();           htmlContent.setContent(                   "<span style='color:red'>這是我自己用java mail傳送的郵件哦!" +                   "<img src='cid:firefoxlogo.png' /></span>"                           , "text/html;charset=gbk");           htmlMultipart.addBodyPart(htmlContent);               // 儲存郵件內容修改           message.saveChanges();               /*File eml = buildEmlFile(message);         sendMailForEml(eml);*/               // 傳送郵件           Transport.send(message);       }           /**      * 將郵件內容生成eml檔案      * @param message 郵件內容      */       public static File buildEmlFile(Message message) throws MessagingException, FileNotFoundException, IOException {           File file = new File("c:\\" + MimeUtility.decodeText(message.getSubject())+".eml");           message.writeTo(new FileOutputStream(file));           return file;       }           /**      * 傳送本地已經生成好的email檔案      */       public static void sendMailForEml(File eml) throws Exception {           // 獲得郵件會話           Session session = Session.getInstance(props,new MyAuthenticator());           // 獲得郵件內容,即發生前生成的eml檔案           InputStream is = new FileInputStream(eml);           MimeMessage message = new MimeMessage(session,is);           //傳送郵件           Transport.send(message);       }           /**      * 向郵件伺服器提交認證資訊      */       static class MyAuthenticator extends Authenticator {               private String username = "meijiajiang2016";               private String password = "";               public MyAuthenticator() {               super();           }               public MyAuthenticator(String username, String password) {               super();               this.username = username;               this.password = password;           }               @Override           protected PasswordAuthentication getPasswordAuthentication() {                   return new PasswordAuthentication(username, password);           }       }          }