JavaMail的使用


javaMail是java發送郵件的工具包,在有網情況下使用javaMail即可發送一封郵件。

主要流程

創建一個mailUtil類,裏面包含方法

  • 創建發雜郵件單獨節點
    • getMailContentImage 創建圖片,正文中引用
    • getMailContentText 創建文本,應用圖片
    • getMailContentAttachment 創建上傳附件
  • 合併多個節點爲複雜郵件內容
    • getMailContentMultipart 合併多個節點爲混合節點,即 正文內容
  • 創建複雜郵件
    • createComplexMimeMessage
  • 創建簡單郵件
    • createSimpleMimeMessage
  • 發送複雜郵件
    • sendMail(重載方法)
  • 發送簡單郵件
    • sendMail(重載方法)

創建測試類

  • 調用mailUtil類進行測試
  • 設置參數
  • 調用方法

測試環境

  • 普通java項目即可,電腦鏈接網絡,將參數設置爲自己的郵箱和密碼即可運行測試

代碼

mailUtil代碼如下

package com.lushunde.util;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class MailUtil {
	
	
    
/**
 * 發送一封郵件的過程
 * @param smtpHost		smtp服務,一般爲smtp.163.com  smtp.qq.com
 * @param sendMail		發件人郵箱地址 一般爲smtp對應
 * @param receiveMail	接收人郵箱地址,可以是任意的合法郵箱即可
 * @param mailSubject	創建的郵件主題
 * @param mailContent	創建郵件的內容,可以添加html標籤
 * @param sentDate		設置發送時間,null爲立即發送
 * @param authUserName	驗證服務器是的用戶名,一般和發件人郵箱保持一致
 * @param authPassword	驗證服務器的密碼,一般爲登錄郵箱的密碼,也可能是郵箱獨立密碼
 * @throws Exception
 */
    public static void sendMail(String smtpHost,String sendMail,String sendNickname,  String receiveMail,String receiveNickname,String mailSubject,String mailContent,Date sentDate,String authUserName,String authPassword ) throws Exception {
        // 1. 創建參數配置, 用於連接郵件服務器的參數配置
        Properties props = new Properties();                    // 參數配置
        props.setProperty("mail.transport.protocol", "smtp");   // 使用的協議(JavaMail規範要求)
        props.setProperty("mail.smtp.host", smtpHost);   // 發件人的郵箱的 SMTP 服務器地址
        props.setProperty("mail.smtp.auth", "true");            // 需要請求認證

      
        // 2. 根據配置創建會話對象, 用於和郵件服務器交互
        Session session = Session.getDefaultInstance(props);
        
        session.setDebug(true); // 設置爲debug模式, 可以查看詳細的發送 log,開發時候使用

        // 3. 創建一封郵件
        MimeMessage message = createMimeMessage(session, sendMail ,  sendNickname,   receiveMail, receiveNickname, mailSubject, mailContent, sentDate);

        // 4. 根據 Session 獲取郵件傳輸對象
        Transport transport = session.getTransport();

        // 5. 使用 郵箱賬號 和 密碼 連接郵件服務器, 這裏認證的郵箱必須與 message 中的發件人郵箱一致, 否則報錯
        //    PS_02: 連接失敗的原因通常爲以下幾點, 仔細檢查代碼:
        //           (1) 郵箱沒有開啓 SMTP 服務;
        //           (2) 郵箱密碼錯誤, 例如某些郵箱開啓了獨立密碼;
        //           (3) 郵箱服務器要求必須要使用 SSL 安全連接;
        //           (4) 請求過於頻繁或其他原因, 被郵件服務器拒絕服務;
        //           (5) 如果以上幾點都確定無誤, 到郵件服務器網站查找幫助。
        transport.connect(smtpHost,authUserName, authPassword);
       
        // 6. 發送郵件, 發到所有的收件地址, message.getAllRecipients() 獲取到的是在創建郵件對象時添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());

        // 7. 關閉連接
        transport.close();
    }
    /**
     * 發送一封郵件的過程
     * @param smtpHost		smtp服務,一般爲smtp.163.com  smtp.qq.com
     * @param sendMail		發件人郵箱地址 一般爲smtp對應
     * @param sendNickname	發件人暱稱
     * @param receiveMail	接收人郵箱地址,可以是任意的合法郵箱即可
     * @param receiveNickname 接收人暱稱
     * @param mailSubject	創建的郵件主題
     * @param mimeMultipart	上傳一個複雜的郵件內容
     * @param sentDate		設置發送時間,null爲立即發送
     * @param authUserName	驗證服務器是的用戶名,一般和發件人郵箱保持一致
     * @param authPassword	驗證服務器的密碼,一般爲登錄郵箱的密碼,也可能是郵箱獨立密碼
     * @throws Exception
     */
    public static void sendMail(String smtpHost,String sendMail,String sendNickname,  String receiveMail,String receiveNickname,String mailSubject,MimeMultipart mimeMultipart,Date sentDate,String authUserName,String authPassword ) throws Exception {
    	// 1. 創建參數配置, 用於連接郵件服務器的參數配置
    	Properties props = new Properties();                    // 參數配置
    	props.setProperty("mail.transport.protocol", "smtp");   // 使用的協議(JavaMail規範要求)
    	props.setProperty("mail.smtp.host", smtpHost);   // 發件人的郵箱的 SMTP 服務器地址
    	props.setProperty("mail.smtp.auth", "true");            // 需要請求認證
    	
    	
    	// 2. 根據配置創建會話對象, 用於和郵件服務器交互
    	Session session = Session.getDefaultInstance(props);
    	
    	session.setDebug(true); // 設置爲debug模式, 可以查看詳細的發送 log,開發時候使用
    	
    	// 3. 創建一封郵件
    	MimeMessage message = createComplexMimeMessage(session, sendMail ,  sendNickname,   receiveMail, receiveNickname, mailSubject, mimeMultipart, sentDate);
    	
    	// 4. 根據 Session 獲取郵件傳輸對象
    	Transport transport = session.getTransport();
    	
    	// 5. 使用 郵箱賬號 和 密碼 連接郵件服務器, 這裏認證的郵箱必須與 message 中的發件人郵箱一致, 否則報錯
    	//    PS_02: 連接失敗的原因通常爲以下幾點, 仔細檢查代碼:
    	//           (1) 郵箱沒有開啓 SMTP 服務;
    	//           (2) 郵箱密碼錯誤, 例如某些郵箱開啓了獨立密碼;
    	//           (3) 郵箱服務器要求必須要使用 SSL 安全連接;
    	//           (4) 請求過於頻繁或其他原因, 被郵件服務器拒絕服務;
    	//           (5) 如果以上幾點都確定無誤, 到郵件服務器網站查找幫助。
    	transport.connect(smtpHost,authUserName, authPassword);
    	
    	// 6. 發送郵件, 發到所有的收件地址, message.getAllRecipients() 獲取到的是在創建郵件對象時添加的所有收件人, 抄送人, 密送人
    	transport.sendMessage(message, message.getAllRecipients());
    	
    	// 7. 關閉連接
    	transport.close();
    }
    
    
    /**
     * 創建一封只包含文本的簡單郵件
     *
     * @param session 			和服務器交互的會話
     * @param sendMail 			發件人郵箱
     * @param sendNickname 		發送人暱稱
     * @param receiveMail 		收件人郵箱
     * @param receiveNickname	收件人暱稱
     * @param mailSubject 		郵件主題
     * @param receiveMail 		郵件內容
     * @param sendDate 			設置發送時間,null爲立即發送
     * @return MimeMessage		返回一份郵件
     * @throws Exception
     */
    public static MimeMessage createMimeMessage(Session session, String sendMail,String sendNickname,  String receiveMail,String receiveNickname,String mailSubject,String mailContent,Date sentDate) throws Exception {
        // 1. 創建一封郵件
        MimeMessage message = new MimeMessage(session);

        // 2. From: 發件人    
        message.setFrom(new InternetAddress(sendMail,sendNickname,"UTF-8"));

        // 3. To: 收件人(可以增加多個收件人、抄送、密送)
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, receiveNickname, "UTF-8"));

        // 4. Subject: 郵件主題
        message.setSubject(mailSubject, "UTF-8");

        // 5. Content: 郵件正文(可以使用html標籤)
        message.setContent(mailContent, "text/html;charset=UTF-8");

        // 6. 設置發件時間
        message.setSentDate(sentDate!=null?sentDate:new Date());

        // 7. 保存設置
        message.saveChanges();

        return message;
    }
    
    
    
    /**
     * 創建一封複雜郵件(文本+圖片+附件)
     */
    public static MimeMessage createComplexMimeMessage(Session session, String sendMail,String sendNickname,  String receiveMail,String receiveNickname,String mailSubject,MimeMultipart mailContent,Date sentDate) throws Exception {
        // 1. 創建郵件對象
        MimeMessage message = new MimeMessage(session);

        // 2. From: 發件人
        message.setFrom(new InternetAddress(sendMail, sendNickname, "UTF-8"));

        // 3. To: 收件人(可以增加多個收件人、抄送、密送)
        message.addRecipient(RecipientType.TO, new InternetAddress(receiveMail, receiveNickname, "UTF-8"));

        // 4. Subject: 郵件主題
        message.setSubject(mailSubject, "UTF-8");

        // 5. Content: 複雜郵件內容,有單獨方法創建,直接傳入
        // 6. 設置整個郵件的關係(將最終的混合“節點”作爲郵件的內容添加到郵件對象)
        message.setContent(mailContent);

        // 7. 設置發件時間
        message.setSentDate(sentDate!=null?sentDate:new Date());

        // 8. 保存上面的所有設置
        message.saveChanges();

        return message;
    }
    
    
    /**
     * 創建一個圖片節點,返回節點唯一編號,在文本中引用
     * @param imagePath				需要添加到郵件正文文本中的圖片本地路徑
     * @param only_image_ID			設置的圖片Id,只要是正文文本中引用圖片只需引用該ID即可
     * @return MimeBodyPart			返回創建的圖片節點
     * @throws MessagingException
     */
    public static MimeBodyPart getMailContentImage(String imagePath,String only_image_ID) throws MessagingException{
    	 MimeBodyPart image = new MimeBodyPart();
         DataHandler dh = new DataHandler(new FileDataSource(imagePath)); // 讀取本地文件
         image.setDataHandler(dh);                   // 將圖片數據添加到“節點”
         image.setContentID(only_image_ID);     // 爲“節點”設置一個唯一編號(在文本“節點”將引用該ID)
		return image;
    }
    
    /**
     * 創建一個文本節點,其中添加創建的圖片節點對圖片進行引用
     * @param content		文本,可以是已經飲用過的文本,例如"這是一張圖片<br/><img src='cid:only_image_ID'/>"
     * @return MimeBodyPart	返回一個節點
     * @throws MessagingException
     */
    public static MimeBodyPart getMailContentText(String content) throws MessagingException{
    	 MimeBodyPart text = new MimeBodyPart();
         //這裏添加圖片的方式是將整個圖片包含到郵件內容中, 實際上也可以以 http 鏈接的形式添加網絡圖片
         //text.setContent("這是一張圖片<br/><img src='cid:image_fairy_tail'/>", "text/html;charset=UTF-8");
    	 text.setContent(content,"text/html;charset=UTF-8");
    	 return text;
    }
	
    
    /**
     * 創建一個附件節點,附件上傳文件
     * @param attachmentPath	需要上傳到附件的文件的路徑
     * @return MimeBodyPart	返回一個節點
     * @throws MessagingException
     * @throws UnsupportedEncodingException 
     */
    public static MimeBodyPart getMailContentAttachment(String attachmentPath) throws MessagingException, UnsupportedEncodingException{
        MimeBodyPart attachment = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource(attachmentPath));  // 讀取本地文件
        attachment.setDataHandler(dh);                                             // 將附件數據添加到“節點”
        attachment.setFileName(MimeUtility.encodeText(dh.getName()));              // 設置附件的文件名(需要編碼)
		return attachment;

    }
    
    
    /**
     * 創建一個混合節點,添加所有的普通節點
     * @param mimeBodyPart	  傳入需要添加的普通節點數組
     * @return MimeMultipart 混合節點
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     */
    public static MimeMultipart getMailContentMultipart(MimeBodyPart[] mimeBodyPart) throws MessagingException, UnsupportedEncodingException{
    	MimeMultipart mimeMultipart = new MimeMultipart();
    	for (int i = 0; i < mimeBodyPart.length; i++) {
    		mimeMultipart.addBodyPart(mimeBodyPart[i]); 
		}
		return mimeMultipart;
         
    }
    
    
}

