標籤:
轉自:http://haolloyin.blog.51cto.com/1177454/353849/
在 http://java.sun.com/products/javamail/ 下載了 JavaMail 1.4.3 版本,如果所用 JDK 是 6.0 則不用再下載 activation 。下載得到的是 javamail-1.4.3.zip 的壓縮包,解壓得到 mail.jar 包,配置環境變數之後就可以使用了。從解壓後的檔案夾中有 JavaMail-1.4.pdf 這個 JavaMail 的設計規範文檔。雖然是英文,但是稍微看一看我就從中截了 4 張比較有用的圖片,覺得有必要瞭解一下,如下:
1、JavaMail 架構層次圖:
2、JavaMail 的類層次圖:
3、JavaMail 中幾個最重要類的類圖:
4、MimeMessage 類的具體類圖:
JavaMail 文檔有時間慢慢理解,使用 JavaMail 開發郵件應用程式可以參考解壓之後的 JavaMail 開發文檔,下面用代碼實現建立一個純文字格式的郵件:
純文字格式的郵件:
- import java.io.FileOutputStream;
- 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;
- /**
- * 建立純文字格式的郵件,儲存為Outlook 的 ".eml" 郵件格式
- * @author haolloyin
- */
- public class TextMessage {
- public static void main(String[] args) throws Exception{
-
- String from = "[email protected]";
- String to = "[email protected]";
- String subject = "建立一個純文字郵件!";
- String body = "純文字郵件測試!!!";
-
- // 建立該郵件應用程式所需的環境資訊以及會話資訊
- Session session = Session.getDefaultInstance(new Properties());
-
- // 根據上面的 Session 執行個體建立 MimeMessage 執行個體,即一封郵件
- MimeMessage msg = new MimeMessage(session);
-
- // 設定寄件者地址
- msg.setFrom(new InternetAddress(from));
-
- // 設定收件者地址
- msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
-
- // 設定 E-mail 主題
- msg.setSubject(subject);
-
- // 設定發送時間
- msg.setSentDate(new Date());
-
- // 設定 E-mail 本文部分
- msg.setText(body);
-
- // 必須儲存對該 MimeMessage 執行個體的更改
- msg.saveChanges();
-
- // 將 msg 對象中內容寫入當前檔案的textMail.eml檔案中
- msg.writeTo(new FileOutputStream("textMail.eml"));
- }
- }
編譯運行,得到 textMail.eml 檔案,雙擊自動用 Outlook 開啟,如:
單擊 Outlook 中的“檔案”—> “屬性”—> “詳細資料”可看到該郵件的郵件標頭,再點擊“郵件來源”可看到該郵件的源檔案內容,如:
注意上面被選擇的內容,Content-Transfer-Encoding: base64 說明是被用 BASE64 編碼轉換過的了,因此郵件的本文部分如:
因為郵件中的 subject 和 body 都用到了中文,所以字元集編碼時 charset=GBK 。
HTML 格式的郵件:
再用同樣的方式建立一封 HTML 格式的郵件,對上面的代碼稍作修改即可,代碼如下:
- import java.io.FileOutputStream;
- 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;
-
- /**
- * 建立 HTML 格式的郵件,儲存為 Outlook 的 ".eml" 檔案
- * @author haolloyin
- */
- public class HtmlMessage {
- public static void main(String[] args) throws Exception{
-
- String from = "[email protected]";
- String to = "[email protected]";
- String subject = "建立一個 HTML 格式郵件!";
- String body = "<h4>HTML 格式的郵件測試!!!</h4> " +
- "<a href = http://haolloyin.blog.51cto.com/> 螞蟻</a>";
-
- // 建立該郵件應用程式所需的環境資訊以及會話資訊
- Session session = Session.getDefaultInstance(new Properties());
-
- // 根據上面的 Session 執行個體建立 MimeMessage 執行個體,即一封郵件
- MimeMessage msg = new MimeMessage(session);
-
- // 設定寄件者地址
- msg.setFrom(new InternetAddress(from));
-
- // 設定收件者地址
- msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
-
- // 設定 E-mail 主題
- msg.setSubject(subject);
-
- // 設定發送時間
- msg.setSentDate(new Date());
-
- // 設定 E-mail 本文部分
- // msg.setText(body);
- msg.setContent(body, "text/html;charset = gbk");
-
- // 儲存對該 MimeMessage 執行個體的更改
- msg.saveChanges();
-
- // 將 msg 對象中內容寫入檔案
- msg.writeTo(new FileOutputStream("htmlMail.eml"));
- }
- }
注意上面代碼中的 msg.setContent(body, "text/html;charset = gbk"); 語句,雙擊產生的檔案自動用 Outlook 開啟,如:
我們注意到編碼方式變成了 quoted-printable ,它與 BASE64 編碼類別似,都是將純粹的位元據轉換成可以列印的 ASCII 字元,具體的區別和用途請查閱資料。
目前的還不可以給指定的郵箱發送郵件,只是建立一封郵件而已。
小結:
1、瞭解 MIME 協議以及 MIME 郵件的組織圖對理解上面給出的類圖很有協助;
2、如果郵件的 subject 和 body 都不涉及中文,那麼整封郵件都不會被轉碼,而是用最原始的 7bit 編碼格式,可以試一試看一下效果。
我的相關文章:
圖解使用Telnet程式手工發送郵件
簡單的E-mail發送端程式的Java實現
圖解使用telnet程式手工內送郵件及其過程
JavaMail入門:建立純文字、HTML格式的郵件