JavaMail入門第二篇 創建郵件

来源:http://www.cnblogs.com/huangminwen/archive/2016/11/20/6072003.html
-Advertisement-
Play Games

JavaMail API使用javax.mail.Message類來表示一封郵件,Message類是一個抽象類,所以我們需要使用其子類javax.mail.internet.MimeMessage類來創建Message類的實例對象,如果我們創建的是一個簡單文本郵件,那麼MimeMessage類就可以 ...


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 = "[email protected]";
12         String to = "[email protected]";
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 = "[email protected]";
12         String to = "[email protected]";
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 = "[email protected]";// 發件人地址
15         String to = "[email protected]"; // 收件人地址
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 = "[email protected]";// 發件人地址
21         String to = "[email protected]"; // 收件人地址
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格式的郵件,以及帶有內嵌圖片與附件的郵件了,下一篇將介紹如何發送郵件。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 很多時候使用svn,我們需要切換svn賬號,但是由於之前的賬號已經選擇了記住密碼,那麼我們應該如何刪除svn密碼來切換新的svn賬號呢? 其實很簡單,svn賬號密碼信息保存在電腦某一文件中,我們只要刪除該文件,下次登錄即可切換賬號 具體文件路徑如下:C:\Users\XXX\AppData\Roam ...
  • 今日問題: 有兩個類,Test類在Nov2016.use01包中,Ques1121類在Nov2016包中,在它的main方法中實例化了一個Test對象,並調用它的getString()方法,請問上面的程式編譯可以通過嗎?(點擊以下“【Java每日一題】20161121”查看20161118問題解析) ...
  • 這個Python腳本是用來對實時文件的內容監控,比如 Error 或者 time out 欄位都可以進行自定義;算是我的第一個真正的Python腳本,自己感覺還是比較臃腫,不過打算放到blog上記錄一下(還是初學者,大神們勿噴哈),真心希望博友們能夠再指點一下(現在記錄每次的文件大小值是輸出到了一個 ...
  • 轉載地址:http://www.07net01.com/program/2016/04/1452749.html [摘要:正在AS上開闢時,碰到那個題目,翻開全部的Java源文件,右邊一起標赤色,找沒有到類,到沒有到方式,由於不克不及面擊跳轉,開闢時糾結了很久,試了clean、rebuild等種種方 ...
  • 在學習完java中的條件判斷之後不久,老師佈置了這樣一道題,用java寫這樣的小程式:輸入年份和月份,運行後輸出對應當月的日期和星期,簡單來說就是寫一個日曆。一下的為簡單的案例代碼。 【在落手之前,我們能想到的相關邏輯有哪些呢:判斷這一年有多少天,是閏年還是平年,每個月對應的天數,對應月份的1號是星 ...
  • [1]if語句 [2]switch [3]while[4]do-while[5]for語句[6]foreach[7]break[8]continue[9]goto 任何 PHP 腳本都是由一系列語句構成的。一條語句可以是一個賦值語句,一個函數調用,一個迴圈,一個條件語句或者甚至是一個什麼也不做的語句 ...
  • 在公司無聊的時候看了前輩寫的python代碼,突然發現一個比較好玩的python表達式: 1 lambda x,y:x+y 咋一看,這個應該類似方法之類的,上網查了查,所以特此總結下 lambda:上代碼 冒號前邊的代表參數冒號後邊的代表表達式返回值類型跟參數有關 **返回值: **從這裡可以看得出 ...
  • 聚聚科技是一個剛創立的公司,很小很小,人很少,老闆感覺是個典型的北京小伙兒,戾氣很重,很有個性。筆試題倒是簡單: 1. echo(), print(), print_r()的區別? echo是PHP語言結構, print和print_r是函數。語言結構沒有返回值,函數可以有返回值(即便沒有用) 。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...