天天看點

電子郵件SMTP協定原始指令碼和工作原理

【中國郵箱網 電子郵件頻道】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)示例程式知道何時使用換行符,何時使用回車加換行符。是以你隻須按Enter鍵就行了。下面是一個例子: 

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回報的應答來完成的。在通訊鍊路建立後,發送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: To:""< [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上觸發一個發送。

參考資料:

維基百科中文版SMTP介紹:http://zh.wikipedia.org/zh-cn/SMTP 維基百科英文版SMTP介紹:http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol 百度百科基于SMTP介紹:http://baike.baidu.com/view/5450.htm CSDN部落格:http://blog.csdn.net/larryfrances/article/details/5376127

中國郵箱網編輯整理

繼續閱讀