以下文章為轉載文章:(親自測試過,可以使用的好列子)
上一篇文章 基於 JavaMail 的 Java 郵件傳送:簡單郵件傳送 講解了郵件的基本協議,
JavaMail元件
,建立併發送一封簡單郵件的詳細步驟。本文將介紹如何建立併發送一封包含圖片和附件的複雜郵件。
一封複雜的郵件內容可以看做是由很多節點(或者可以說是“片段”/“部分”/“零件”)組成,文字、圖片、附件等都可以看成是郵件內容中的一個節點。這些節點之間又可以相互關聯組合成一個節點。最終組合成一個大節點就是郵件的正文內容。
完整程式碼演示:
package com。xiets。javamaildemo;
import java。util。Date;
import java。util。Properties;
import javax。activation。DataHandler;
import javax。activation。FileDataSource;
import javax。mail。Message。RecipientType;
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;
/**
* 建立併發送一封包含文字、圖片、附件的複雜郵件
*
* JavaMail 版本: 1。6。0
* JDK 版本: JDK 1。7 以上(必須)
*
* @author xietansheng
*/
public
class
Main {
// 發件人的 郵箱 和 密碼(替換為自己的郵箱和密碼)
public
static String myEmailAccount = “xxxxxxxx@163。com”;
public
static String myEmailPassword = “xxxxxxxx”;
// 發件人郵箱的 SMTP 伺服器地址, 必須準確, 不同郵件伺服器地址不同, 一般格式為: http://smtp。xxx。com
// 網易163郵箱的 SMTP 伺服器地址為: smtp。163。com
public
static String myEmailSMTPHost = “smtp。163。com”;
// 收件人郵箱(替換為自己知道的有效郵箱)
public
static String receiveMailAccount = “xxxxxxxxx@qq。com”;
public
static
void
main(String[] args) throws Exception {
// 1。 建立引數配置, 用於連線郵件伺服器的引數配置
Properties props = new Properties(); // 引數配置
props。setProperty(“mail。transport。protocol”, “smtp”); // 使用的協議(JavaMail規範要求)
props。setProperty(“mail。smtp。host”, myEmailSMTPHost); // 發件人的郵箱的 SMTP 伺服器地址
props。setProperty(“mail。smtp。auth”, “true”); // 需要請求認證
// 開啟 SSL 連線, 以及更詳細的傳送步驟請看上一篇: 基於 JavaMail 的 Java 郵件傳送:簡單郵件傳送
// 2。 根據配置建立會話物件, 用於和郵件伺服器互動
Session session = Session。getInstance(props);
session。setDebug(true); // 設定為debug模式, 可以檢視詳細的傳送 log
// 3。 建立一封郵件
MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);
// 也可以保持到本地檢視
// message。writeTo(file_out_put_stream);
// 4。 根據 Session 獲取郵件傳輸物件
Transport transport = session。getTransport();
// 5。 使用 郵箱賬號 和 密碼 連線郵件伺服器
// 這裡認證的郵箱必須與 message 中的發件人郵箱一致,否則報錯
transport。connect(myEmailAccount, myEmailPassword);
// 6。 傳送郵件, 發到所有的收件地址, message。getAllRecipients() 獲取到的是在建立郵件物件時新增的所有收件人, 抄送人, 密送人
transport。sendMessage(message, message。getAllRecipients());
// 7。 關閉連線
transport。close();
}
/**
* 建立一封複雜郵件(文字+圖片+附件)
*/
public
static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
// 1。 建立郵件物件
MimeMessage message = new MimeMessage(session);
// 2。 From: 發件人
message。setFrom(new InternetAddress(sendMail, “我的測試郵件_發件人暱稱”, “UTF-8”));
// 3。 To: 收件人(可以增加多個收件人、抄送、密送)
message。addRecipient(RecipientType。TO, new InternetAddress(receiveMail, “我的測試郵件_收件人暱稱”, “UTF-8”));
// 4。 Subject: 郵件主題
message。setSubject(“TEST郵件主題(文字+圖片+附件)”, “UTF-8”);
/*
* 下面是郵件內容的建立:
*/
// 5。 建立圖片“節點”
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(“FairyTail。jpg”)); // 讀取本地檔案
image。setDataHandler(dh); // 將圖片資料新增到“節點”
image。setContentID(“image_fairy_tail”); // 為“節點”設定一個唯一編號(在文字“節點”將引用該ID)
// 6。 建立文字“節點”
MimeBodyPart text = new MimeBodyPart();
// 這裡新增圖片的方式是將整個圖片包含到郵件內容中, 實際上也可以以 http 連結的形式新增網路圖片
text。setContent(“這是一張圖片
”, “text/html;charset=UTF-8”);
// 7。 (文字+圖片)設定 文字 和 圖片 “節點”的關係(將 文字 和 圖片 “節點”合成一個混合“節點”)
MimeMultipart mm_text_image = new MimeMultipart();
mm_text_image。addBodyPart(text);
mm_text_image。addBodyPart(image);
mm_text_image。setSubType(“related”); // 關聯關係
// 8。 將 文字+圖片 的混合“節點”封裝成一個普通“節點”
// 最終新增到郵件的 Content 是由多個 BodyPart 組成的 Multipart, 所以我們需要的是 BodyPart,
// 上面的 mm_text_image 並非 BodyPart, 所有要把 mm_text_image 封裝成一個 BodyPart
MimeBodyPart text_image = new MimeBodyPart();
text_image。setContent(mm_text_image);
// 9。 建立附件“節點”
MimeBodyPart attachment = new MimeBodyPart();
DataHandler dh2 = new DataHandler(new FileDataSource(“妖精的尾巴目錄。doc”)); // 讀取本地檔案
attachment。setDataHandler(dh2); // 將附件資料新增到“節點”
attachment。setFileName(MimeUtility。encodeText(dh2。getName())); // 設定附件的檔名(需要編碼)
// 10。 設定(文字+圖片)和 附件 的關係(合成一個大的混合“節點” / Multipart )
MimeMultipart mm = new MimeMultipart();
mm。addBodyPart(text_image);
mm。addBodyPart(attachment); // 如果有多個附件,可以建立多個多次新增
mm。setSubType(“mixed”); // 混合關係
// 11。 設定整個郵件的關係(將最終的混合“節點”作為郵件的內容新增到郵件物件)
message。setContent(mm);
// 12。 設定發件時間
message。setSentDate(new Date());
// 13。 儲存上面的所有設定
message。saveChanges();
return message;
}
}
傳送後檢視收件人的收件箱: