在討論email服務器以前,理解電子郵件的工作機制是非常重要的。在通常的情況下,一封電子郵件的發(fā)送需要經過用戶代理,傳輸代理和投遞代理等三個程序的參與。 當用戶發(fā)送一封電子郵件時,他并不能直接將信件發(fā)送到對方郵件地址指定的服務器上,而是必須首先試圖去尋找一個信件傳輸代理,把郵件提交給它;信件傳輸代理得到了郵件后,首先將它保存在自身的緩沖隊列中,然后,根據郵件的目標地址,信件傳輸代理程序查詢到應對這個目標地址負責的郵件傳輸代理服務器,并且通過網絡將郵件傳送給它。對方的服務器接收到郵件之后,將其緩沖存儲在本地,直到電子郵件的接收者察看自己的電子信箱。顯然,郵件傳輸是從服務器到服務器的,而且每個用戶必須擁有服務器上存儲信息的空間(稱為信箱)才能接受郵件。(發(fā)送郵件不受這個限制)。 而投遞代理則從信件傳輸代理取得信件傳送至最終用戶的郵箱。顯然,最終用戶只能看到用戶投遞代理。常見的投遞代理包括procmail等。 用戶代理接受用戶輸入的各種指令,將用戶的郵件傳送至信件傳輸代理或者通過pop、Imap將信件從傳輸代理服務器處取到本機上。常見的用戶代理有“foxmail”,“outlook express”等郵件客戶程序。 可以看到,一個郵件傳輸代理的主要工作是監(jiān)視用戶代理的請求,根據電子郵件的目標地址找出對應的郵件服務器,將信件在服務器之間傳輸并且將接收到的郵件緩沖或者提交給最終投遞程序。 有許多的程序可以作為信件傳輸代理,包括qmail、sendmail、postfix等等。 無論什么產品,它們必須支持同樣的規(guī)范,如傳輸信件的報文格式,監(jiān)聽的端口等等。一般來說,系統(tǒng)管理員并不需要了解信件傳輸?shù)拿顦藴?,用戶代理會生成正確的命令。但是,了解一些相關信息是重要的。 信件傳輸代理默認監(jiān)聽25號端口接受請求,當接受用戶的請求時,它不需要了解用戶的真實身份,或者說不需要身份驗證。因此用戶不需要提交用戶口令就可以發(fā)出電子郵件,這意味著任何用戶都可以冒充成另外一個用戶發(fā)出假的電子郵件,這是電子郵件原始設計時導致的一個特點,無法消除。(關于這一點目前有一點說明。許多基于UNIX的系統(tǒng)運行indentd,可以記錄客戶機器上的用戶的登錄名字。不過,這個功能實際上用處不大,畢竟大部分人不會用UNIX/Linux作為他的個人機器)。 當郵件服務器程序得到一封待發(fā)送的郵件時,它首先需要根據目標地址確定將信件投遞給哪一個服務器,這是通過DNS服務實現(xiàn)的。例如,有一封郵件的目標地址是someone@yahoo.com,那么,sendmail首先確定這個地址是用戶名(someone)+機器名(yahoo.com)的格式,然后,通過查詢DNS來確定需要把信件投遞給某個服務器。 DNS數(shù)據中,與電子郵件相關的是MX記錄,這可以在查詢DNS時設置查詢類型為mx來得到: [wanghy@mail ~]$ nslookup Default Server: www.linuxaid.com.cn Address: 202.99.11.120 >set q=mx >yahoo.com Server: www.linuxaid.com.cn Address: 202.99.11.120 Non-authoritative answer: yahoo.com preference = 0, mail exchanger = mx1.mail.yahoo.com yahoo.com preference = 1, mail exchanger = mx2.mail.yahoo.com mx1.mail.yahoo.com internet address = 128.11.68.225 mx2.mail.yahoo.com internet address = 128.11.68.217 顯然,在DNS中說明yahoo.com有兩個信件交換(MX)服務器,于是,sendmail試圖將郵件發(fā)送給兩者之一。一般來說,排在前面的的MX服務器的優(yōu)先級別比較高,因此服務器將試圖連接mx1.mail.yahoo.com的25端口,試圖將信件報文轉發(fā)給它。如果成功,你的smtp服務器的任務就完成了,在這以后的任務,將由mx1.mail.yahoo.com來完成。在一般的情況下,mx交換器會自動把信件內容轉交給目標主機,不過,也存在這樣的情況,目標主機(比如yahoo.com)可能并不存在,或者不執(zhí)行smtp服務,而是由其mx交換器來執(zhí)行信件的管理,這時候,最終的信件將保存在mx機器上,直到用戶來察看它。 可以簡單地在DNS記錄中用MX關鍵字設置信件交換,例如,在我們的設置中: $TTL 3600 @ IN SOA linuxaid.com.cn. webmaster.linuxaid.com.cn. ( 2001050902 ;Serial 10800 ;Refresh after 3 hours 3600 ;Retry hourly 604800 ;Expire after 1 week 10800 ;Time to live ) IN NS ns.linuxaid.com.cn. IN A 202.99.11.120 IN MX 10 mx.linuxaid.com.cn. IN MX 20 mx1.linuxaid.com.cn. ns IN A 202.99.11.120 www IN A 202.99.11.120 mx IN A 202.99.11.120 mx1 IN A 202.99.11.121 sales IN MX 10 sales-mail.linuxaid.com.cn. 這里面定義了二個MX記錄,MX記錄的規(guī)則是“[機器名/域名] IN MX [優(yōu)先級] [服務器]”。優(yōu)先級是一個整數(shù),數(shù)值越小優(yōu)先級越高。第一個IN MX 10 mx.linuxaid.com.cn.,因為沒有機器名,使用來自named.conf的缺省后綴,就是linuxaid.com.cn,這就是讓所有some@linuxaid.com.cn的信件傳送到mx.linuxaid.com.cn。IN MX 20 mx1.linuxaid.com.cn.的概念差不多,只是其優(yōu)先數(shù)為20,也就是說只有當mx.linuxaid.com.cn拒絕接受(比如服務器忙或者當機)的時候,信件才會投遞到mx1.linuxaid.com.cn。“sales IN MX 10 sales-mail.linuxaid.com.cn.”定義凡是someone@sales.linuxaid.com.cn的信件要發(fā)送到sales-mail.linuxaid.com.cn。 MX記錄可以使得整個子域內的用戶使用同樣的郵件主機和傳輸代理。另外如果你的主機暫時宕機了,那么信件可以暫時存儲在你的信件交換主機上,直到你自己的機器恢復為止。比如說,mail.yourdomain.com是一臺smtp主機,而mx2.yourdomain.com是另外一個smtp主機,你希望在mail.yourdomain.com正常的時候直接由其自身收發(fā)郵件,而萬一mail崩潰,mx2為它暫時存儲一段時間的郵件直到mail恢復正常工作-這是常見的設置,那么,你需要把mail以比較高的優(yōu)先數(shù)設置成自己的信件交換主機,而mx2作為一個優(yōu)先數(shù)較低的信件交換主機,也就是,在你的DNS配置文件中,應該這樣配置: IN MX 0 mail IN MX 10 mx2 如果DNS查詢無法找出對某個地址的MX記錄(通常因為對方沒有信件交換主機),那么sendmail將是試圖直接與對方的主機(來自郵件地址)對話并且發(fā)送郵件。例如,test@www.linuxaid.com.cn在DNS中沒有對應的MX記錄,因此sendmail在確定MX交換器失