以下文章為轉載文章:(親自測試過,可以使用的好列子)

上一篇文章 基於 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(“這是一張圖片
基於JavaMail的Java郵件傳送:複雜郵件傳送”, “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;

}

}

傳送後檢視收件人的收件箱:

基於JavaMail的Java郵件傳送:複雜郵件傳送