JavaMail API使用javax.mail.Message類來表示一封郵件,Message類是一個抽象類,所以我們需要使用其子類javax.mail.internet.MimeMessage類來創(chuàng)建Message類的實例對象,如果我們創(chuàng)建的是一個簡單文本郵件,那么MimeMessage類就可以滿足我們的需求了,但是如果需要創(chuàng)建一封包含內(nèi)嵌資源或者是帶附件的復雜郵件,則需要使用到JavaMail API中的MimeMessage、javax.mail.internet.MimeBodyPart和javax.mail.internet.MimeMultipart等類。
1、MimeMessage類表示整封郵件
2、MimeBodyPart類表示郵件的一個MIME消息
3、MimeMultipart類表示一個由多個MIME消息組合成的組合MIME消息。
這三個類的工作關系如下圖所示:
雖然應用程序開發(fā)者在使用JavaMailAPI創(chuàng)建郵件內(nèi)容時,通常只需要使用MimeMessage,MimeBodyPart和MimeMultipart這3個主要的類,但是了解他們的類繼承關系也是必要的。下圖列出了這三個類的繼承關系以及常用方法。
下面用javax.mail.internet.MimeMessage類來創(chuàng)建一封簡單的文本郵件,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
import java.util.Date; import java.util.Properties; import javax.mail.Message; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.io.FileOutputStream; public class TextMessage { public static void main(String[] args) throws Exception { String subject = "test" ; String body = "test!!!" ; // 創(chuàng)建Session實例對象 Session session = Session.getDefaultInstance( new Properties()); // 創(chuàng)建MimeMessage實例對象 MimeMessage msg = new MimeMessage(session); // 設置發(fā)件人 msg.setFrom( new InternetAddress(from)); // 設置收件人 msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); // 設置發(fā)送日期 msg.setSentDate( new Date()); // 設置郵件主題 msg.setSubject(subject); // 設置純文本內(nèi)容的郵件正文 msg.setText(body); // 保存并生成最終的郵件內(nèi)容 msg.saveChanges(); // 把MimeMessage對象中的內(nèi)容寫入到文件中 msg.writeTo( new FileOutputStream( "c:\test.eml" )); } } |
我們用郵件客戶端(這里用foxmail)打開C盤下面的test.eml文件,可以看到如下信息,說明我們的郵件創(chuàng)建成功。
下面簡單解釋一下上面出現(xiàn)的一些類
1、MimeMessage類:上面介紹過MimeMessage是Message類的一個具體實現(xiàn)類,用來創(chuàng)建Message類的實例對象,這里構造函數(shù)傳入了一個Session對象作為參數(shù);
2、Session類:該對象用于收集客戶端與郵件服務器之間的網(wǎng)絡連接信息和定義整個郵件程序所需的環(huán)境信息,這些信息作為Session對象的屬性保存在Session對象中,Session對象利用了java.util.Properties對象獲得了郵件服務器、用戶名、密碼信息和整個應用程序都要使用到的共享信息,由于Session類的構造方法是私有的,所以我們使用Session類提供的getDefaultInstance()這個靜態(tài)工廠方法獲得一個默認的Session對象;
3、Properties類:該類表示了一個持久的屬性集,用于存放相關鍵值對信息作為參數(shù)來創(chuàng)建Session對象,這里構造了一個空的集合作為參數(shù);
4、InternetAddress類:該類是抽象類Address類的一個子類,用來創(chuàng)建一個郵件地址;
5、RecipientType類:該類是Message類的一個內(nèi)部類,該類有3個靜態(tài)變量,TO表示收件人,CC表示抄送人(收件人知道抄送的人),BCC表示密送人(收件人不知道密送的人)。
上面的郵件只是包含了簡單的文本,有時候我們需要使用HTML文件來豐富我們的郵件正文,例如使用HTML標簽來對郵件正文進行排版,使用HTML標簽在郵件正文中引入一些圖片或者是聲音等。下面這段代碼創(chuàng)建了一個包含HTML格式的郵件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import java.util.Date; import java.util.Properties; import javax.mail.Message; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.io.FileOutputStream; public class HtmlMessage { public static void main(String[] args) throws Exception { String subject = "test" ; String body = "<h4>歡迎大家閱讀此郵件</h4>" ; // 創(chuàng)建Session實例對象 Session session = Session.getDefaultInstance( new Properties()); // 創(chuàng)建MimeMessage實例對象 MimeMessage msg = new MimeMessage(session); // 設置發(fā)件人 msg.setFrom( new InternetAddress(from)); // 設置收件人 msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); // 設置發(fā)送日期 msg.setSentDate( new Date()); // 設置郵件主題 msg.setSubject(subject); // 設置HTML格式的郵件正文 msg.setContent(body, "text/html;charset=gb2312" ); // 保存并生成最終的郵件內(nèi)容 msg.saveChanges(); // 把MimeMessage對象中的內(nèi)容寫入到文件中 msg.writeTo( new FileOutputStream( "c:\test.eml" )); } } |
我們再用foxmail打開test.eml,顯示如下
與之前代碼不同的地方只是我們設置郵件內(nèi)容的時候用setContent方法代替了setText方法,并且指定了郵件正文的MIME類型為text/html。
現(xiàn)在我們學會了創(chuàng)建含有HTML標簽的郵件了,不過有時我們可能需要在郵件中插入一些圖片來更直觀的表達我們的意思,那么這時候我們就需要用到MimeMultipart類與MimeBodyPart類了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
import java.io.FileOutputStream; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; public class PictureMessage { public static void main(String[] args) throws Exception { String subject = "HTML郵件" ; String body = "<a href=http://www.cnblogs.com>" + "歡迎大家訪問博客園</a></br>" + "<img src="c:\dog.jpg">" ; Session session = Session.getDefaultInstance( new Properties()); // 創(chuàng)建MimeMessage對象,并設置各種郵件頭字段 MimeMessage message = new MimeMessage(session); message.setFrom( new InternetAddress(from)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); message.setSubject(subject); // 創(chuàng)建一個子類型為"related"的MimeMultipart對象。 MimeMultipart multipart = new MimeMultipart( "related" ); /* * 創(chuàng)建一個表示HTML正文的MimeBodyPart對象, 并將它加入到前面創(chuàng)建的MimeMultipart對象中 */ MimeBodyPart htmlBodyPart = new MimeBodyPart(); htmlBodyPart.setContent(body, "text/html;charset=gb2312"); multipart.addBodyPart(htmlBodyPart); /* * 創(chuàng)建一個表示圖片內(nèi)容的MimeBodyPart對象, 并將它加入到前面創(chuàng)建的MimeMultipart對象中 */ MimeBodyPart gifBodyPart = new MimeBodyPart(); FileDataSource fds = new FileDataSource("c:\dog.jpg"); gifBodyPart.setFileName(fds.getName()); gifBodyPart.setDataHandler(new DataHandler(fds)); multipart.addBodyPart(gifBodyPart); /* * 將MimeMultipart對象設置為整個郵件的內(nèi)容, 要注意調(diào)用saveChanges方法進行更新 */ message.setContent(multipart); message.saveChanges(); // 把MimeMessage對象中的內(nèi)容寫入到文件中 message.writeTo( new FileOutputStream( "c:\PictureMessage.eml" )); } } |
代碼看起來似乎有點小復雜,可以再看看上面提到的MimeMessage,MimeMultipart與MimeBodyPart這三個類之間的關系圖,這樣會更會容易理解上面的代碼,我們打開PictureMessage.eml,看到如下信息,說明我們成功的創(chuàng)建了一個帶有圖片的郵件了,并且該圖片以附件的形式包含在郵件中了
MimeMultipart有兩種構造函數(shù),
1
2
|
public MimeMultipart() public MimeMultipart(String subtype) |
第一種是無參數(shù)的,其默認的實例對象的MIME類型為mixed,第二種制定一個類型來創(chuàng)建MimeMultipart類的實例對象,其有三種常用的類型:mixed,related,alternative,這三種類型在MIME中的組合關系如下所示:
現(xiàn)在我們用上面所示的這種組合關系來創(chuàng)建一封帶有附件,并且正文中帶有內(nèi)嵌資源的郵件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
import java.io.FileOutputStream; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; public class ComplexMessage { public static void main(String[] args) throws Exception { Session session = Session.getDefaultInstance( new Properties()); MimeMessage message = createMessage(session); message.writeTo( new FileOutputStream( "c:\ComplexMessage.eml" )); } public static MimeMessage createMessage(Session session) throws Exception { String subject = "HTML郵件" ; // 郵件主題 String body = "<a href=http://www.cnblogs.com>" + "歡迎大家訪問博客園</a></br>" + "<img src="c:\dog.jpg">" ; MimeMessage message = new MimeMessage(session); message.setFrom( new InternetAddress(from)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); message.setSubject(subject); // 創(chuàng)建代表郵件正文和附件的各個MimeBodyPart對象 MimeBodyPart contentPart = createContent(body, "c:\dog.jpg" ); // 下面的附件可以是視頻或者是音頻 MimeBodyPart attachPart1 = createAttachment( "c:\音樂.MP3" ); MimeBodyPart attachPart2 = createAttachment( "c:\視頻.avi" ); // 創(chuàng)建用于組合郵件正文和附件的MimeMultipart對象 MimeMultipart allMultipart = new MimeMultipart( "mixed" ); allMultipart.addBodyPart(contentPart); allMultipart.addBodyPart(attachPart1); allMultipart.addBodyPart(attachPart2); // 設置整個郵件內(nèi)容為最終組合出的MimeMultipart對象 message.setContent(allMultipart); message.saveChanges(); return message; } public static MimeBodyPart createContent(String body, String filename) throws Exception { /* * 創(chuàng)建代表組合MIME消息的MimeMultipart對象, 和將該MimeMultipart對象保存到的MimeBodyPart對象 */ MimeBodyPart contentPart = new MimeBodyPart(); MimeMultipart contentMultipart = new MimeMultipart("related"); /* * 創(chuàng)建用于保存HTML正文的MimeBodyPart對象, 并將它保存到MimeMultipart中 */ MimeBodyPart htmlBodyPart = new MimeBodyPart(); htmlBodyPart.setContent(body, "text/html;charset=gb2312"); contentMultipart.addBodyPart(htmlBodyPart); /* * 創(chuàng)建用于保存圖片的MimeBodyPart對象, 并將它保存到MimeMultipart中 */ MimeBodyPart gifBodyPart = new MimeBodyPart(); FileDataSource fds = new FileDataSource(filename); gifBodyPart.setDataHandler( new DataHandler(fds)); contentMultipart.addBodyPart(gifBodyPart); // 將MimeMultipart對象保存到MimeBodyPart對象中 contentPart.setContent(contentMultipart); return contentPart; } public static MimeBodyPart createAttachment(String filename) throws Exception { // 創(chuàng)建保存附件的MimeBodyPart對象,并加入附件內(nèi)容和相應信息 MimeBodyPart attachPart = new MimeBodyPart(); FileDataSource fds = new FileDataSource(filename); attachPart.setDataHandler( new DataHandler(fds)); attachPart.setFileName(fds.getName()); return attachPart; } } |
打開ComplexMessage.eml文件,可以看到如下內(nèi)容:
現(xiàn)在我們學會了如何創(chuàng)建一封純文本的郵件,帶有HTML格式的郵件,以及帶有內(nèi)嵌圖片與附件的郵件了,下一篇將介紹如何發(fā)送郵件JavaMail入門第三篇 發(fā)送郵件
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。