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