新聞中心 News
qq郵箱郵箱解答幫助中心騰訊通(RTX)相關新聞
新聞中心當前位置:首頁>新聞中心

電子郵件SMTP協議原始命令碼和工作原理

發布時間:2013-02-06  瀏覽次數:684  次

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


 
SMTP協議的基本介紹

 
SMTP 是一種TCP協議支持的提供可靠且有效電子郵件傳輸的應用層協議。SMTP 是建立在 TCP上的一種郵件服務,主要用于傳輸系統之間的郵件信息并提供來信有關的通知。

 
SMTP 獨立于特定的傳輸子系統,且只需要可靠有序的數據流信道支持。SMTP 重要特性之一是其能跨越網絡傳輸郵件,即“ SMTP 郵件中繼”。通常,一個網絡可以由公用互聯網上 TCP 可相互訪問的主機、防火墻分隔的 TCP/IP 網絡上 TCP 可相互訪問的主機,及其它 LAN/WAN 中的主機利用非 TCP 傳輸層協議組成。使用 SMTP ,可實現相同網絡上處理機之間的郵件傳輸,也可通過中繼器或網關實現某處理機與其它網絡之間的郵件傳輸。

 
在這種方式下,郵件的發送可能經過從發送端到接收端路徑上的大量中間中繼器或網關主機。域名服務系統(DNS)的郵件交換服務器可以用來識別出傳輸郵件的下一條 IP 地址。

 
在傳輸文件過程中使用端口:25

 
SMTP是因特網電子郵件系統首要的應用層協議。它使用由TCP提供的可靠的數據傳輸服務把郵件消息從發信人的郵件服務器傳送到收信人的郵件服務器。跟大多數應用層協議一樣,SMTP也存在兩個端:在發信人的郵件服務器上執行的客戶端和在收信人的郵件服務器上執行的服務器端。SMTP的客戶端和服務器端同時運行在每個郵件服務器上。當一個郵件服 務器在向其他郵件服務器發送郵件消息時,它是作為SMTP客戶在運行。當一個郵件服務器從其他郵件服務器接收郵件消息時,它是作為SMTP服務器在運行。

 
SMTP協議與人們用于面對面交互的禮儀之間有許多相似之處。首先,運行在發送端郵件服務器主機上的SMTP客戶,發起建立一個到運行在接收端郵件服務 器主機上的SMTP服務器端口號25之間的TCP連接。如果接收郵件服務器當前不在工作,SMTP客戶就等待一段時間后再嘗試建立該連接。這個連接建立之后,SMTP客戶和服務器先執行一些應用層握手操作。就像人們在轉手東西之前往往先自我介紹那樣,SMTP客戶和服務器也在傳送信息之前先自我介紹一下。 在這個SMTP握手階段,SMTP客戶向服務器分別指出發信人和收信人的電子郵件地址。彼此自我介紹完畢之后,客戶發出郵件消息。SMTP可以指望由 TCP提供的可靠數據傳輸服務把該消息無錯地傳送到服務器。如果客戶還有其他郵件消息需發送到同一個服務器,它就在同一個TCP連接上重復上述過程;否 則,它就指示TCP關閉該連接。

 
SMTP被用來在因特網上傳遞電子郵件。文件RFC821規定了該協議的所有細節。但是你只須記住下面的內容--該協議的基本命令和方法就行了。 

 
協議的原理很簡單。無非是一個客戶端計算機向服務器發送命令,然后服務器向客戶端計算機返回一些信息。客房端發送的命令以及服務器的回應都是字符串,你并不需要特別的軟件就能讀出它們。如果你仔細看過WinsockTerminal示例程序的源代碼,你就會發現這一點。現在讓我們用這個示例程序來向自己發一封電子郵件吧。 

 
運行示例程序,單擊"Connect"按鈕,在"Connectto..."對話框中輸入你的電子郵件服務器的地址,選擇SMTP選項。最后按"Connect"按鈕。如果連接成功,Winsock控件會產生Connected事件,在狀態欄中也可看到連接成功的信息。在主文本窗口中你將看到從服務器返回的文本。該文本包含一個三位數的代碼及描述,例如: 

 
220-ns.cinfo.ruSendmail8.6.12/8.6.9readyatWed,22Apr199822:54:41+0300 
220ESMTPspokenhere 

 
不必太過留意這些描述。因為這些描述可能會因服務器而異。你只須要知道代碼所代表的意思就行了。代碼220表示成功建立連接,服務器等待你的第一個命令。 

 
向服務器傳遞的第一個命令是HELO.該命令包含一個參數,即你的郵箱名。 

 
HELOoleg 

 
注意:在RFC821中,HELO是一個可選擇性命令,如果服務器不要求該命令的話,你可以把它忽略掉。 

 
如果命令成功,服務器會返回一個代碼為250的回應。下一步用MAILFROM命令告訴服務器你想發一封郵件。該命令以發信人的郵件地址為參數。 

 
MAILFROM : [email][email protected][/email] 

 
發完命令后,如果服務器返回一個代碼為250回應,你就可以向服務器發送RCPTTO命令了。該命令以收信人地址為參數,一看便知是告訴服務器你想將郵件發到收信人地址處。 

 
RCPTTO : [email][email protected][/email] 

 
如果你想將郵件發給多個收件人的話。你需要多次使用RCPTTO命令,對每個命令,服務器都會返回代碼為250的回應。 

 
現在你可以向服務器發送郵件正文了。用DATA命令告訴服務器以下的內容為郵件正文。在你從服務器收到代碼為354的回應后,你就可以發送郵件正文了。郵件按行發送,每行郵件以一個無回車的換行符結束(在VB中就是vbLf)示例程序知道何時使用換行符,何時使用回車加換行符。所以你只須按回車鍵就行了。下面是一個例子: 

 
Subject : Myfirste-mailmessage. 

 
Firstlineofamessage. 
Secondline. 

 
注意上面最后一行的最后一個字符是一個小數點。這是正文結束的標志。用VB代碼表示就是vbLf&"."&vbCrLf.服務器收到這個標志后,就會立即向你返回一個代碼為250的回應以及該郵件的唯一ID號。 

 
250WAA10568Messageacceptedfordelivery 

 
任務完成了,你可以繼續發送下封郵件,也可以斷開同服務器的連接。如果要斷開同服務器的連接就用QUIT命令。在這種情況下,服務器會返回一個代碼為221的回應并斷開連接。 

 
SMTP協議原始命令碼和工作原理 

 
1.SMTP是工作在兩種情況下:

 
一是電子郵件從客戶機傳輸到服務器;二是從某一個服務器傳輸到另一個服務器 

 
2.SMTP是個請求/響應協議,命令和響應都是基于ASCII文本,并以CR和LF符結束。響應包括一個表示返 
回狀態的三位數字代碼 

 
3.SMTP在TCP協議25號端口監聽連接請求 

 
4.連接和發送過程: 

 
a.建立TCP連接 
b.客戶端發送HELO命令以標識發件人自己的身份,然后客戶端發送MAIL命令 
服務器端正希望以OK作為響應,表明準備接收 
c.客戶端發送RCPT命令,以標識該電子郵件的計劃接收人,可以有多個RCPT行 
服務器端則表示是否愿意為收件人接受郵件 
d.協商結束,發送郵件,用命令DATA發送 
e. 以.表示結束輸入內容一起發送出去 
f.結束此次發送,用QUIT命令退出。 

 
5.另外兩個命令: 

 
VRFY---用于驗證給定的用戶郵箱是否存在,以及接收關于該用戶的詳細信息。 
EXPN---用于擴充郵件列表。 

 
6.郵件路由過程: 

 
SMTP服務器基于‘域名服務DNS中計劃收件人的域名來路由電子郵件。SMTP服務器基于DNS中的MX記錄 
來路由電子郵件,MX記錄注冊了域名和相關的SMTP中繼主機,屬于該域的電子郵件都應向該主機發送。 

 
若SMTP服務器mail.abc.com收到一封信要發到[email][email protected][/email]: 

 
a.Sendmail請求DNS給出主機sh.abc.com的CNAME記錄,如有,假若CNAME到shmail.abc.com,則再次 
請求shmail.abc.com的CNAME記錄,直到沒有為止 
b.假定被CNAME到shmail.abc.com,然后sendmail請求@abc.com域的DNS給出shmail.abc.com的MX記錄, 
shmail MX 5 shmail.abc.com 
10 shmail2.abc.com 
c. Sendmail最后請求DNS給出shmail.abc.com的A記錄,即IP地址,若返回值為1.2.3.4 
d. Sendmail與1.2.3.4連接,傳送這封給[email][email protected][/email]的信到1.2.3.4這臺服務器的SMTP后臺程序 

 
7.SMTP基本命令集: 

 
命令        描述 
------------------------------ 
HELO 向服務器標識用戶身份 
發送者能欺騙,說謊,但一般情況下服務器都能檢測到。 

 
MAIL 初始化郵件傳輸 
mail from: 
RCPT 標識單個的郵件接收人;常在MAIL命令后面 
可有多個rcpt to: 
DATA 在單個或多個RCPT命令后,表示所有的郵件接收人已標識,并初始化數據傳輸,以.結束。 
VRFY 用于驗證指定的用戶/郵箱是否存在;由于安全方面的原因,服務器常禁止此命令 
EXPN 驗證給定的郵箱列表是否存在,擴充郵箱列表,也常被禁用 
HELP 查詢服務器支持什么命令 
NOOP 無操作,服務器應響應OK 
QUIT 結束會話 
RSET 重置會話,當前傳輸被取消 
-------------------------------- 

 
8. MAIL FROM命令中指定的地址是稱作 envelope from地址,不需要和發送者自己的地址是一致的。 
RCPT TO 與之等同,指明的接收者地址稱為envelope to地址,而與實際的to:行是什么無關。 

 
9.為什么沒有RCPT CC和RCPT BCC:? 
所有的接收者協商都通過RCPT TO命令來實現,如果是BCC,則協商發送后在對方接收時被刪掉信封接收者 

 
10.郵件被分為信封部分,信頭部分和信體部分 
envelope from, envelope to 與message from:, message to:完全不相干。 
evnelope是由服務器主機間SMTP后臺提供的,而message from/to是由用戶提供的。有無冒號也是區別。 

 
11. 怎樣由信封部分檢查是否一封信是否是偽造的? 
a. received行的關聯性。 
現在的SMTP郵件傳輸系統,在信封部分除了兩端的內部主機處理的之個,考慮兩個公司防火墻之間 
的部分,若兩臺防火墻機器分別為A和B,但接收者檢查信封received:行時發現經過了C.則是偽造的。 
b. received :行中的主機和IP地址對是否對應如: 
Receibed : from galangal.org (turmeric.com [104.128.23.115] by mail .bieberdorf.edu.... 
c. 被人手動添加在最后面的received行: 
Received : from galangal.org ([104.128.23.115]) by mail .bieberdorf.edu (8.8.5) 
Received : from lemongrass.org by galangal.org (8.7.3) 
Received : from graprao.com by lemongrass.org (8.6.4) 

SMTP協議通訊模型 

 
SMTP協議是TCP/IP協議族中的一員,主要對如何將電子郵件從發送方地址傳送到接收方地址,也即是對傳輸的規則做了規定。SMTP協議的通信模型并不復雜,主要工作集中在發送SMTP和接收SMTP上:首先針對用戶發出的郵件請求,由發送SMTP建立一條連接到接收SMTP的雙工通訊鏈路,這里的接收SMTP是相對于發送SMTP而言的,實際上它既可以是最終的接收者也可以是中間傳送者。發送SMTP負責向接收SMTP發送SMTP命令,而接收SMTP則負責接收并反饋應答。可大致用下面的通訊模型示意圖來表示: 


 
SMTP協議的命令和應答 

 
從前面的通訊模型可以看出SMTP協議在發送SMTP和接收SMTP之間的會話是靠發送SMTP的SMTP命令和接收SMTP反饋的應答來完成的。在通訊鏈路建立后,發送SMTP發送MAIL命令指令郵件發送者,若接收SMTP此時可以接收郵件則作出OK的應答,然后發送SMTP繼續發出RCPT命令以確認郵件是否收到,如果接收到就作出OK的應答,否則就發出拒絕接收應答,但這并不會對整個郵件操作造成影響。雙方如此反復多次,直至郵件處理完畢。SMTP協議共包含10個SMTP命令,列表如下: 

 
SMTP命令命令說明 

 
HELLO<domain><CRLF>識別發送方到接收SMTP的一個HELLO命令 
MAILFROM :<reverse-path><CRLF><reverse-path>為發送者地址。此命令告訴接收方一個新郵件發送的開始,并對所有的狀態和緩沖區進行初始化。此命令開始一個郵件傳輸處理,最終完成將郵件數據傳送到一個或多個郵箱中。 
RCPTTO :<forward-path><CRLF><forward-path>標識各個郵件接收者的地址 
DATA<CRLF> 
接收SMTP將把其后的行為看作郵件數據去處理,以<CRLF>.<CRLF>標識數據的結尾。 
REST<CRLF>退出/復位當前的郵件傳輸 
NOOP<CRLF>要求接收SMTP僅做OK應答。(用于測試) 
QUIT<CRLF>要求接收SMTP返回一個OK應答并關閉傳輸。 
VRFY<string><CRLF>驗證指定的郵箱是否存在,由于安全因素,服務器多禁止此命令。 
EXPN<string><CRLF>驗證給定的郵箱列表是否存在,擴充郵箱列表,也常禁止使用。 
HELP<CRLF>查詢服務器支持什么命令 

 
注:<CRLF>為回車、換行,ASCII碼分別為13、10(十進制)。 

 
SMTP協議的每一個命令都會返回一個應答碼,應答碼的每一個數字都是有特定含義的,如第一位數字為2時表示命令成功;為5表失敗;3表沒有完成。一些較復雜的郵件程序利用該特點,首先檢查應答碼的首數字,并根據其值來決定下一步的動作。下面將SMTP的應答碼列表如下: 

 
應答碼說明 

 
501參數格式錯誤 
502命令不可實現 
503錯誤的命令序列 
504命令參數不可實現 
211系統狀態或系統幫助響應 
214幫助信息 
220<domain>服務就緒 
221<domain>服務關閉 
421<domain>服務未就緒,關閉傳輸信道 
250要求的郵件操作完成 
251用戶非本地,將轉發向<forward-path> 
450要求的郵件操作未完成,郵箱不可用 
550要求的郵件操作未完成,郵箱不可用 
451放棄要求的操作;處理過程中出錯 
551用戶非本地,請嘗試<forward-path> 
452系統存儲不足,要求的操作未執行 
552過量的存儲分配,要求的操作未執行 
553郵箱名不可用,要求的操作未執行 
354開始郵件輸入,以"."結束 
554操作失敗

 
SMTP通信舉例

 
在發送方(客戶端)和接收方(服務器)間建立連接之后,接下來是一個合法的SMTP會話。在下面的對話中,所有客戶端發送的都以“C:”作為前綴,所有服務器發送的都以“S:”作為前綴。在多數計算機系統上,可以在發送的機器上使用telnet命令來建立連接,比如:
telnet www.example.com 25
它打開一個從發送的機器到主機www.example.com的SMTP連接。
S: 220 www.example.com ESMTP Postfix
C: HELO mydomain.com
S: 250 Hello mydomain.com
C: MAIL FROM: <[email protected]>
S: 250 Ok
C: RCPT TO: <[email protected]>
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: Subject: test message
C: From:""< [email protected]>
C:
C: Hello,
C: This is a test.
C: Goodbye.
C: .
S: 250 Ok: queued as 12345
C: quit
S: 221 Bye
雖然是可選的,但幾乎所有的客戶端都會使用EHLO問候消息(而不是上面所示的HELO)來詢問服務器支持何種SMTP擴展,郵件的文本體(接著DATA)一般是典型的MIME格式。

 
SMTP安全和垃圾郵件

 
最初的SMTP的局限之一在于它沒有對發送方進行身份驗證的機制。因此,后來定義了SMTP-AUTH擴展。
盡管有了身份認證機制,垃圾郵件仍然是一個主要的問題。但由于龐大的SMTP安裝數量帶來的網絡效應,大刀闊斧地修改或完全替代SMTP被認為是不現實的。Internet Mail 2000就是一個替代SMTP的建議方案。
因此,出現了一些同SMTP工作的輔助協議。IRTF的反垃圾郵件研究小組正在研究一些建議方案,以提供簡單、靈活、輕量級的、可升級的源端認證。最有可能被接受的建議方案是發送方策略框架協議。

 
維基百科對于SMTP協議介紹

 
簡單郵件傳輸協議 (Simple Mail Transfer Protocol, SMTP) 是事實上的在Internet傳輸email的標準。

 
SMTP是一個相對簡單的基于文本的協議。在其之上指定了一條消息的一個或多個接收者(在大多數情況下被確認是存在的),然后消息文本會被傳輸。可以很簡單地通過telnet程序來測試一個SMTP服務器。SMTP使用TCP端口25。要為一個給定的域名決定一個SMTP服務器,需要使用MX (Mail eXchange) DNS。

 
在八十年代早期SMTP開始被廣泛地使用。當時,它只是作為UUCP的補充,UUCP更適合于處理在間歇連接的機器間傳送郵件。相反,SMTP在發送和接收的機器始終連接在網絡的情況下工作得最好。

 
Sendmail是最早實現SMTP的郵件傳輸代理之一。到2001年至少有50個程序將SMTP實現為一個客戶端(消息的發送者)或一個服務器(消息的接收者)。一些其他的流行的SMTP服務器程序包括了Philip Hazel的exim,IBM的Postfix, D. J. Bernstein的Qmail,以及Microsoft Exchange Server。

 
由于這個協議開始是基于純ASCII文本的,它在二進制文件上處理得并不好。諸如MIME的標準被開發來編碼二進制文件以使其通過SMTP來傳輸。今天,大多數SMTP服務器都支持8位MIME擴展,它使二進制文件的傳輸變得幾乎和純文本一樣簡單。

 
SMTP是一個“推”的協議,它不允許根據需要從遠程服務器上“拉”來消息。要做到這點,郵件客戶端必須使用POP3或IMAP。另一個SMTP服務器可以使用ETRN在SMTP上觸發一個發送。
北京赛车爱玩来彩运来哦 老时时彩开奖号码 奥运会网球比分板 河北快三免费计划软件下载 网上打麻将平台 大乐透走势基本走势图 赛车5码技巧稳赚方法 广西快三结果 北京快中彩 双色球走势图带坐标新浪爰彩 打麻将最新作弊工具 陕西快乐10分钟开奖结果查询 1天下足球直播网 亿客隆彩票网站 湖北快3专家预测推荐号码 比分网即时比分斯诺克 游戏赚钱鱼