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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...