JavaMail API使用javax.mail.Message類來表示一封郵件,Message類是一個抽象類,所以我們需要使用其子類javax.mail.internet.MimeMessage類來創建Message類的實例對象,如果我們創建的是一個簡單文本郵件,那麼MimeMessage類就可以滿足我們的需求了,但是如果需要創建一封包含內嵌資源或者是帶附件的復雜郵件,則需要使用到JavaMail API中的MimeMessage、javax.mail.internet.MimeBodyPart和javax.mail.internet.MimeMultipart等類。
1、MimeMessage類表示整封郵件
2、MimeBodyPart類表示郵件的一個MIME消息
3、MimeMultipart類表示一個由多個MIME消息組合成的組合MIME消息。
這三個類的工作關系如下圖所示:

雖然應用程序開發者在使用JavaMailAPI創建郵件內容時,通常只需要使用MimeMessage,MimeBodyPart和MimeMultipart這3個主要的類,但是了解他們的類繼承關系也是必要的。下圖列出了這三個類的繼承關系以及常用方法。
下面用javax.mail.internet.MimeMessage類來創建一封簡單的文本郵件,
1 import java.util.Date;
2 import java.util.Properties;
3 import javax.mail.Message;
4 import javax.mail.Session;
5 import javax.mail.internet.InternetAddress;
6 import javax.mail.internet.MimeMessage;
7 import java.io.FileOutputStream;
8
9 public class TextMessage {
10 public static void main(String[] args) throws Exception {
11 String from = "123456@qq.com";
12 String to = "123456@163.com";
13 String subject = "test";
14 String body = "test!!!";
15
16 // 創建Session實例對象
17 Session session = Session.getDefaultInstance(new Properties());
18 // 創建MimeMessage實例對象
19 MimeMessage msg = new MimeMessage(session);
20 // 設置發件人
21 msg.setFrom(new InternetAddress(from));
22 // 設置收件人
23 msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
24 // 設置發送日期
25 msg.setSentDate(new Date());
26 // 設置郵件主題
27 msg.setSubject(subject);
28 // 設置純文本內容的郵件正文
29 msg.setText(body);
30 // 保存並生成最終的郵件內容
31 msg.saveChanges();
32 // 把MimeMessage對象中的內容寫入到文件中
33 msg.writeTo(new FileOutputStream("c:\\test.eml"));
34 }
35 }
我們用郵件客戶端(這裡用foxmail)打開C盤下面的test.eml文件,可以看到如下信息,說明我們的郵件創建成功。

下面簡單解釋一下上面出現的一些類
1、MimeMessage類:上面介紹過MimeMessage是Message類的一個具體實現類,用來創建Message類的實例對象,這裡構造函數傳入了一個Session對象作為參數;
2、Session類:該對象用於收集客戶端與郵件服務器之間的網絡連接信息和定義整個郵件程序所需的環境信息,這些信息作為Session對象的屬性保存在Session對象中,Session對象利用了java.util.Properties對象獲得了郵件服務器、用戶名、密碼信息和整個應用程序都要使用到的共享信息,由於Session類的構造方法是私有的,所以我們使用Session類提供的getDefaultInstance()這個靜態工廠方法獲得一個默認的Session對象;
3、Properties類:該類表示了一個持久的屬性集,用於存放相關鍵值對信息作為參數來創建Session對象,這裡構造了一個空的集合作為參數;
4、InternetAddress類:該類是抽象類Address類的一個子類,用來創建一個郵件地址;
5、RecipientType類:該類是Message類的一個內部類,該類有3個靜態變量,TO表示收件人,CC表示抄送人(收件人知道抄送的人),BCC表示密送人(收件人不知道密送的人)。
上面的郵件只是包含了簡單的文本,有時候我們需要使用HTML文件來豐富我們的郵件正文,例如使用HTML標簽來對郵件正文進行排版,使用HTML標簽在郵件正文中引入一些圖片或者是聲音等。下面這段代碼創建了一個包含HTML格式的郵件
1 import java.util.Date;
2 import java.util.Properties;
3 import javax.mail.Message;
4 import javax.mail.Session;
5 import javax.mail.internet.InternetAddress;
6 import javax.mail.internet.MimeMessage;
7 import java.io.FileOutputStream;
8
9 public class HtmlMessage {
10 public static void main(String[] args) throws Exception {
11 String from = "123456@qq.com";
12 String to = "123456@163.com";
13 String subject = "test";
14 String body = "<h4>歡迎大家閱讀此郵件</h4>";
15 // 創建Session實例對象
16 Session session = Session.getDefaultInstance(new Properties());
17 // 創建MimeMessage實例對象
18 MimeMessage msg = new MimeMessage(session);
19 // 設置發件人
20 msg.setFrom(new InternetAddress(from));
21 // 設置收件人
22 msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
23 // 設置發送日期
24 msg.setSentDate(new Date());
25 // 設置郵件主題
26 msg.setSubject(subject);
27 // 設置HTML格式的郵件正文
28 msg.setContent(body, "text/html;charset=gb2312");
29 // 保存並生成最終的郵件內容
30 msg.saveChanges();
31 // 把MimeMessage對象中的內容寫入到文件中
32 msg.writeTo(new FileOutputStream("c:\\test.eml"));
33 }
34 }
我們再用foxmail打開test.eml,顯示如下

