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