電子郵件的基本概念介紹
電子郵件用于網上的信心傳遞和交流,它是最重要的Internet服務之一。據統計Internet有30%的業務是電子郵件有關的。同時我們也不可否認它在我們的日常生活、工作辦公方面扮演著很重要的角色。譬如:許多辦公自動化項目(OA)中都要附帶發送郵件的功能,如果還要使用OutLook等手工方式就不適合,在這個高速的時代,我們需要提供工作效率,讓工作能夠自動化。同時在許多網站中也都需要附帶發送郵件的功能:給新注冊的用戶發送一封包含其注冊信息的歡迎E-Mail、將網站的最新活動信息通過E-Mail發送給所有的注冊會員等等。
在開始電子郵件開發前:我們需要明白一下幾個概念:電子郵件系統、郵件服務器、電子郵件、郵件客戶端軟件、郵件傳輸協議、電子郵件的傳輸過程。
電子郵件系統
與傳統的郵政服務相類似,電子郵件系統由電子郵局、電子郵件發送、接收系統組成。發送者和接收者通過電子郵件發送、接收系統來發送和接收電子郵件,他們實際上是運行在計算機上的郵件客戶端程序。電子郵局起著一個橋梁的作用,它實際上是運行在服務器上的郵件服務器程序。電子郵件的處理流程也和郵政服務相類似。
郵件服務器
郵件服務器是一種用來負責電子郵件收發管理的設備。在Internet上提供了大量的電子郵件服務器,如:126、163、hotmail…。
電子郵件服務器主要提供的功能:
1、 接收用戶投遞的郵件。
2、 將用戶投遞進來的郵件轉發給目標郵件服務器。
3、 接收其他電子郵件服務器轉發來的郵件并該郵件存儲到其管理的用戶郵中。
4、 為前來讀取郵件的用戶提供讀取郵件的服務。
郵件服務器構成了電子郵件系統的核心。每個收信人都有一個位于某個郵件服務器上的郵箱(mailbox)。Bob的郵箱用于管理和維護已經發送給他的郵件消息。一個郵件消息的典型旅程是從發信人的用戶代理開始,郵件發信人的郵件服務器,中轉到收信人的郵件服務器,然后投遞到收信人的郵箱中。當Bob想查看自己的郵箱中的郵件消息時,存放該郵箱的郵件服務器將以他提供的用戶名和口令認證他。Alice的郵件服務器還得處理Bob的郵件服務器出故障的情況。如果Alice的郵件服務器無法把郵件消息立即遞送到Bob的郵件服務器,Alice的服務器就把它們存放在消息隊列(message queue)中,以后再嘗試遞送。這種嘗試通常每30分鐘左右執行一次:要是過了若干天仍未嘗試成功,該服務器就把這個消息從消息隊列中去除掉,同時以另一個郵件消息通知發信人(即Alice)。
電子郵件
電子郵件是一種通過網絡實現相互傳送和接收信息的現代化通信方式。它是—種用電子手段提供信息交換的通信方式,是Internet應用最廣的服務,通過網絡的電子郵件系統,用戶可以用非常低廉的價格,以非常快速的方式,與世界上任何一個角落的網絡用戶聯系,這些電子郵件可以是文字、圖像、聲音等各種方式。同時,用戶可以得到大量免費的新聞、專題郵件,并實現輕松的信息搜索。
電子郵件由信封和內容兩個部分組成。信封又稱郵件頭,電子郵件服務器根據信封上的信心來傳遞郵件的。內容稱為郵件體,它用于提供郵件的具體內容。
Internet上的電子郵件地址全球唯一,其格式為“郵箱名@郵件服務器域名”。域(郵件域)是電子郵件服務器的基本管理單位,郵件服務以域為基礎,每個郵箱對應一個用戶。其中郵件服務器域名必須是已注冊的DNS域名,并且必須要與MX(郵件交換機)記錄匹配。DNS用于將域名、主機名解析為IP地址。MX記錄指向該域名的郵件服務器主機記錄,為郵件服務專用。
郵件客戶端軟件
郵件客戶端軟件負責與郵件服務器通訊,主要用于幫助用戶將郵件發送給SMTP服務器和POP3/IMAP郵件服務器讀取用戶的電子郵件。郵件客戶端軟件通常集撰寫、發送、接收郵件于一體。
電子郵箱
每一個電子郵件服務器之上都可以開始多個電子郵箱,電子郵箱也稱之為E-Mail地址。它類似于現實生活中的通訊地址,用戶通過它接受別人發來的電子郵件和向別人發送電子郵件。
電子郵箱的獲得需要在電子郵件服務器上進行申請,確切的說,電子郵箱其實就是用戶在郵件服務器上申請的一個賬戶。郵件服務器把接收到的郵件保持到為某個賬戶所分配的郵箱空間中,用戶通過其申請的用戶名和密碼登陸到郵件服務器上查看該地址已經收到的電子郵件。
電子郵件的傳輸過程
電子郵件系統采用客戶/服務器模式。電子郵件傳送需要用到以下3個重要模塊:
UA(Mail User Agent,郵件用戶代理):用戶通過它與電子郵件服務器打交道。MUA實際上就是郵件客戶端軟件。
MTA(Mail Transfer Agent,郵件傳輸代理):它主要負責處理所有接收和發送的郵件,為MUA或者MTA提供郵件發送服務,接收其他MTA發送過來的郵件。
MDA(Mail Delivery Agent,郵件投遞代理):它負責郵件本地投遞。當MTA決定某郵件發送本地用戶時,MTA將郵件交給MDA程序進行分發,也就是說投遞到用戶的。
具體的傳遞過程如下:
1、 發件人利用MUA將郵件發送給MTA。
2、 MTA收到郵件后判斷收件人是不是本地賬戶,如果是本地賬戶,交由MDA投送到該賬戶的郵箱中,完成發送過程,跳到第5步。如果不是則執行下一步驟。
3、 MTA根據其郵件中繼轉發設置來決定如何轉發郵件。
4、 最終目的的MTA將受到的交給他的MDA處理,有MDA將郵件投遞到收件人的郵箱中。
5、 收件人利用MUA通過POP/IMAP協議連接到郵箱所在的服務器,請求查看自己的收件箱是否有郵件,如果有郵件,將會通過它傳送個收件人的MUA。
注意:提示郵件訪問服務的是POP或者IMAP服務器軟件,而并非當初收下郵件的MTA,兩者的角色是分離的。
郵件傳輸協議
電子郵件服務傳輸主要是用到以下3中網絡協議
SMTP(簡單郵件傳輸協議)
SMTP是Simple Mail Transfer Protocol。標準TCP端口是25。MUA將郵件發送到MTA,MTA將郵件發送給下一個MTA,都是要使用SMTP。SMTP的目標是可靠高效地傳送郵件,它獨立于傳送子系統而且僅要求一條可以保證傳送數據單元順序的通道。
SMTP是一個“單向”的協議,它不能用戶從其他郵件服務器收取郵件。它本身是采用客戶/服務器模式,負責發送郵件的SMTP進程就是SMTP客戶端,負責接收郵件的SMTP進程就是SMTP服務器。一個完整的SMTP通信過程主要包括建立連接、傳送郵件、釋放連接三個過程。
建立連接:首先由發件人將要發送的郵件發送到郵件緩存,SMTP客戶端定期掃描郵件緩存,一旦發現有郵件,就與SMTP服務器建立TCP連接,然后發送HRLLO命令以附上發送方的主機名。
傳送郵件:SMTP客戶端使用MAIL命令開始傳送郵件,該命令提供發件人的地址;然后執行RCPT命令,并提供收件人地址;最后執行DATA命令傳送郵件內容。
釋放連接:郵件傳送完畢后,SMTP客戶端發送OUT命令請求關閉TCP連接。
POP(郵局協議)
POP是Post Office Protocol。標準TCP端口為110。主要用于電子郵件的接收。MUA經由POP協議連接到MTA的用戶收件箱,以讀取或下載用戶在收件箱中郵件。
目前用的較多的POP協議是POP3。POP3使用 TCP 作為傳輸協議。
IMAP(Internet信息訪問協議)
IMAP是Internet Message Access Protocol。標準TCP端口為143,它也是讓MUA從MTA收取郵件。目標球IMAP協議的版本為IMAP4。
POP和IMAP兩者都可以用于收取郵件,都是采用客戶/服務器模式,兩者最主要的區別就在于他們檢索郵件的方式不同。使用POP時,郵件駐留在服務器中個,一旦接收郵件,郵件都從服務器上下載到用戶計算機上。而IMAP則能夠然該用戶了解到服務器上存儲郵件的情況,已下載的郵件仍然滯留在服務器中,以便于實現郵件歸檔和共享。
JavaMail
一、JavaMail簡介
JavaMail,顧名思義,提供給開發者處理電子郵件相關的編程接口。它是Sun發布的用來處理email的API。它可以方便地執行一些常用的郵件傳輸。JavaMail API是Sun公司為方便Java開發人員在應用程序中實現郵件發送和接收功能而提供的一套標準開發包,它支持一些常用的郵件協議,如:SMTP、POP3、IMAP。開發人員使用JavaMail API編寫郵件處理軟件時,無須考慮郵件協議底層的實現細節,只要調用JavaMail開發包中相應的API類就可以了。
二、JavaMail開發環境
在進行JavaMail開發之前必須要導入相應的jar包。該jar包可以到oracle的官網上面下載:http://www.oracle.com/technetwork/java/javamail/index.html。
下載完成后解壓可以得到如下一個目錄:
其中mail.jar:就是開發javamail程序所必須要用到的核心開發包。
lib子目錄:該目錄下包含5個獨立的郵件開發包:smtp.jar、pop3.jar、imap.jar和mailapi.jar,這5個jar文件是對mail.jar文件的分類包裝。其中mailapi.jar封裝了創建郵件內容和面向普通開發人員調用郵件發送和接收的API類,其它三個jar文件則是封裝了它們名稱相對應協議的服務實現程序。。在編譯Java郵件程序時,只需要mailapi.jar文件即可,但是,在運行時必須要有相應郵件協議的底層服務實現程序。如果應用程序中只需要使用到郵件發送功能,則可以只安裝smtp.jar和mailapi.jar這兩個文件,如果應用程序只需要使用郵件的接收功能,則可以只安裝pop3.jar或imap.jar和mailapi.jar這兩個jar文件,而不用安裝整個mail.jar文件。
Lib目錄如下:
三、JavaMail API的介紹
JavaMail API按其功能劃分通常分為如下三大類“:
1、創建和解析郵件內容的API。Message類是創建和解析郵件的核心API。它的實例對象代表了一封電子郵件。
2、發送郵件的API。Transport類是發送郵件的核心API類,它的實例對象代表實現了某個郵件發送協議的郵件發送對象,如SMTP協議。
3、接收郵件的API。Store類是接收郵件的核心API類,它的實例對象代表了實現某個郵件接收協議的郵件接收對象,例如POP3協議。
JavaMail的工作流程如下:
在這個工作流程中,Message、Session、Transport、Store四個對象緊密相連的完成一封電子郵件的發送和接收。我們只需要了解這個四個核心API的功能和作用,知道他們的工作關系和電子郵件的工作流程,就能夠很容易的編寫出JavaMail來了。對于JavaMail的輔助類而言,當我們需要他們的時候可以順藤摸瓜,查看文檔來解決。
核心API的介紹:
Message
Message 類是創建和解析郵件的核心API,它的實例對象代表一封電子郵件。在客戶端發送郵件時,先穿件郵件的API,將創建的郵件的數據封裝到Message對象中,然后把這個對象傳遞給郵件發送API發送出去。在客戶端接收到郵件時,郵件接收API把接收的油價數據裝在Message的實例對象中,客戶端在使用郵件解析API從這個對象中解析出來接收到的郵件數據。
Session
Session 類用于定義整個應用程序所需的環境信息,以及收集客戶端與郵件服務器建立網絡連接的會話信息,如郵件服務器的主機名、端口號、采用的郵件發送和接收協議等。Session對象根據這些會話信息構建郵件收發的Store和Transport對象,以及為客戶端創建Message對象提供信息支持。
Transport
Transport 類是發送郵件的核心API類,它的實例對象,代表實現了某個郵件發送協議的郵件發送對象,例如SMTP 協議。客戶端程序創建好Message對象后,只需要使用郵件發送API得到 Transport 對象,然后把 Message 對象傳遞給 Transport 對象,并調用它的發送方法,就可以把郵件發送給指定的SMTP服務器。
Store
Store 類是接收郵件的核心API類,它的實例對象代表實現某個郵件接收協議的郵件接收對象,例如POP3和IMAP協議。客戶端程序接收郵件時,只需要使用郵件接收API得到Store對象,然后調用Store對象的接收方法,就可以從指定的 POP3服務器中獲得郵件數據,并把這些郵件數據封裝到表示郵件的Message對象中。
四、實例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class JavaMail_01 { public static void main(String[] args) throws Exception { Properties props = new Properties(); props.setProperty( "mail.smtp.auth" , "true" ); props.setProperty( "mail.transport.protocol" , "smtp" ); Session session = Session.getInstance(props); session.setDebug( true ); Message msg = new MimeMessage(session); msg.setSubject( "這是一個測試程序...." ); msg.setText( "你好!這是我的第一個javamail程序---陳明" ); msg.setFrom( new InternetAddress( "******@163.com" )); Transport transport = session.getTransport(); transport.connect( "smtp.163.com" , 25 , "*******" , "********" ); transport.sendMessage(msg, new Address[]{ new InternetAddress( "chenssy995812509@sina.cn" )}); System.out.println( "郵件發送成功..." ); transport.close(); } } |