电子邮件收发原理和实现(POP3, SMTP)
電子郵件的收發(fā)流程示意圖:
相對于郵件客戶端的流程就是:
郵件接收——POP3協(xié)議
POP3(Post Office Protocol 3,郵局協(xié)議版本3)主要用于支持使用客戶端遠(yuǎn)程管理在服務(wù)器上的電子郵件。該協(xié)議是在RFC-1939中定義的,是Internet上的大多數(shù)人用來接收郵件的機(jī)制。POP3采用Client/Server工作模式,默認(rèn)使用TCP 110端口。
- 在使用POP協(xié)議時,人們熟悉的很多功能,如查看收到了多少新郵件消息的功能,POP根本不支持。這些功能都內(nèi)置到諸如Eudora或 Microsoft Outlook之類的郵件程序中,能為您記住接收的上一封郵件,以及計算有多少新郵件這類信息。因此,如果想獲取這類信息,將需要由自己進(jìn)行計算。
[詳細(xì)請參考wiki的解析:http://zh.wikipedia.org/wiki/POP3 ]
<POP3狀態(tài)圖>
<POP3常用命令表>
- 對大小寫不敏感,以CRLF作為結(jié)束
[詳細(xì)可參考RFC1939協(xié)議,http://www.rfc-ref.org/RFC-TEXTS/1939/contents.html ]
命令可能的返回值
- OK <描述> 成功
- ERR <描述> 失敗
<POP3工作原理>
1) 客戶端使用TCP協(xié)議連接郵件服務(wù)器的110端口;
2) 客戶端使用USER命令將郵箱的賬號傳給POP3服務(wù)器;
3) 客戶端使用PASS命令將郵箱的賬號傳給POP3服務(wù)器;
4) 完成用戶認(rèn)證后,客戶端使用STAT命令請求服務(wù)器返回郵箱的統(tǒng)計資料;
5) 客戶端使用LIST命令列出服務(wù)器里郵件數(shù)量;
6) 客戶端使用RETR命令接收郵件,接收一封后便使用DELE命令將郵件服務(wù)器中的郵件置為刪除狀態(tài);
7) 客戶端發(fā)送QUIT命令,郵件服務(wù)器將將置為刪除標(biāo)志的郵件刪除,連接結(jié)束。
(注:客戶端UA可以設(shè)定將郵件在郵件服務(wù)器上保留備份,而不將其刪除。)
一個基本實(shí)現(xiàn)(Java):
Pop3Test.java (見附件)
郵件發(fā)送——SMTP協(xié)議
SMTP(Simple Message Transfer Protocol,簡單郵件傳輸協(xié)議)是用于傳送電子郵件的機(jī)制。該協(xié)議是在RFC-821中定義的。采用Client/Server工作模式,默認(rèn)使用TCP 25端口。
[詳細(xì)請參考wiki的解析:http://zh.wikipedia.org/wiki/SMTP ]
<SMTP狀態(tài)圖>
<SMTP常用命令表>
- 對大小寫不敏感,以CRLF作為結(jié)束
[詳細(xì)可參考RFC821協(xié)議,中文版鏈接地址:http://www.5dmail.net/rfc/RFC821.txt ]
命令可能的返回值
500 格式錯誤,命令不可識別(此錯誤也包括命令行過長)
501 參數(shù)格式錯誤
502 命令不可實(shí)現(xiàn)
503 錯誤的命令序列
504 命令參數(shù)不可實(shí)現(xiàn)
211 系統(tǒng)狀態(tài)或系統(tǒng)幫助響應(yīng)
214 幫助信息
220 <domain> 服務(wù)就緒
221 <domain> 服務(wù)關(guān)閉傳輸信道
421 <domain> 服務(wù)未就緒,關(guān)閉傳輸信道(當(dāng)必須關(guān)閉時,此應(yīng)答可以作為對任何命令的響應(yīng))
250 要求的郵件操作完成
251 用戶非本地,將轉(zhuǎn)發(fā)向<forward-path>
450 要求的郵件操作未完成,郵箱不可用(例如,郵箱忙)
550 要求的郵件操作未完成,郵箱不可用(例如,郵箱未找到,或不可訪問)
451 放棄要求的操作;處理過程中出錯
551 用戶非本地,請嘗試<forward-path>
452 系統(tǒng)存儲不足,要求的操作未執(zhí)行
552 過量的存儲分配,要求的操作未執(zhí)行
553 郵箱名不可用,要求的操作未執(zhí)行(例如郵箱格式錯誤)
354 開始郵件輸入,以<CRLF>.<CRLF>結(jié)束
554 操作失敗
1.2. 幾個術(shù)語
1.2.1. 郵件
郵件是一種消息的格式,由信封、首部和正文組成。
信封上最重要的是收信人的地址。郵件服務(wù)器用這個地址將郵件發(fā)送到收信人所在的郵件服務(wù)器上。
首部是由用戶代理或郵件服務(wù)器添加的一些信息。包括Received、Message-ID、From、Data、Reply-To、X-Phone、X-Mailer、To和Subject等字段。
正文是是發(fā)送用戶發(fā)給接收用戶報文的內(nèi)容。RFC 822 規(guī)定正文為NVT ASCII文字行。
更為詳細(xì)的說明,請參考RFC821和RFC822等協(xié)議。
1.2.2. 用戶代理
用戶代理UA(User Agent)是用戶與電子郵件系統(tǒng)的交互接口,一般來說它就是我們PC機(jī)上的一個程序。Windows上常見的用戶代理是Foxmail和Outlook Express。
用戶代理提供一個好的用戶界面,它提取用戶在其界面填寫的各項(xiàng)信息,生成一封符合SMTP等郵件標(biāo)準(zhǔn)的郵件,然后采用SMTP協(xié)議將郵件發(fā)送到發(fā)送端郵件服務(wù)器。
1.2.3. 郵件服務(wù)器
郵件服務(wù)器是電子郵件系統(tǒng)的核心,它用來發(fā)送和接收郵件。郵件服務(wù)器不同于普通PC的是它幾乎是全天工作的,所以它可以在任何時候?yàn)橛脩籼峁┓?wù),后面將提到這正是為什么需要郵件服務(wù)器的一個重要原因。很多ISP都提供免費(fèi)的郵件服務(wù)器,如126提供smtp.126.com郵件服務(wù)器。
郵件服務(wù)器向其它郵件服務(wù)器轉(zhuǎn)發(fā)郵件也是采用SMTP協(xié)議。
1.2.4. SMTP和郵件格式的關(guān)系
如前所述,SMTP是客戶機(jī)向服務(wù)器發(fā)送郵件時所使用的協(xié)議,其核心是2.2中所述的命令和響應(yīng),至于它命令和響應(yīng)中所帶的參數(shù)采用什么格式,則是依賴于其他標(biāo)準(zhǔn)的。例如DATA后所帶的參數(shù),則應(yīng)遵循郵件格式標(biāo)準(zhǔn)RFC822.
SMTP和郵件格式的關(guān)系可用這么一個例子來說明。甲與乙書信往來,甲通過郵局向乙發(fā)信,郵局間轉(zhuǎn)交郵件可看成使用了SMTP協(xié)議,至于書信的格式則會因?yàn)榈貐^(qū)習(xí)慣等的不同而不同(中國人的書信格式和美國人的書信格式不同),這個書信格式則可看成是郵件格式標(biāo)準(zhǔn)。
應(yīng)當(dāng)認(rèn)識到不能孤立地看待協(xié)議,各個協(xié)議之間往往存在著耦合關(guān)系,但為了分析方便,我們在具體敘述某個協(xié)議時,只能抓住主要矛盾——主要闡述單個協(xié)議。
1.2.5. 瀏覽器發(fā)送郵件用的什么協(xié)議
瀏覽器如IE、Maxthon可通過登陸用戶郵箱,來收發(fā)郵件,這是怎樣實(shí)現(xiàn)的?例如bripengandre@126.com可通過登陸www.126.com來收發(fā)郵件。
這個過程是這樣的:bripengandre@126.com在www.126.com提供的郵件頁面上填寫的相應(yīng)信息(如發(fā)信人郵箱、收信人郵箱等),通過http協(xié)議被提交給126服務(wù)器;126服務(wù)器根據(jù)這些信息組裝一封符合郵件規(guī)范的郵件(就像用戶代理一樣);然后smtp.126.com通過SMTP協(xié)議將這封郵件發(fā)送到接收端郵件服務(wù)器。
可以看出,瀏覽器發(fā)送郵件只是用戶代理的功能直接放到郵件服務(wù)器上去做了,至于郵件服務(wù)器間發(fā)送郵件還是采用的SMTP協(xié)議。我們看問題,如果有必要還是要適當(dāng)?shù)赝高^現(xiàn)象看本質(zhì)。
1.3. 郵件的收發(fā)過程
一般情況下,一封郵件的發(fā)送和接收過程如下。
1) 發(fā)信人在用戶代理里編輯郵件,包括填寫發(fā)信人郵箱、收信人郵箱和郵件標(biāo)題等等。
2) 用戶代理提取發(fā)信人編輯的信息,生成一封符合郵件格式標(biāo)準(zhǔn)(RFC822)的郵件。
3) 用戶代理用SMTP將郵件發(fā)送到發(fā)送端郵件服務(wù)器(即發(fā)信人郵箱所對應(yīng)的郵件服務(wù)器)。
4) 發(fā)送端郵件服務(wù)器用SMTP將郵件發(fā)送到接收端郵件服務(wù)器(即收信人郵箱所對應(yīng)的郵件服務(wù)器)。
5) 收信人調(diào)用用戶代理。用戶代理用POP3協(xié)議從接收端郵件服務(wù)器取回郵件。
6) 用戶代理解析收到的郵件,以適當(dāng)?shù)男问匠尸F(xiàn)在收信人面前。
第2章. SMTP詳解
<SMTP工作原理>
SMTP,即簡單郵件傳送協(xié)議,所對應(yīng)RFC文檔為RFC821。同http等多數(shù)應(yīng)用層協(xié)議一樣,它工作在C/S模式下,用來實(shí)現(xiàn)因特網(wǎng)上的郵件傳送。SMTP在整個電子郵件通信中所處的位置如圖 1所示。
可以看出,SMTP是用來將客戶機(jī)上的郵件傳送到服務(wù)器上。這里的客戶機(jī)是指某次連接中的發(fā)送方,服務(wù)器是指相應(yīng)的接收方。在講解發(fā)送郵件的整個通信過程前,先解釋一下面幾個術(shù)語。
2.1. 通信過程
一個具體的SMTP通信(如發(fā)送端郵件服務(wù)器與接收端服務(wù)器的通信)的過程如下。
1) 發(fā)送端郵件服務(wù)器(以下簡稱客戶端)與接收端郵件服務(wù)器(以下簡稱服務(wù)器)的25號端口建立TCP連接。
2) 客戶端向服務(wù)器發(fā)送各種命令,來請求各種服務(wù)(如認(rèn)證、指定發(fā)送人和接收人)。
3) 服務(wù)器解析用戶的命令,做出相應(yīng)動作并返回給客戶端一個響應(yīng)。
4) 2)和3)交替進(jìn)行,直到所有郵件都發(fā)送完或兩者的連接被意外中斷。
從這個過程看出,命令和響應(yīng)是SMTP協(xié)議的重點(diǎn),下面將予以重點(diǎn)講述。
2.2. 命令和響應(yīng)
2.2.1. 格式
SMTP的命令不多(14個),它的一般形式是:COMMAND [Parameter] <CRLF>。其中COMMAND是ASCII形式的命令名,Parameter是相應(yīng)的命令參數(shù),<CRLF>是回車換行符(0DH, 0AH)。
SMTP的響應(yīng)也不復(fù)雜,它的一般形式是:XXX Readable Illustration。XXX是三位十進(jìn)制數(shù);Readable Illustration是可讀的解釋說明,用來表明命令是否成功等。XXX具有如下的規(guī)律:以2開頭的表示成功,以4和5開頭的表示失敗,以3開頭的表示未完成(進(jìn)行中)。
2.2.2. 一個例子
命令和響應(yīng)的格式是語法,各命令和響應(yīng)的意思則是語義,各命令和各響應(yīng)在時間上的關(guān)系則是同步。下面將通過一個簡單的SMTP通信過程來說明協(xié)議的這三個要素。
C:telnet smtp.126.com 25 / 以telnet方式連接126郵件服務(wù)器 /
S:220 126.com Anti-spam GT for Coremail System (126com[071018]) / 220為響應(yīng)數(shù)字,其后的為歡迎信息,會應(yīng)服務(wù)器不同而不同/
C:HELO smtp.126.com / HELO 后用來填寫返回域名(具體含義請參閱RFC821),但該命令并不檢查后面的參數(shù)/
S:250 OK
C: MAIL FROM: bripengandre@126.com / 發(fā)送者郵箱 /
S:250 … ./ “…”代表省略了一些可讀信息 /
C:RCPT TO: bripengandre@smail.hust.edu.cn / 接收者郵箱 /
S:250 … ./ “…”代表省略了一些可讀信息 /
C:DATA / 請求發(fā)送數(shù)據(jù) /
S:354 Enter mail, end with "." on a line by itself
C:Enjoy Protocol Studing
C:.
S:250 Message sent
C:QUIT / 退出連接 /
S:221 Bye
分析上面的過程可參考注釋進(jìn)行,這里要補(bǔ)充如下幾點(diǎn)。
1) “C:”開頭的行(不包括"C:")是客戶端的輸入,而以“S:”開頭的行(不包括"S:")則是服務(wù)器的輸出。
2) 上述的命令并不一定會一次性成功,服務(wù)器會返回錯誤響應(yīng),客戶端應(yīng)該按照協(xié)議規(guī)定的時序,來輸入后續(xù)的命令(或重復(fù)執(zhí)行失敗的命令,或重置會話,或退出會話等等)。
2.2.3. 常用命令
SMTP命令不區(qū)分大小寫,但參數(shù)區(qū)分大小寫,有關(guān)這方面的詳細(xì)說明請參考RFC821。常用的命令如下。
HELO <domain> <CRLF>。向服務(wù)器標(biāo)識用戶身份發(fā)送者能欺騙,說謊,但一般情況下服務(wù)器都能檢測到。
MAIL FROM: <reverse-path> <CRLF>。<reverse-path>為發(fā)送者地址,此命令用來初始化郵件傳輸,即用來對所有的狀態(tài)和緩沖區(qū)進(jìn)行初始化。
RCPT TO:<forward-path> <CRLF>。 <forward-path>用來標(biāo)志郵件接收者的地址,常用在MAIL FROM后,可以有多個RCPT TO。
DATA <CRLF>。將之后的數(shù)據(jù)作為數(shù)據(jù)發(fā)送,以<CRLF>.<CRLF>標(biāo)志數(shù)據(jù)的結(jié)尾。
REST <CRLF>。重置會話,當(dāng)前傳輸被取消。
NOOP <CRLF>。要求服務(wù)器返回OK應(yīng)答,一般用作測試。
QUIT <CRLF>。結(jié)束會話。
VRFY <string> <CRLF>。驗(yàn)證指定的郵箱是否存在,由于安全方面的原因,服務(wù)器大多禁止此命令。
EXPN <string> <CRLF>。驗(yàn)證給定的郵箱列表是否存在,由于安全方面的原因,服務(wù)器大多禁止此命令。
HELP <CRLF>。查詢服務(wù)器支持什么命令。
2.2.4. 常用響應(yīng)
常用的響應(yīng)如下所示,數(shù)字后的說明是從英文譯過來的。更詳細(xì)的說明請參考RFC821。
501參數(shù)格式錯誤
502命令不可實(shí)現(xiàn)
503錯誤的命令序列
504命令參數(shù)不可實(shí)現(xiàn)
211系統(tǒng)狀態(tài)或系統(tǒng)幫助響應(yīng)
214幫助信息
220<domain>服務(wù)就緒
221<domain>服務(wù)關(guān)閉
421<domain>服務(wù)未就緒,關(guān)閉傳輸信道
250要求的郵件操作完成
251用戶非本地,將轉(zhuǎn)發(fā)向<forward-path>
450要求的郵件操作未完成,郵箱不可用
550要求的郵件操作未完成,郵箱不可用
451放棄要求的操作;處理過程中出錯
551用戶非本地,請嘗試<forward-path>
452系統(tǒng)存儲不足,要求的操作未執(zhí)行
552過量的存儲分配,要求的操作未執(zhí)行
553郵箱名不可用,要求的操作未執(zhí)行
354開始郵件輸入,以"."結(jié)束
554操作失敗
轉(zhuǎn)自:https://blog.csdn.net/ly930156123/article/details/51657509
轉(zhuǎn)自:http://univasity.iteye.com/blog/1173296
轉(zhuǎn)載于:https://blog.51cto.com/fandecorator/2105730
總結(jié)
以上是生活随笔為你收集整理的电子邮件收发原理和实现(POP3, SMTP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql 索引 n-gram分词引擎
- 下一篇: 01-2.C(C程序编译步骤-gcc 编