天天看點

郵件收發流程解析

<b>郵件收發流程解析</b>

    本文打算詳細分析一封郵件從發件人發出郵件到收件人收到郵件的過程,講述該過程涉及到的各種知識,為初步接觸郵件系統的系統管理者深入學習郵件伺服器配置和反垃圾郵件軟體或者硬體的配置打下紮實的基礎。

<b>1) </b><b>SMTP </b><b>會話</b>

a. 發件人在自己的郵件用戶端(比如outlook,foxmail等等,稱之為MUA【郵件使用者  代理】)寫郵件,完成後,按“發送”按鈕;

b. 發件人郵件用戶端根據發件人先前的配置(SMTP 伺服器【發件人公司郵局伺服器】 域名或者IP位址,如果發送郵件需要身份驗證的話,還有發件人用來向SMTP伺服器  表明身份的使用者名和密碼),建立到發件人公司郵局伺服器25号端口的TCP連接配接;

c. 發件人郵件用戶端向發件人公司郵局伺服器發送指令 <b>HELO &lt;</b><b>發件人主機名&gt; </b>或者   <b>EHLO &lt;</b><b>發件人主機名&gt;</b>,向發件人公司郵局伺服器表明自己的身份;

d. 發件人公司郵局伺服器響應發件人郵件用戶端,如果該郵件伺服器配置了SMTP身份 驗證的話,還會把自己支援的身份驗證加密算法傳回給發件人郵件用戶端;

     注意:郵件伺服器可以通過兩種方式來限定能夠通過它發送郵件的郵件用戶端, 防止自己被當成開放中轉(open relay),被用來發送垃圾郵件:

        一種是通過 IP 位址來限定,比如把該郵件伺服器負責發送郵件的用戶端電腦的IP位址段寫到郵件伺服器的相應配置檔案裡;

    另外一種就是通過配置SMTP身份驗證來限制,隻有通過身份驗證的用戶端才能通過它來發送郵件;

e. 如果郵件伺服器使用SMTP身份驗證來限制郵件用戶端,那麼發件人郵件用戶端向發件人公司郵局伺服器發送指令 <b>AUTH &lt;</b><b>發件人郵件用戶端選擇的加密算法&gt;</b>,把自己選擇的算法發送給發件人公司郵局伺服器,否則,轉到步驟k;

f. 發件人公司郵局伺服器響應發件人郵件用戶端,并用雙方協商的加密算法加密響應資料;

g. 發件人郵件用戶端向發件人公司郵局伺服器發送指令 <b>USER &lt;</b><b>發件人使用者名&gt;</b>,并用雙方協商的加密算法加密指令;

h. 發件人公司郵局伺服器響應發件人郵件用戶端,并用雙方協商的加密算法加密響應資料;

i. 發件人郵件用戶端向發件人公司郵局伺服器發送指令 <b>PASS</b><b> &lt;</b><b>發件人密碼&gt;</b>,并用雙方協商的加密算法加密指令;

j. 發件人公司郵局伺服器響應發件人郵件用戶端,告訴發件人郵件用戶端身份驗證的結果;

k. 發件人郵件用戶端向發件人公司郵局伺服器發送指令 <b>MAIL FROM: &lt;</b><b>發件人郵箱&gt;</b>,告訴郵局伺服器發件人的郵箱位址;

l. 發件人公司郵局伺服器響應發件人郵件用戶端;

m. 發件人郵件用戶端向發件人公司郵局伺服器發送指令 <b>RCPT TO: &lt;</b><b>收件人郵箱&gt;</b>,告訴郵局伺服器收件人的郵箱位址;

n. 發件人公司郵局伺服器判斷郵件用戶端是否位于自己負責為其轉發郵件的IP位址段内,或者用戶端是否通過了SMTP身份驗證,如果該用戶端在自己負責的IP位址段内,或者通過SMTP身份驗證,那麼允許該用戶端發送外部郵件,反之如果該用戶端既不在自己負責的IP位址段内,又沒有通過SMTP身份驗證,那麼發件人公司郵局伺服器會認為該發件人郵件用戶端是一台外部郵件伺服器,試圖通過它發送郵件,那麼它會判斷<b>RCPT TO </b>指令的參數<b>收件人郵箱</b>是否是本地郵箱,如果是,則允許發送,如果是外部郵箱,則拒絕發送,并用判斷的結果響應發件人郵件用戶端;

o. 發件人郵件用戶端向發件人公司郵局伺服器發送指令 <b>DATA</b>,要求發送郵件;

p. 發件人公司郵局伺服器響應發件人郵件用戶端;

q. 發件人郵件用戶端向發件人公司郵局伺服器發送郵件;

      r. 發件人公司郵局伺服器響應發件人郵件用戶端,告訴其郵件已經接收了,然後關閉連接配接。

<b>2) </b><b>SMTP </b><b>會話</b>

b. 發件人公司郵件伺服器執行DNS查詢,查詢類别為MX,查找sinogrid.com 這個域的 郵件伺服器的IP位址(可以用nslookup指令模拟:nslookup –type=mx sinogrid.com);

c. 收件人公司的DNS伺服器将本公司的郵件伺服器清單都傳回給發件人公司郵件伺服器;

d. 發件人公司郵件伺服器分析獲得的收件人公司郵件伺服器清單,找出優先級最高的 郵件伺服器,試圖與其建立TCP連接配接,如果優先級最高的郵件伺服器有多個,那麼就輪流使用,如果不能與優先級高的郵件伺服器建立連接配接,則跟優先級次高的伺服器 建立連接配接,以此類推。

   注意:MX 查詢的傳回值,形如 sinogrid.com   MX preference = 20,mail exchanger  = mail.sinogrid.com  其中的那個數值越低,則該記錄對應的郵件伺服器的優先級就越高。