測試類代碼如下

package com.lushunde.util;

import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;

public class MailTest {

	public static void main(String[] args) throws Exception {

		String sendMail = "[email protected]"; // 發件人
		String receiveMail = "[email protected]"; // 收件人
		String authUserName = "[email protected]"; // 驗證賬戶
		String authPassword = "xxxxxx"; // 驗證密碼
		// 發送簡單郵件
		senfSimpleMail(sendMail, receiveMail, authUserName, authPassword);

		// 發送複雜 郵件
		sendComplexmail(sendMail, receiveMail, authUserName, authPassword);

	}

	private static void sendComplexmail(String sendMail, String receiveMail, String authUserName, String authPassword)
			throws Exception {
		// 創建複雜郵件的正文
		// 1.創建圖片,正文中引用
		String imagePath = "C:\\Users\\base\\Desktop\\測試圖片.jpg";
		String only_image_ID = "add_image_id";
		MimeBodyPart image = MailUtil.getMailContentImage(imagePath, only_image_ID);
		// 2.創建普通文本,添加引用圖片id
		String content = "這是驗證郵件,您的圖片爲<img src='cid:add_image_id'/>";
		MimeBodyPart text = MailUtil.getMailContentText(content);
		// 3.創建一個附件
		String attachmentPath = "C:\\Users\\base\\Desktop\\mail.rar";
		MimeBodyPart attachment = MailUtil.getMailContentAttachment(attachmentPath);
		// 4.創建一個混合節點,添加以上普通節點
		MimeBodyPart[] mimeBodyPart = { image, text, attachment };
		MimeMultipart mimeMultipart = MailUtil.getMailContentMultipart(mimeBodyPart);

		MailUtil.sendMail("smtp.163.com", sendMail, null, receiveMail, null, "用戶賬戶激活", mimeMultipart, null,
				authUserName, authPassword);
	}

	private static void senfSimpleMail(String sendMail, String receiveMail, String authUserName, String authPassword)
			throws Exception {
		MailUtil.sendMail("smtp.163.com", sendMail, null, receiveMail, null, "用戶賬戶激活",
				"這是一份激活郵件,如本人註冊請點擊鏈接進行激活:</br><a href=\"http://localhost:8080/user/activate \">點擊激活</a>", null,
				authUserName, authPassword);
	}
}

測試結果

  • 簡單郵箱如圖:(只有文本)
    在這裏插入圖片描述
  • 複雜郵箱如圖:(有附件,有圖片)
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章