郵件收發流程解析
本文打算詳細分析一封郵件從發件人發出郵件到收件人收到郵件的過程,講述該過程涉及到的各種知識,爲初步接觸郵件系統的系統管理員深入學習郵件服務器配置和反垃圾郵件軟件或者硬件的配置打下紮實的基礎。
1) SMTP 會話
a. 發件人在自己的郵件客戶端(比如outlook,foxmail等等,稱之爲MUA【郵件用戶 代理】)寫郵件,完成後,按“發送”按鈕;
b. 發件人郵件客戶端根據發件人先前的配置(SMTP 服務器【發件人公司郵局服務器】 域名或者IP地址,如果發送郵件需要身份驗證的話,還有發件人用來向SMTP服務器 表明身份的用戶名和密碼),建立到發件人公司郵局服務器25號端口的TCP連接;
c. 發件人郵件客戶端向發件人公司郵局服務器發送命令 HELO <發件人主機名> 或者 EHLO <發件人主機名>,向發件人公司郵局服務器表明自己的身份;
d. 發件人公司郵局服務器響應發件人郵件客戶端,如果該郵件服務器配置了SMTP身份 驗證的話,還會把自己支持的身份驗證加密算法返回給發件人郵件客戶端;
注意:郵件服務器可以通過兩種方式來限定能夠通過它發送郵件的郵件客戶端, 防止自己被當成開放中轉(open relay),被用來發送垃圾郵件:
一種是通過 IP 地址來限定,比如把該郵件服務器負責發送郵件的客戶端電腦的IP地址段寫到郵件服務器的相應配置文件裏;
另外一種就是通過配置SMTP身份驗證來限制,只有通過身份驗證的客戶端才能通過它來發送郵件;
a. 發件人在自己的郵件客戶端(比如outlook,foxmail等等,稱之爲MUA【郵件用戶 代理】)寫郵件,完成後,按“發送”按鈕;
b. 發件人郵件客戶端根據發件人先前的配置(SMTP 服務器【發件人公司郵局服務器】 域名或者IP地址,如果發送郵件需要身份驗證的話,還有發件人用來向SMTP服務器 表明身份的用戶名和密碼),建立到發件人公司郵局服務器25號端口的TCP連接;
c. 發件人郵件客戶端向發件人公司郵局服務器發送命令 HELO <發件人主機名> 或者 EHLO <發件人主機名>,向發件人公司郵局服務器表明自己的身份;
d. 發件人公司郵局服務器響應發件人郵件客戶端,如果該郵件服務器配置了SMTP身份 驗證的話,還會把自己支持的身份驗證加密算法返回給發件人郵件客戶端;
注意:郵件服務器可以通過兩種方式來限定能夠通過它發送郵件的郵件客戶端, 防止自己被當成開放中轉(open relay),被用來發送垃圾郵件:
一種是通過 IP 地址來限定,比如把該郵件服務器負責發送郵件的客戶端電腦的IP地址段寫到郵件服務器的相應配置文件裏;
另外一種就是通過配置SMTP身份驗證來限制,只有通過身份驗證的客戶端才能通過它來發送郵件;
e. 如果郵件服務器使用SMTP身份驗證來限制郵件客戶端,那麼發件人郵件客戶端向發件人公司郵局服務器發送命令 AUTH <發件人郵件客戶端選擇的加密算法>,把自己選擇的算法發送給發件人公司郵局服務器,否則,轉到步驟k;
f. 發件人公司郵局服務器響應發件人郵件客戶端,並用雙方協商的加密算法加密響應數據;
g. 發件人郵件客戶端向發件人公司郵局服務器發送命令 USER <發件人用戶名>,並用雙方協商的加密算法加密命令;
h. 發件人公司郵局服務器響應發件人郵件客戶端,並用雙方協商的加密算法加密響應數據;
i. 發件人郵件客戶端向發件人公司郵局服務器發送命令 PASS <發件人密碼>,並用雙方協商的加密算法加密命令;
j. 發件人公司郵局服務器響應發件人郵件客戶端,告訴發件人郵件客戶端身份驗證的結果;
k. 發件人郵件客戶端向發件人公司郵局服務器發送命令 MAIL FROM: <發件人郵箱>,告訴郵局服務器發件人的郵箱地址;
l. 發件人公司郵局服務器響應發件人郵件客戶端;
m. 發件人郵件客戶端向發件人公司郵局服務器發送命令 RCPT TO: <收件人郵箱>,告訴郵局服務器收件人的郵箱地址;
n. 發件人公司郵局服務器判斷郵件客戶端是否位於自己負責爲其轉發郵件的IP地址段內,或者客戶端是否通過了SMTP身份驗證,如果該客戶端在自己負責的IP地址段內,或者通過SMTP身份驗證,那麼允許該客戶端發送外部郵件,反之如果該客戶端既不在自己負責的IP地址段內,又沒有通過SMTP身份驗證,那麼發件人公司郵局服務器會認爲該發件人郵件客戶端是一臺外部郵件服務器,試圖通過它發送郵件,那麼它會判斷RCPT TO 命令的參數收件人郵箱是否是本地郵箱,如果是,則允許發送,如果是外部郵箱,則拒絕發送,並用判斷的結果響應發件人郵件客戶端;
o. 發件人郵件客戶端向發件人公司郵局服務器發送命令 DATA,要求發送郵件;
p. 發件人公司郵局服務器響應發件人郵件客戶端;
q. 發件人郵件客戶端向發件人公司郵局服務器發送郵件;
r. 發件人公司郵局服務器響應發件人郵件客戶端,告訴其郵件已經接收了,然後關閉連接。
2) SMTP 會話
a. 發件人公司郵件服務器分析剛收到的郵件,取出其“收件人郵箱”部分(比如, [email][email protected][/email]),並分離出收件人郵箱的域名sinogrid.com);
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 <發件人公司郵件服務器域名> 或者EHLO <發件人公司郵件服務器域名>,表明自己的身份;
g. 收件人公司郵件服務器響應;
h. 發件人公司郵件服務器取出試圖發送的郵件的“發件人郵箱”,向收件人公司郵件服務器發送命令 MAIL FROM: <發件人郵箱>;
i. 收件人公司郵件服務器如果配置了DNS反向查詢驗證,那麼它會這樣做:
首先他執行一個 PTR 類型的DNS查詢(根據IP查找域名),查找出發件人公司郵件服務器的域名,然後執行一個 MX 類型的DNS查詢(根據域名查找負責該域的郵件服務器列表),查找出負責“發件人郵箱”所在域的郵件的郵件服務器列表,判斷發件人公司郵件服務器的域名是否在這個列表裏面。如果PTR 類型的DNS查詢失敗了(例如我們沒有配置DNS反向查詢,這個需要向ISP申請,由他們來做),或者域名不在列表裏面,那麼收件人公司郵件服務器會拒絕接收郵件,終止會話。反之,如果兩個條件都滿足了,那麼以“OK”響應發件人公司郵件服務器。
j. 發件人郵件服務器向收件人公司郵局服務器發送命令 RCPT TO: <收件人郵箱>,告訴收件人郵件服務器收件人的郵箱地址;
k. 收件人公司郵局服務器判斷該“收件人郵箱”地址(比如[email][email protected][/email])是否屬於自己負責投遞的域的郵箱地址(這些域在配置郵件服務器的時候寫到相應配置文件裏面),如果收件人公司郵件服務器配置了收件人地址驗證的話,它還會去驗證該地址是否存在,如果不是自己負責的域或者地址不存在,那麼它會提示發件人公司郵件服務器。反之,以“OK”響應發件人公司郵件服務器。
l. 發件人公司郵件服務器向收件人公司郵件服務器發送命令 DATA 命令,請求發送郵件;
m. 收件人公司郵局服務器響應發件人公司郵件服務器;
n. 發件人公司郵件服務器向收件人公司郵件服務器發送郵件;
o. 收件人公司郵局服務器響應發件人公司郵件服務器發送命令 QUIT,終止會話。
a. 發件人公司郵件服務器分析剛收到的郵件,取出其“收件人郵箱”部分(比如, [email][email protected][/email]),並分離出收件人郵箱的域名sinogrid.com);
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 <發件人公司郵件服務器域名> 或者EHLO <發件人公司郵件服務器域名>,表明自己的身份;
g. 收件人公司郵件服務器響應;
h. 發件人公司郵件服務器取出試圖發送的郵件的“發件人郵箱”,向收件人公司郵件服務器發送命令 MAIL FROM: <發件人郵箱>;
i. 收件人公司郵件服務器如果配置了DNS反向查詢驗證,那麼它會這樣做:
首先他執行一個 PTR 類型的DNS查詢(根據IP查找域名),查找出發件人公司郵件服務器的域名,然後執行一個 MX 類型的DNS查詢(根據域名查找負責該域的郵件服務器列表),查找出負責“發件人郵箱”所在域的郵件的郵件服務器列表,判斷發件人公司郵件服務器的域名是否在這個列表裏面。如果PTR 類型的DNS查詢失敗了(例如我們沒有配置DNS反向查詢,這個需要向ISP申請,由他們來做),或者域名不在列表裏面,那麼收件人公司郵件服務器會拒絕接收郵件,終止會話。反之,如果兩個條件都滿足了,那麼以“OK”響應發件人公司郵件服務器。
j. 發件人郵件服務器向收件人公司郵局服務器發送命令 RCPT TO: <收件人郵箱>,告訴收件人郵件服務器收件人的郵箱地址;
k. 收件人公司郵局服務器判斷該“收件人郵箱”地址(比如[email][email protected][/email])是否屬於自己負責投遞的域的郵箱地址(這些域在配置郵件服務器的時候寫到相應配置文件裏面),如果收件人公司郵件服務器配置了收件人地址驗證的話,它還會去驗證該地址是否存在,如果不是自己負責的域或者地址不存在,那麼它會提示發件人公司郵件服務器。反之,以“OK”響應發件人公司郵件服務器。
l. 發件人公司郵件服務器向收件人公司郵件服務器發送命令 DATA 命令,請求發送郵件;
m. 收件人公司郵局服務器響應發件人公司郵件服務器;
n. 發件人公司郵件服務器向收件人公司郵件服務器發送郵件;
o. 收件人公司郵局服務器響應發件人公司郵件服務器發送命令 QUIT,終止會話。
3) POP3/IMAP 會話
通常情況下,郵件服務器軟件,比如sendmail,qmail,postfix,稱之爲MTA(郵件發送代理),只負責爲本地郵件用戶向外發送郵件和接收外部發給本地郵件用戶的郵件並將外來郵件投遞到本地郵件用戶的郵箱裏面,並不包含讓用戶通過郵件客戶端軟件讀取自己在郵件服務器上的郵箱裏面的郵件的功能,即POP3或者IMAP服務。用戶只能通過命令行,在郵件服務器上查看自己郵箱裏面的郵件,很不方便。所以,在搭建郵件服務器的時候,我們需要另外安裝POP3或者IMAP服務器,以方便用戶通過郵件客戶端方便地收發郵件;
郵件接收流程如下:
a. 收件人點擊郵件客戶端的“接收”按鈕;
b. 郵件客戶端根據發件人先前的配置(POP3/IMAP 服務器【收件人公司郵局服務器】 域名或者IP地址,和收件人用來向POP3/IMAP服務器表明身份的用戶名和密碼),建立到收件人公司郵局服務器110號端口(POP3)或者445端口(IMAP)的TCP連接;
通常情況下,郵件服務器軟件,比如sendmail,qmail,postfix,稱之爲MTA(郵件發送代理),只負責爲本地郵件用戶向外發送郵件和接收外部發給本地郵件用戶的郵件並將外來郵件投遞到本地郵件用戶的郵箱裏面,並不包含讓用戶通過郵件客戶端軟件讀取自己在郵件服務器上的郵箱裏面的郵件的功能,即POP3或者IMAP服務。用戶只能通過命令行,在郵件服務器上查看自己郵箱裏面的郵件,很不方便。所以,在搭建郵件服務器的時候,我們需要另外安裝POP3或者IMAP服務器,以方便用戶通過郵件客戶端方便地收發郵件;
郵件接收流程如下:
a. 收件人點擊郵件客戶端的“接收”按鈕;
b. 郵件客戶端根據發件人先前的配置(POP3/IMAP 服務器【收件人公司郵局服務器】 域名或者IP地址,和收件人用來向POP3/IMAP服務器表明身份的用戶名和密碼),建立到收件人公司郵局服務器110號端口(POP3)或者445端口(IMAP)的TCP連接;
c. 收件人公司郵局服務器響應收件人郵件客戶端,表明自己已經準備就緒,可以接收命令。
d. 收件人郵件客戶端向收件人公司郵局服務器發送命令 USER <用戶名>;
e. 收件人公司郵局服務器響應收件人郵件客戶端,請求發送密碼;
f. 收件人郵件客戶端向收件人公司郵局服務器發送命令 PASS <密碼>;
g. 收件人公司郵局服務器驗證收件人郵件客戶端發送的用戶名和密碼,並把驗證結果通知收件人郵件客戶端,如果驗證失敗,則斷開連接;
通常情況下,我們可以將郵件服務器配置爲根據郵件服務器本機上的帳戶來驗證用戶身份,或者根據外部用戶數據庫來驗證,比如LDAP等等。
h. 收件人郵件客戶端向收件人公司郵局服務器發送郵件操作命令,比如STAT,UIDL,LIST;
i. 收件人郵件客戶端向收件人公司郵局服務器發送命令 QUIT,中止會話;
4)總結
一臺配置得當的郵件服務器,本身已經包含了多種防垃圾郵件技術。一旦我們理解並掌 握了郵件收發的整個流程,不管是配置郵件服務器,還是配置防垃圾郵件網關,我們都能夠做到不但知道要做什麼,而且知道爲什麼要那樣做。