與之前代碼不同的地方只是我們設置郵件內容的時候用setContent方法代替了setText方法,並且指定了郵件正文的MIME類型為text/html。
現在我們學會了創建含有HTML標簽的郵件了,不過有時我們可能需要在郵件中插入一些圖片來更直觀的表達我們的意思,那麼這時候我們就需要用到MimeMultipart類與MimeBodyPart類了
1 import java.io.FileOutputStream;
2 import java.util.Properties;
3 import javax.activation.DataHandler;
4 import javax.activation.FileDataSource;
5 import javax.mail.Message;
6 import javax.mail.Session;
7 import javax.mail.internet.InternetAddress;
8 import javax.mail.internet.MimeBodyPart;
9 import javax.mail.internet.MimeMessage;
10 import javax.mail.internet.MimeMultipart;
11
12 public class PictureMessage {
13 public static void main(String[] args) throws Exception {
14 String from = "123456@qq.com";// 發件人地址
15 String to = "123456@163.com"; // 收件人地址
16 String subject = "HTML郵件";
17 String body = "<a href=http://www.cnblogs.com>" + "歡迎大家訪問博客園</a></br>"
18 + "<img src=\"c:\\dog.jpg\">";
19
20 Session session = Session.getDefaultInstance(new Properties());
21 // 創建MimeMessage對象,並設置各種郵件頭字段
22 MimeMessage message = new MimeMessage(session);
23 message.setFrom(new InternetAddress(from));
24 message.setRecipients(Message.RecipientType.TO,
25 InternetAddress.parse(to));
26 message.setSubject(subject);
27
28 // 創建一個子類型為"related"的MimeMultipart對象。
29 MimeMultipart multipart = new MimeMultipart("related");
30
31 /*
32 * 創建一個表示HTML正文的MimeBodyPart對象, 並將它加入到前面創建的MimeMultipart對象中
33 */
34 MimeBodyPart htmlBodyPart = new MimeBodyPart();
35 htmlBodyPart.setContent(body, "text/html;charset=gb2312");
36 multipart.addBodyPart(htmlBodyPart);
37
38 /*
39 * 創建一個表示圖片內容的MimeBodyPart對象, 並將它加入到前面創建的MimeMultipart對象中
40 */
41 MimeBodyPart gifBodyPart = new MimeBodyPart();
42 FileDataSource fds = new FileDataSource("c:\\dog.jpg");
43 gifBodyPart.setFileName(fds.getName());
44 gifBodyPart.setDataHandler(new DataHandler(fds));
45 multipart.addBodyPart(gifBodyPart);
46
47 /*
48 * 將MimeMultipart對象設置為整個郵件的內容, 要注意調用saveChanges方法進行更新
49 */
50 message.setContent(multipart);
51 message.saveChanges();
52
53 // 把MimeMessage對象中的內容寫入到文件中
54 message.writeTo(new FileOutputStream("c:\\PictureMessage.eml"));
55 }
56 }
代碼看起來似乎有點小復雜,可以再看看上面提到的MimeMessage,MimeMultipart與MimeBodyPart這三個類之間的關系圖,這樣會更會容易理解上面的代碼,我們打開PictureMessage.eml,看到如下信息,說明我們成功的創建了一個帶有圖片的郵件了,並且該圖片以附件的形式包含在郵件中了

MimeMultipart有兩種構造函數,
1 public MimeMultipart() 2 public MimeMultipart(String subtype)
第一種是無參數的,其默認的實例對象的MIME類型為mixed,第二種制定一個類型來創建MimeMultipart類的實例對象,其有三種常用的類型:mixed,related,alternative,這三種類型在MIME中的組合關系如下所示:

