圖文并茂 Postfix如何接收郵件
當一封郵件進入Postfix郵件系統后,首先被放入incoming queue(入口隊列). 下圖體現了處理一封新郵件涉及的主要進程和順序。 帶數字的名稱代表Postfix的命令或服務程序,不帶數字的名稱代表Postfix的郵件隊列。
網絡郵件通過 smtpd(8) 或 qmqpd(8) 服務器進入Postfix,這兩個服務刪除郵件的SMTP或QMQP協議封裝(去掉協議頭,又叫解封),并且強制進行一些郵件健康檢查(sanity checks)來保護Postfix,然后將郵件的發送者、接收者地址和郵件內容交給cleanup(8)服務處理。可以通過配置 smtpd(8)服務來阻塞服務器不想接收的郵件,具體的配置方法可以參看:SMTPD_ACCESS_README 。
本機發送的郵件是由Postfix自帶的 sendmail(1)兼容性命令來處理,并且被特權命令postdrop(1) 放入 maildrop queue隊列中進行排隊,這種方式使得即使Postfix郵件系統沒有運行也能正常工作(本機能夠發送郵件,只不過發送完的郵件必須在maildrop queue中,直到Postfix郵件系統啟動才能被發送出去。但對用戶來講,不必關心郵件什么時候被發送出去。)。 本地的 pickup(8)服務從maildrop queue中讀取本機發送的郵件,并且強制進行一些郵件健康檢查(sanity checks)來保護Postfix,然后將郵件的發送者、接收者地址和郵件內容交給cleanup(8)服務處理。
內部(Postfix郵件系統本身)發送來的郵件直接被提交給cleanup(8)服務來處理,這部分沒有包括在上面的圖示中。所謂內部發送的郵件主要包括:被local(8)投遞代理轉發的郵件(參看下一小節)、被bounce(8)服務(參看下一小節)返回給發送者的郵件以及postmaster關于Postfix系統問題的通知。
cleanup(8)服務進行郵件進入隊列(incoming queue)前的最后一次處理,它將增加一些丟失的消息頭、按照地址轉換規則(參看 ADDRESS_REWRITING_README)重寫郵件地址。另外,cleanup(8)服務可以使用正則表達式配置為輕量級的內容檢查器,請參看:BUILTIN_FILTER_README 。 cleanup(8)服務將處理完的郵件以單個文件的方式放入 incoming queue隊列,并通知隊列管理器有新郵件到達。
trivial-rewrite(8)服務將郵件地址(發送者)重寫為標準的郵件地址格式:"user@fully.qualified.domain",參看:ADDRESS_REWRITING_README 。Postfix當前版本本身不執行地址重寫語言(rewriting language),但是大多數情況下我們可以通過表查找或正則表達式來實現。
【編輯推薦】