圖文并茂 Postfix如何投遞郵件
一封郵件一旦到達incoming queue隊列,下一步就是進行投遞。下圖簡要表示了Postfix投遞器的主要組件。 帶數字的名稱代表Postfix的命令或服務程序,不帶數字的名稱代表Postfix的郵件隊列。
隊列管理器(圖中的qmgr(8)服務)是Postfix郵件投遞的核心,它直接與smtp(8), lmtp(8), local(8), virtual(8), pipe(8), discard(8) 或 error(8)投遞代理打交道,并且為一個或多個發送郵件地址發送投遞請求。其中, discard(8) 和 error(8) 投遞代理比價特殊:它們丟棄或彈回所有的郵件(在上圖中沒有別列出)。
隊列管理器維護一個郵件已經被打開準備投遞的active queue(活動隊列)。active queue在有可能非常大的incoming queue(入口隊列) 或 deferred queues(延遲隊列:上未發出的郵件隊列)中充當了一個限制窗口的腳色,被限制的active queue防止了在重負荷情況下隊列管理器產生內存溢出。
隊列管理器同時維護著一個單獨的不能被立即投遞出去的郵件隊列:deferred queue(延遲隊列),因此大量郵件在服務器上的積壓(backlog)不會減慢服務器對普通隊列的訪問。要設置隊列管理器對被延遲投遞的郵件再次投遞的策略,請參看文檔:QSHAPE_README 和 TUNING_README 。
trivial-rewrite(8) 服務根據它的本地和遠程地址類的定義決定每個郵件地址的格式,地址類的定義請參看文檔:ADDRESS_CLASS_README。附加的郵件路由信息可以可以使用可選的 transport(5) 表來指定。對于誰的郵件地址已經被改變,trivial-rewrite(8) 服務隨時查詢relocated(5) ,這樣的(地址被改變的)郵件地址將被返回給發送者(服務器會給發送者發送一封說明郵件)。
smtp(8)客戶程序查詢一個目標主機的郵件交換器列表,并根據郵件交換器列表的優先級進行排序,然后從高優先級的服務器開始依次嘗試以郵件交換器(目標服務器)連接,直到其中一個服務器回應為止。然后按照SMTP協議的要求封裝郵件的發送者、接收者和郵件內容,這個過程包括將8-bit的MIME郵件內容轉換為7-bit的編碼。
lmtp(8)客戶程序使用一種類似SMTP的已經被優化來遞送郵件給郵箱服務器(例如cyrus)的協議。使用lmtp(8)的優勢是:一臺Postfix主機可以通過LMTP為多個郵箱服務器(pop3或imap服務器)服務,同樣的,一臺郵箱服務器可以被多臺Postfix主機服務(接收多臺Postfix主機發送來的郵件)。LMTP_README 文檔中給出了一些如何使用lmtp(8)客戶程序的例子。
local(8)投遞代理(本地投遞代理程序)能夠識別標準的Unix郵箱格式mailboxes,Qmail的兼容郵箱格式maildir files,Sendmail風格的aliases(5) 數據庫,sendmail風格的為每個用戶設置的.forward文件。多個本地投遞代理可以并行運行,但是并行投遞到同一個用戶通常是被限制的。
local(8)投遞代理有兩種本地投遞方式:你可以配置它將本地郵件直接投遞到用戶主目錄下的用戶郵箱文件中;你也可以配置它將本地郵件遞交給一個外部的程序(例如procmail)來處理,或者你可以指派它將本地郵件遞交給其它的postfix投遞代理來處理。
virtual(8)投遞代理(虛擬域投遞代理程序)是一個僅能投遞到Unix風格的mailbox郵箱和Qmail風格的maildir郵箱的透明代理程序。這個投遞代理可以為多個域投遞郵件,特別適合在單一的主機上為很多域提供郵件服務的場合。關于虛擬域投遞代理的配置,請參考文檔:VIRTUAL_README
pipe(8)信封是郵件處理系統的外部接口(Postfix的sendmail(1)是內部接口)。該接口是Unix的兼容性接口:它在命令行和輸入流中提供信息,并且等待在
【編輯推薦】