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