e. 如果收件人公司郵件伺服器配置了根據發件郵件伺服器的IP位址來過濾垃圾郵件,那麼它會将發件人公司郵件伺服器的IP位址跟自己的黑白名單進行比對,如果發件人公司郵件伺服器的IP在黑名單裡面,那麼它可能會拒絕發件人公司郵件伺服器的連接配接;

f. 發件人公司郵件伺服器向收件人公司郵件伺服器發送指令 HELO &lt;發件人公司郵件伺服器域名&gt; 或者EHLO &lt;發件人公司郵件伺服器域名&gt;,表明自己的身份;

g. 收件人公司郵件伺服器響應;

h. 發件人公司郵件伺服器取出試圖發送的郵件的“發件人郵箱”,向收件人公司郵件伺服器發送指令 MAIL FROM: &lt;發件人郵箱&gt;;

i. 收件人公司郵件伺服器如果配置了DNS反向查詢驗證,那麼它會這樣做:

  首先他執行一個 PTR 類型的DNS查詢(根據IP查找域名),查找出發件人公司郵件伺服器的域名,然後執行一個MX 類型的DNS查詢(根據域名查找負責該域的郵件伺服器清單),查找出負責“發件人郵箱”所在域的郵件的郵件伺服器清單,判斷發件人公司郵件伺服器的域名是否在這個清單裡面。如果PTR 類型的DNS查詢失敗了(例如我們沒有配置DNS反向查詢,這個需要向ISP申請,由他們來做),或者域名不在清單裡面,那麼收件人公司郵件伺服器會拒絕接收郵件,終止會話。反之,如果兩個條件都滿足了,那麼以“OK”響應發件人公司郵件伺服器。

j. 發件人郵件伺服器向收件人公司郵局伺服器發送指令 <b>RCPT TO: &lt;</b><b>收件人郵箱&gt;</b>,告訴收件人郵件伺服器收件人的郵箱位址;

l. 發件人公司郵件伺服器向收件人公司郵件伺服器發送指令<b> DATA </b>指令,請求發送郵件;

m. 收件人公司郵局伺服器響應發件人公司郵件伺服器;

n. 發件人公司郵件伺服器向收件人公司郵件伺服器發送郵件;

o. 收件人公司郵局伺服器響應發件人公司郵件伺服器發送指令<b> QUIT</b>,終止會話。

<b>3) </b><b>POP3/IMAP </b><b>會話</b>

通常情況下,郵件伺服器軟體,比如sendmail,qmail,postfix,稱之為MTA(郵件發送代理),隻負責為本地郵件使用者向外發送郵件和接收外部發給本地郵件使用者的郵件并将外來郵件投遞到本地郵件使用者的郵箱裡面,并不包含讓使用者通過郵件用戶端軟體讀取自己在郵件伺服器上的郵箱裡面的郵件的功能,即POP3或者IMAP服務。使用者隻能通過指令行,在郵件伺服器上檢視自己郵箱裡面的郵件,很不友善。是以,在搭建郵件伺服器的時候,我們需要另外安裝POP3或者IMAP伺服器,以友善使用者通過郵件用戶端友善地收發郵件;

郵件接收流程如下:

a. 收件人點選郵件用戶端的“接收”按鈕;

b. 郵件用戶端根據發件人先前的配置(POP3/IMAP 伺服器【收件人公司郵局伺服器】 域名或者IP位址,和收件人用來向POP3/IMAP伺服器表明身份的使用者名和密碼),建立到收件人公司郵局伺服器110号端口(POP3)或者445端口(IMAP)的TCP連接配接;

<b>c. </b>收件人公司郵局伺服器響應收件人郵件用戶端,表明自己已經準備就緒,可以接收指令。

d. 收件人郵件用戶端向收件人公司郵局伺服器發送指令 <b>USER &lt;</b><b>使用者名&gt;</b>;

e. 收件人公司郵局伺服器響應收件人郵件用戶端,請求發送密碼;

f. 收件人郵件用戶端向收件人公司郵局伺服器發送指令 <b>PASS</b><b> &lt;</b><b>密碼&gt;</b>;

g. 收件人公司郵局伺服器驗證收件人郵件用戶端發送的使用者名和密碼,并把驗證結果通知收件人郵件用戶端,如果驗證失敗,則斷開連接配接;

          通常情況下,我們可以将郵件伺服器配置為根據郵件伺服器本機上的帳戶來驗證使用者身份,或者根據外部使用者資料庫來驗證,比如LDAP等等。

h. 收件人郵件用戶端向收件人公司郵局伺服器發送郵件操作指令,比如STAT,UIDL,LIST;

i. 收件人郵件用戶端向收件人公司郵局伺服器發送指令 QUIT,中止會話;

4)總結

        一台配置得當的郵件伺服器,本身已經包含了多種防垃圾郵件技術。一旦我們了解并掌 握了郵件收發的整個流程,不管是配置郵件伺服器,還是配置防垃圾郵件網關,我們都能夠做到不但知道要做什麼,而且知道為什麼要那樣做。

<a href="http://down.51cto.com/data/2350246" target="_blank">附件:http://down.51cto.com/data/2350246</a>

本文轉自zkjian517 51CTO部落格,原文連結:http://blog.51cto.com/zoukejian/87514

繼續閱讀