第四章 郵件服務器
第三節 三個重要的郵件系統相關協議
3.1 SMTP協議:
SMTP是工作在兩種情況下:一是電子郵件從客戶機傳輸到服務器;二是從某一個服務器傳輸到另一個服務器
SMTP是個請求/響應協議,命令和響應都是基於ASCII文本,並以CR和LF符結束。響應包括一個表示返回狀態的三位數字代碼
SMTP在TCP協議25號端口監聽連接請求
連接和發送過程:
建立TCP連接
客戶端發送HELO命令以標識發件人自己的身份,然後客戶端發送MAIL命令服務器端正希望以OK作為響應,表明准備接收
客戶端發送RCPT命令,以標識該電子郵件的計劃接收人,可以有多個RCPT行服務器端則表示是否願意為收件人接受郵件
協商結束,發送郵件,用命令DATA發送
以.表示結束輸入內容一起發送出去
結束此次發送,用QU99v命令退出。
另外兩個命令:
VRFY---用於驗證給定的用戶郵箱是否存在,以及接收關於該用戶的詳細信息。
EXPN---用於擴充郵件列表。
郵件路由過程:
SMTP服務器基於'域名服務DNS中計劃收件人的域名來路由電子郵件。SMTP服務器基於DNS中的MX記錄來路由電子郵件,MX記錄注冊了域名和相關的SMTP中繼主機,屬於該域的電子郵件都應向該主機發送。
若SMTP服務器mail.abc.com收到一封信要發到
[email protected]:
Sendmail請求DNS給出主機sh.abc.com的CNAME記錄,如有,假若CNAME到shmail.abc.com,則再次請求shmail.abc.com的CNAME記錄,直到沒有為止
假定被CNAME到shmail.abc.com,然後sendmail請求@abc.com域的DNS給出shmail.abc.com的MX記錄,
shmail MX 5 shmail.abc.com
10 shmail2.abc.com
Sendmail最後請求DNS給出shmail.abc.com的A記錄,即IP地址,若返回值為1.2.3.4
Sendmail與1.2.3.4連接,傳送這封給
[email protected]的信到1.2.3.4這台服務器的SMTP後台程序
SMTP基本命令集:
命令 描述
HELO 向服務器標識用戶身份
發送者能欺騙,說謊,但一般情況下服務器都能檢測到。
MAIL 初始化郵件傳輸
mail from:
RCPT 標識單個的郵件接收人;常在MAIL命令後面
可有多個rcpt to:
DATA 在單個或多個RCPT命令後,表示所有的郵件接收人已標識,並初始化數據傳輸,以.結束。
VRFY 用於驗證指定的用戶/郵箱是否存在;由於安全方面的原因,服務器常禁止此命令
EXPN 驗證給定的郵箱列表是否存在,擴充郵箱列表,也常被禁用
HELP 查詢服務器支持什麼命令
NOOP 無操作,服務器應響應OK
QU99v 結束會話
RSET 重置會話,當前傳輸被取消
MAIL FROM命令中指定的地址是稱作 envelope from地址,不需要和發送者自己的地址是一致的。
RCPT TO 與之等同,指明的接收者地址稱為envelope to地址,而與實際的to:行是什麼無關。
為什麼沒有RCPT CC和RCPT BCC:?
所有的接收者協商都通過RCPT TO命令來實現,如果是BCC,則協商發送後在對方接收時被刪掉信封接收者
郵件被分為信封部分,信頭部分和信體部分
envelope from, envelope to 與message from:, message to:完全不相干。
evnelope是由服務器主機間SMTP後台提供的,而message from/to是由用戶提供的。有無冒號也是區別。
怎樣由信封部分檢查是否一封信是否是偽造的?
received行的關聯性。
現在的SMTP郵件傳輸系統,在信封部分除了兩端的內部主機處理的之外,考慮兩個公司防火牆之間的部分,若兩台防火牆機器分別為A和B,但接收者檢查信封received:行時發現經過了C.則是偽造的。
received:行中的主機和IP地址對是否對應如:
Receibed: from galangal.org (turmeric.com [104.128.23.115] by mail .bieberdorf.edu....
被人手動添加在最後面的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)
3.2 POP3協議規范
簡介
對於在網絡上的比較小的結點,支持消息傳輸系統(mts)是不實際的。例如,一台工作站可能不具有充足的資源允許smtp服務器和相當的本地郵件傳送系統保持序駐留,並持續運行。同樣的,將一台個人計算機長時間連接在ip類型網絡上的費用也是可觀的(結點缺少的資源被稱為"聯絡性")。 雖然如此,在這樣的小結點上允許管理郵件是十分有用的,並且這些結點經常支持一個用戶代理來管理郵件。為解決這一問題,能夠支持mts的結點就為這些不能支持的結點提供了郵件存儲功能。郵局協議-版本3就是使這樣的工作站可以用一種比較實用的方法來訪問存儲於服務器上的儲存郵件。通常,這意味著工作站可以從服務器上取得郵件,而服務器為它暫時保存郵件。在下文中,客戶主機指的是利用pop3服務的主機,而服務器主機指的是提供pop3服務的主機。
簡單說明
在此文檔中不指明客戶主機如何將郵件送入到傳送系統中去。但這裡有一個說明:當用戶代理需要將信息送到傳送系統時,它在接力主機上建立smtp連接(這些接力主機可以是pop3主機,也可以不是)。
基本操作
初始時,服務器通過偵聽tcp端口110開始pop3服務。當客戶主機需要使用服務時,它將與服務器主機建立tcp連接。當連接建立後,pop3發送確認消息。客戶和pop3服務器相互(分別)交換命令和響應,這一過程一直要持續到連接終止。 pop3命令由一個命令和一些參數組成。所有命令以一個crlf對結束。命令和參數由可打印的ascii字符組成,它們之間由空格間隔。命令一般是三到四個字母,每個參數卻可達40個字符長。 pop3響應由一個狀態碼和一個可能跟有附加信息的命令組成。所有響應也是由crlf對結束。現在有兩種狀態碼,"確定" ("+ok")和"失敗" ("-err")。 對於特定命令的響應是由許多字符組成的。在這些情況中,下面一一表述:在發送第一行響應和一個crlf之後,任何的附加信息行發送,他們也由crlf對結束。當所有信息發送結束時,發送最後一行,包括一個結束字符(十進制碼46,也就是".")和一個crlf對。如果信息中的任何一行以結束字符開始,此行就是通過在那一行預先裝入結束而進行字符填充的。因此,多行響應由五個crlf.crlf 結束。當檢測多行響應時,客戶檢測以確認此行是否以結束字符開始。如果是的,而且其後的字符不是crlf,此行的第一個字符(結束字符)將被拋棄;如果其後緊跟crlf,從pop服務器來的響應終止,包括.crlf 的行也不被認為是多行響應的一部分了。 在生命周期中,pop3會話有幾個不同的狀態。一旦tcp連接被打開,而且pop3服務器發送了確認信息,此過程就進入了"確認"狀態。在此狀態中,客戶必須向pop3服務器確認自己是其的客戶。一旦確認成功,服務器就獲取與客戶郵件相關的資源,此時這一過程進入了"操作"狀態。在此狀態中,客戶提出服務,當客戶發出quit命令時,此過程進入了"更新"狀態。在此狀態中,pop3服務器釋放在"操作"狀態中取得的資源,並發送消息,終止連接。 pop3服務器可以擁有一個自動退出登錄的記時器。此記時器必須至少可以記錄10分鐘。這樣從客戶發送的消息才可能刷新此記時器。當記時器失效時,pop3會話並不進入"更新"狀態,而是關閉tcp連接,而且不刪除任何消息,不向客戶發送任何響應。
"確認"狀態
一時tcp連接由pop3客戶打開,pop3服務器發送一個單行的確認。這個消息可以是由crlf結束的任何字符。例如,它可以是: s: +ok pop3 server ready 注意:這個消息是一個pop3應答。pop3服務器應該給出一個"確定"響應作為確認。 此時pop3會話就進入了"確認"狀態。此時,客戶必須向服務器證明它的身份。在文檔中介紹兩種可能的處理機制,一種是user和pass命令,另一種是在後面要介紹的apop命令。 用user和pass命令進行確認過程,客戶必須首先發送user命令,如果pop3服務器以"確認"狀態碼響應,客戶就可以發送pass命令以完成確認,或者發送quit命令終止pop3會話。如果pop3服務器返回"失敗"狀態碼,客戶可以再發送確認命令,或者發送quit命令。 當客戶發送了pass命令後,服務器根據user和pass命令的附加信息決定是否允許訪問相應的存儲郵件。 一旦服務器通過這些數據決定允許客戶訪問儲存郵件,服務器會在郵件上加上排它鎖,以防止在進入"更新"狀態前對郵件的改變。如果成功獲得了排它鎖,服務器返回一個"確認"狀態碼。會話進入"操作狀態",同時沒有任何郵件被標記為刪除。如果郵件因為某種原因不能打開(例如,排它鎖不能獲得,客戶不能訪問相應的郵件或者郵件不能進行語法分析),服務器將返回"失敗"狀態碼。在返回"失敗"狀態碼後,服務器會關閉連接。如果服務器沒有關閉連接,客戶可以重新發送確認命令,重新開始,或者發送quit命令。 在服務器打開郵件後,它為每個消息指定一個消息號,並以八進制表示每個消息的長度。第一個消息被指定為1,第二個消息被指定為2,以此類推,第n個消息被指定為n。在pop3命令和響應中,所以的消息號和長度以十進制表示。
下面是對上述三條命令的總結:
命令
格式
參數