JavaMail,顧名思義,提供給開發者處理電子郵件相關的編程接口。JavaMail 是由 Sun 定義的一套收發電子郵件的 API,它能夠方便地執行一些經常使用的郵件傳輸,不一樣的廠商能夠提供本身的實現類。但它並無包含在 JDK 中,而是做爲 JavaEE 的一部分。java
廠商所提供的 JavaMail 服務程序能夠有選擇地實現某些郵件協議,常見的郵件協議包括:編程
這三種協議都有對應 SSL 加密傳輸的協議,分別是 SMTPS,POP3S 和 IMAPS。除 JavaMail 服務提供程序以外, JavaMail 還須要 JAF(JavaBeans Activation Framework)來處理不是純文本的郵件內容,這包括 MIME(多用途互聯網郵件擴展)、URL 頁面和文件附件等內容。另外,JavaMail 依賴 JAF(JavaBeans Activation Framework),JAF 在 Java6 以後已經合併到 JDK 中,而 JDK5 以前須要另外下載 JAF 的類庫。api
在研究 JavaMail API 的細則以前,首先須要對於 API 用到的協議有個認識。對於 java mail 來講用到的協議有常見的幾種: SMTP、POP、IMAP、MIME安全
簡單郵件傳輸協議(Simple Mail Transfer Protocol,SMTP)由 RFC 821 定義。它定義了發送電子郵件的機制。在 JavaMail API 環境中,您基於 JavaMail 的程序將和您的公司或因特網服務供應商的(Internet Service
Provider's,ISP's)SMTP 服務器通訊。SMTP 服務器會中轉消息給接收方 SMTP 服務器以便最終讓用戶經由 POP 或 IMAP 得到。服務器
POP 表明郵局協議(Post Office Protocol)。目前用的是版本 3,也稱 POP3,RFC 1939 定義了這個協議。POP 是一種機制,因特網上大多數人用它獲得郵件。它規定每一個用戶一個郵箱的支持。這就是它所能作的,而這也形成了許多混淆。使用 POP3 時,用戶熟悉的許多性能並非由 POP 協議支持的,如查看有幾封新郵件消息這一性能。這些性能內建於如 Eudora 或 Microsoft Outlook 之類的程序中,它們能記住一些事,諸如最近一次收到的郵件,還能計算出有多少是新的。因此當使用 JavaMail API 時,若是您想要這類信息,您就必須本身算。session
IMAP 是更高級的用於接收消息的協議。在 RFC 2060 中被定義,IMAP 表明因特網消息訪問協議(Internet Message Access Protocol),目前用的是版本 4,也稱 IMAP4。在用到 IMAP 時,郵件服務器必需支持這個協議。不能僅僅把使用 POP 的程序用於 IMAP,並期望它支持 IMAP 全部性能。假設郵件服務器支持 IMAP,基於 JavaMail 的程序能夠利用這種狀況 — 用戶在服務器上有多個文件夾(folder),而且這些文件夾能夠被多個用戶共享。由於有這一更高級的性能,您也許會認爲全部用戶都會使用 IMAP。事實並非這樣。要求服務器接收新消息,在用戶請求時發送到用戶手中,還要在每一個用戶的多個文件夾中維護消息。這樣雖然能將消息集中備份,但隨着用戶長期的郵件夾愈來愈大,到磁盤空間耗盡時,每一個用戶都會受到損失。使用 POP,就能卸載郵件服務器上保存的消息了。架構
MIME 表明多用途因特網郵件擴展標準(Multipurpose Internet Mail Extensions)。它不是郵件傳輸協議。但對傳輸內容的消息、附件及其它的內容定義了格式。這裏有不少不一樣的有效文檔:RFC 82二、RFC 204五、RFC
2046 和 RFC 2047。做爲一個 JavaMail API 的用戶,您一般沒必要對這些格式操心。不管如何,必定存在這些格式並且程序會用到它。socket
JavaMail 對收發郵件進行了高級的抽象,造成了一些關鍵的的接口和類,它們構成了程序的基礎,下面咱們分別來了解一下這些最多見的對象。ide
因爲 JavaMail 須要和郵件服務器進行通訊,這就要求程序提供許多諸如服務器地址、端口、用戶名、密碼等信息,JavaMail 經過 Properties 對象封裝這些屬性信息。以下面的代碼封裝了兩個屬性信息:性能
Properties props = new Properties(); props.put("mail.smtp.host", "smtp.sina.com.cn"); props.put("mail.smtp.auth", "true");
針對不一樣的的郵件協議,JavaMail 規定了服務提供者必須支持一系列屬性,下表是針對 SMTP 協議的一些常見屬性(屬性值都以 String 類型進行設置,屬性類型欄僅表示屬性是如何被解析的):
屬性名 | 類型 | 說明 |
---|---|---|
mail.smtp.host | String | SMTP 服務器地址,如smtp.sina.com.cn |
mail.smtp.port | int | SMTP 服務器端口號,默認爲 25 |
mail.smtp.auth | boolean | SMTP 服務器是否須要用戶認證,默認爲 false |
mail.smtp.user | String | SMTP 默認的登錄用戶名 |
mail.smtp.from | String | 默認的郵件發送源地址 |
mail.smtp.socketFactory.class | String | socket 工廠類類名 經過設置該屬性能夠覆蓋提供者默認的實現,必須實現javax.NET.SocketFactory接口 |
mail.smtp.socketFactory.port | int | 指定 socket 工廠類所用的端口號 若是沒有規定,則使用默認的端口號 |
mail.smtp.socketFactory.fallback | boolean | 設置爲 true 時,當使用指定的socket 類建立 socket 失敗後,將使用 Java.net.Socket 建立socket,默認爲 true |
mail.smtp.timeout | int | I/O 鏈接超時時間,單位爲毫秒,默認爲永不超時 |
其餘幾個協議也有相似的一系列屬性,如 POP3 的 mail.pop3.host、mail.pop3.port 以及IMAP 的 mail.imap.host、mail.imap.host 等。
Session 是一個很容易被誤解的類,這歸咎於混淆視聽的類名。千萬不要覺得這裏的 Session 像 HttpSession 同樣表明真實的交互會話,但建立 Session 對象時,並無對應的物理鏈接,它只不過是一對配置信息的集合。
Session 的主要做用,包括兩個方面:
郵件操做只有發送或接收兩種處理方式,JavaMail 將這兩種不一樣操做描述爲傳輸(javax.mail.Transport)和存儲(javax.mail.Store),傳輸對應郵件的發送,而存儲對應郵件的接收。
一旦得到 Session 對象,就能夠繼續建立要發送的消息。這由 Message 類來完成。由於 Message 是個抽象類,您必需用一個子類,多數狀況下爲 javax.mail.internet.MimeMessage。MimeMessage 是個能理解 MIME 類型和頭的電子郵件消息,正如不一樣 RFC 中所定義的。雖然在某些頭部域非 ASCII 字符也能被譯碼,但 Message 頭只能被限制爲用 US-ASCII 字符。
一旦您建立了 Session 和 Message,並將內容填入消息後,就能夠用 Address 肯定信件地址了。和 Message 同樣,Address 也是個抽象類。您用的是 javax.mail.internet.InternetAddress 類。若建立的地址只包含電子郵件地址,只要傳遞電子郵件地址到構造器就好了。
與 java 類同樣,JavaMail API 也能夠利用 Authenticator 經過用戶名和密碼訪問受保護的資源。對於 JavaMail API 來講,這些資源就是郵件服務器。JavaMail Authenticator 在 javax.mail 包中,並且它和 java.net 中同名的類 Authenticator 不一樣。二者並不共享同一個 Authenticator,由於 JavaMail API 用於 Java 1.1,它沒有 java.net 類別。要使用 Authenticator,先建立一個抽象類的子類,並從 getPasswordAuthentication() 方法中返回 PasswordAuthentication 實例。建立完成後,您必需向 session 註冊 Authenticator。而後,在須要認證的時候,就會通知 Authenticator。您能夠彈出窗口,也能夠從配置文件中(雖然沒有加密是不安全的)讀取用戶名和密碼,將它們做爲 PasswordAuthentication 對象返回給調用程序。
這裏是以163郵箱爲例
![]()
註冊 163 郵箱,登陸 163 郵箱後,設置郵箱帳戶開通 smtp 服務
![]()
![]()
須要根據註冊時的手機號發送的驗證碼來開通獲取郵箱客戶端受權碼。開通成功後,會顯示我的受權訪問碼,該受權碼是後面經過 Java mail 發送郵件的認證密碼,很是重要。
建立 Maven 項目,在 pom.xml 配置文件中添加 mail 的所需的依賴
<!-- Java Mail --> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artifactId> <version>1.6.2</version> </dependency>
ependency>
<groupId>javax.mail</groupId> <artifactId>javax.mail-api</artifactId> <version>1.6.2</version>
</dependency>
### 後續待更新