JavaMail API使用javax.mail.Message類來表示一封郵件,Message類是一個抽象類,因此咱們須要使用其子類javax.mail.internet.MimeMessage類來建立Message類的實例對象,若是咱們建立的是一個簡單文本郵件,那麼MimeMessage類就能夠知足咱們的需求了,可是若是須要建立一封包含內嵌資源或者是帶附件的複雜郵件,則須要使用到JavaMail API中的MimeMessage、javax.mail.internet.MimeBodyPart和javax.mail.internet.MimeMultipart等類。html
一、MimeMessage類表示整封郵件java
二、MimeBodyPart類表示郵件的一個MIME消息服務器
三、MimeMultipart類表示一個由多個MIME消息組合成的組合MIME消息。網絡
這三個類的工做關係以下圖所示:session
雖然應用程序開發者在使用JavaMailAPI建立郵件內容時,一般只須要使用MimeMessage,MimeBodyPart和MimeMultipart這3個主要的類,可是瞭解他們的類繼承關係也是必要的。下圖列出了這三個類的繼承關係以及經常使用方法。
函數
下面用javax.mail.internet.MimeMessage類來建立一封簡單的文本郵件,post
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文件,能夠看到以下信息,說明咱們的郵件建立成功。url
下面簡單解釋一下上面出現的一些類spa
一、MimeMessage類:上面介紹過MimeMessage是Message類的一個具體實現類,用來建立Message類的實例對象,這裏構造函數傳入了一個Session對象做爲參數;code
二、Session類:該對象用於收集客戶端與郵件服務器之間的網絡鏈接信息和定義整個郵件程序所需的環境信息,這些信息做爲Session對象的屬性保存在Session對象中,Session對象利用了java.util.Properties對象得到了郵件服務器、用戶名、密碼信息和整個應用程序都要使用到的共享信息,因爲Session類的構造方法是私有的,因此咱們使用Session類提供的getDefaultInstance()這個靜態工廠方法得到一個默認的Session對象;
三、Properties類:該類表示了一個持久的屬性集,用於存放相關鍵值對信息做爲參數來建立Session對象,這裏構造了一個空的集合做爲參數;
四、InternetAddress類:該類是抽象類Address類的一個子類,用來建立一個郵件地址;
五、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格式的郵件,以及帶有內嵌圖片與附件的郵件了,下一篇JavaMail入門第三篇 發送郵件將介紹如何發送郵件。