Smtp協議與Pop3協議的簡單實現


前言

本文主要介紹smtp與pop3協議的原理,后面會附上對其的簡單封裝與實現。

smtp協議對應的RFC文檔為:RFC821

smtp協議

SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。SMTP協議屬於TCP/IP協議族,它幫助每台計算機在發送或中轉信件時找到下一個目的地。通過SMTP協議所指定的服務器,就可以把E-mail寄到收信人的服務器上了,整個過程只要幾分鍾。SMTP服務器則是遵循SMTP協議的發送郵件服務器,用來發送或中轉發出的電子郵件。(摘自百度百科)

下圖為SMTP協議發送郵件過程

image

用戶在發送郵件時,會先按照SMTP協議,將郵件發送到發送者的SMTP服務器上,接着再由發送者SMTP服務器將郵件發送到接收者的SMTP郵件服務器上,最后由接收者通過pop3協議從接收服務器上將郵件下載下來。

舉個例子,用戶A( aaa@126.com)要向用戶B( bbb@qq.com)發送一封郵件,那么郵件會先發送到發送SMTP服務器上即smtp.126.com,然后由smtp.126.com投送到smtp.qq.com,最后再到bbb@qq.com上。

通過以上描述,相信大家對郵件的收發過程有了一個大致的了解。那么接下來,我們來分析SMTP協議。

SMTP協議定義了smtp服務器的端口,連接過程以及發送郵件過程,我們只要按照協議規定的步驟來即可。

首先,我們需要使用socket來連接smtp的端口,默認端口為25。我們可以使用telnet來連接測試。我們在命令行中輸入telnet smtp.126.com 25 來連接到網易的126郵箱服務器

建立socket連接后,服務器會向我們返回歡迎信息,如下圖所示:

image

接下來我們要向服務器發送用戶名與密碼信息來登陸到郵箱服務器。這里需要注意一點的是,smtp協議是基於字符串的,所以我們的用戶名與密碼要通過base64編碼轉換,這樣就不會出現非法字符問題,后面代碼中我會給中base64編碼與解碼的實現代碼

這里給大家一個在線的base64編碼轉換的網址,大家可以在上面轉碼后復制轉換后的編碼(http://tools.jb51.net/tools/base64_decode-gb2312.php)。

登陸郵件服務器的命令為:

EHLO smtp.126.com\r\n (說明:\r\n代表換行回車操作)

AUTH LOGIN\r\n (說明:登錄命令)

bACtNT55A==\r\n (說明base64編碼后的用戶名)

MTIzYWRmYTEy\r\n (說明base64編碼后的密碼)

image

接下來我們不使用MAIL FROM:<xxx@xxxx.com>命令來告知郵件來自哪。然后使用RCPT TO:<xxxx1@xx.com>命令來告知發給誰,RCPT TO 后面只可以接多個RCPT TO表示向給多個接收者。最后使用DATA命令來傳送編碼后的郵件內容。

在smtp協議中,每條命令以\r\n結束,並且長度小於76,超過部分放入向一條命令。在使用DATA發送命令時,每76個字符一行,直到發送完所有數據。當發送完所有郵件數據時,我們需要告知郵件服務器我們發完數據了。smtp協議里規定,我們在發送完數據后,再發送一個\r\n.\r\n來表明數據發送完畢,示意如下:S代表發送者,R代表接收者,其中注意<CRLF>代表\r\n

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: <CRLF>.<CRLF>

R: 250 OK


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM