JavaMail入門第二篇 建立郵件,javamail第二篇
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()這個靜態Factory 方法獲得一個預設的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格式的郵件,以及帶有內嵌圖片與附件的郵件了,下一篇將介紹如何發送郵件。