現在我們用上面所示的這種組合關系來創建一封帶有附件,並且正文中帶有內嵌資源的郵件
1 import java.io.FileOutputStream;
2 import java.util.Properties;
3 import javax.activation.DataHandler;
4 import javax.activation.FileDataSource;
5 import javax.mail.Message;
6 import javax.mail.Session;
7 import javax.mail.internet.InternetAddress;
8 import javax.mail.internet.MimeBodyPart;
9 import javax.mail.internet.MimeMessage;
10 import javax.mail.internet.MimeMultipart;
11
12 public class ComplexMessage {
13 public static void main(String[] args) throws Exception {
14 Session session = Session.getDefaultInstance(new Properties());
15 MimeMessage message = createMessage(session);
16 message.writeTo(new FileOutputStream("c:\\ComplexMessage.eml"));
17 }
18
19 public static MimeMessage createMessage(Session session) throws Exception {
20 String from = "123456@qq.com";// 發件人地址
21 String to = "123456@163.com"; // 收件人地址
22 String subject = "HTML郵件"; // 郵件主題
23 String body = "<a href=http://www.cnblogs.com>" + "歡迎大家訪問博客園</a></br>"
24 + "<img src=\"c:\\dog.jpg\">";
25
26 MimeMessage message = new MimeMessage(session);
27 message.setFrom(new InternetAddress(from));
28 message.setRecipients(Message.RecipientType.TO,
29 InternetAddress.parse(to));
30 message.setSubject(subject);
31
32 // 創建代表郵件正文和附件的各個MimeBodyPart對象
33 MimeBodyPart contentPart = createContent(body, "c:\\dog.jpg");
34 // 下面的附件可以是視頻或者是音頻
35 MimeBodyPart attachPart1 = createAttachment("c:\\音樂.MP3");
36 MimeBodyPart attachPart2 = createAttachment("c:\\視頻.avi");
37
38 // 創建用於組合郵件正文和附件的MimeMultipart對象
39 MimeMultipart allMultipart = new MimeMultipart("mixed");
40 allMultipart.addBodyPart(contentPart);
41 allMultipart.addBodyPart(attachPart1);
42 allMultipart.addBodyPart(attachPart2);
43
44 // 設置整個郵件內容為最終組合出的MimeMultipart對象
45 message.setContent(allMultipart);
46 message.saveChanges();
47 return message;
48 }
49
50 public static MimeBodyPart createContent(String body, String filename)
51 throws Exception {
52 /*
53 * 創建代表組合MIME消息的MimeMultipart對象, 和將該MimeMultipart對象保存到的MimeBodyPart對象
54 */
55 MimeBodyPart contentPart = new MimeBodyPart();
56 MimeMultipart contentMultipart = new MimeMultipart("related");
57
58 /*
59 * 創建用於保存HTML正文的MimeBodyPart對象, 並將它保存到MimeMultipart中
60 */
61 MimeBodyPart htmlBodyPart = new MimeBodyPart();
62 htmlBodyPart.setContent(body, "text/html;charset=gb2312");
63 contentMultipart.addBodyPart(htmlBodyPart);
64
65 /*
66 * 創建用於保存圖片的MimeBodyPart對象, 並將它保存到MimeMultipart中
67 */
68 MimeBodyPart gifBodyPart = new MimeBodyPart();
69 FileDataSource fds = new FileDataSource(filename);
70 gifBodyPart.setDataHandler(new DataHandler(fds));
71 contentMultipart.addBodyPart(gifBodyPart);
72
73 // 將MimeMultipart對象保存到MimeBodyPart對象中
74 contentPart.setContent(contentMultipart);
75 return contentPart;
76 }
77
78 public static MimeBodyPart createAttachment(String filename)
79 throws Exception {
80 // 創建保存附件的MimeBodyPart對象,並加入附件內容和相應信息
81 MimeBodyPart attachPart = new MimeBodyPart();
82 FileDataSource fds = new FileDataSource(filename);
83 attachPart.setDataHandler(new DataHandler(fds));
84 attachPart.setFileName(fds.getName());
85 return attachPart;
86 }
87 }
打開ComplexMessage.eml文件,可以看到如下內容,

現在我們學會了如何創建一封純文本的郵件,帶有HTML格式的郵件,以及帶有內嵌圖片與附件的郵件了,下一篇將介紹如何發送郵件。