簡介
Postfix 是一種
電子郵件伺服器,它是由任職於IBM華生研究中心(T.J. Watson Research Center)的荷蘭籍研究員Wietse Venema為了改良sendmail郵件伺服器而產生的。最早在1990年代晚期出現,是一個
開放原始碼的軟體。
特點
1. postfix是免費的:
postfix想要作用的範圍是廣大的Internet用戶,試圖影響大多數的Internet上的
電子郵件系統,因此它是免費的。
2. 更快:
postfix在性能上大約比sendmail快三倍。一部運行postfix的台式PC每天可以收發上百萬封郵件。
3. 兼容性好:
postfix是sendmail兼容的,從而使sendmail用戶可以很方便地遷移到postfix。Postfix支持/var[/spool]/mail、/etc/aliases、 NIS、和 ~/.forward 檔案。
4. 更健壯:
postfix被設計成在重負荷之下仍然可以正常工作。當系統運行超出了可用的記憶體或磁碟空間時,postfix會自動減少運行進程的數目。當處理的郵件數目增長時,postfix運行的進程不會跟著增加。
5. 更靈活:
postfix是由超過一打的小程式組成的,每個程式完成特定的功能。你可以通過配置檔案設定每個程式的運行參數。
6. 安全性
postfix具有多層防禦結構,可以有效地抵禦惡意入侵者。如大多數的postfix程式可以運行在較低的許可權之下,不可以通過網路訪問安全性相關的本地投遞程式等等。
結構
postfix由十幾個具有不同功能的半駐留進程組成,並且在這些進程中並無特定的進程間父子關係。某一個特定的進程可以為其他進程提供特定的服務。
大多數的postfix進程由一個進程統一進行管理,該進程負責在需要的時候調用其他進程,這個管理進程就是master進程。該進程也是一個後台程式。
這些postfix進程是可以配置的,我們可以配置每個進程運行的數目,可重用的次數,生存的時間等等。通過靈活的配置特性可以使整個系統的運行成本大大降低。
1.2.1 postfix的郵件佇列(mail queues)
postfix有四種不同的郵件佇列,並且由佇列管理進程統一進行管理:
1. maildrop:本地郵件放置在maildrop中,同時也被拷貝到incoming中。
2. incoming:放置正在到達或佇列管理進程尚未發現的郵件。
3. active:放置佇列管理進程已經打開了並正準備投遞的郵件,該佇列有長度的限制。
4. deferred:放置不能被投遞的郵件。
佇列管理進程僅僅在記憶體中保留active佇列,並且對該佇列的長度進行限制,這樣做的目的是為了避免進程
運行記憶體超過系統的可用記憶體。
1.2.2 postfix對郵件風暴的處理
當有新的郵件到達時,postfix進行初始化,初始化時postfix同時只接受兩個並發的連線請求。當郵件投遞成功後,可以同時接受的
並發連線的數目就會緩慢地增長至一個可以配置的值。當然,如果這時系統的消耗已到達系統不能承受的負載就會停止增長。還有一種情況時,如果postfix在處理郵件過程中遇到了問題,則該值會開始降低。
當接收到的新郵件的數量超過postfix的投遞能力時,postfix會暫時停止投遞deferred佇列中的郵件而去處理新接收到的郵件。這是因為處理新郵件的延遲要小於處理deferred佇列中的郵件。Postfix會在空閒時處理deferred中的郵件。
1.2.3 postfix對無法投遞的郵件的處理
當一封郵件第一次不能成功投遞時,postfix會給該郵件貼上一個將來的時間郵票。郵件佇列管理程式會忽略貼有將來時間郵票的郵件。時間郵票到期時,postfix會嘗試再對該郵件進行一次投遞,如果這次投遞再次失敗,postfix就給該郵件貼上一個兩倍於上次時[間郵票的時間郵票,等時間郵票到期時再次進行投遞,依此類推。當然,經過一定次數的嘗試之後,postfix會放棄]對該郵件的投遞,返回一個錯誤信息給該郵件的發件人。
1.2.4 postfix對不可到達的目的地郵件的處理
postfix會在記憶體中保存一個有長度限制的當前不可到達的地址列表。這樣就避免了對那些目的地為當前不可到達地址的郵件的投遞嘗試。從而大大提高了系統的性能。
1.2.5 postfix的安全性
postfix通過一系列的措施來提高系統的安全性,這些措施包括:
2. 把大郵件分割成幾塊進行處理,投遞時再重組;
3. Postfix的各種進程不在其他用戶進程的控制之下運行,而是運行在駐留主進程master的控制之下,與其他用戶進程無父子關係,所以有很好的絕緣性。
4. Postfix的佇列檔案有其特殊的格式,只能被postfix本身識別;
處理過程
2.1 接收郵件的過程
當postfix接收到一封新郵件時,新郵件首選在incoming佇列處停留,然後針對不同的情況進行不同的處理:
1.對於來自於本地的郵件:local進程負責接收來自本地的郵件放在maildrop佇列中,然後pickup進程對maildrop中的郵件進行完整性檢測。maildrop目錄的許可權必須設定為某一用戶不能刪除其他用戶的郵件。
2.對於來自於網路的郵件:smtpd進程負責接收來自於網路的郵件,並且進行安全性檢測。可以通過UCE(unsolicited commercial email)控制smtpd的行為。
3.由postfix進程產生的郵件:這是為了將不可投遞的信息返回給發件人。這些郵件是由bounce後台程式產生的。
5. 由postfix自己產生的郵件:提示postmaster(也即postfix管理員)postfix運行過程中出現的問題。(如
SMTP協定問題,違反UCE規則的記錄等等。)
關於cleanup後台程式的說明:cleanup是對新郵件進行處理的最後一道工序,它對新郵件進行以下的處理:添加信頭中丟失的Form信息;為將地址重寫成標準的
[email protected]格式進行排列;從信頭中抽出收件人的地址;將郵件投入incoming佇列中,並請求郵件佇列管理進程處理該郵件;請求trivial-rewrite進程將地址轉換成標準的
[email protected]格式。
2.2 投遞郵件的過程
新郵件一旦到達incoming佇列,下一步就是開始投遞郵件,postfix投遞郵件時的處理過程如圖三所示。相關的說明如下:
郵件佇列管理進程是整個postfix
郵件系統的心臟。它和local、smtp、pipe等投遞代理相聯繫,將包含有佇列檔案路徑信息、郵件發件人地址、郵件收件人地址的投遞請求傳送給投遞代理。佇列管理進程維護著一個deferred佇列,那些無法投遞的郵件被投遞到該佇列中。除此之外,佇列管理進程還維護著一個active佇列,該佇列中的郵件數目是有限制的,這是為了防止在負載太大時
記憶體溢出。郵件佇列管理程式還負責將收件人地址在relocated表中列出的郵件返回給發件人,該表包含無效的收件人地址。
如果郵件佇列管理進程請求,rewrite後台程式對收件人地址進行解析。但是預設地,rewrite只對郵件收件人是本地的還是遠程的進行區別。
如果郵件對你管理進程請求,bounce後台程式可以生成一個郵件不可投遞的報告。
本地投遞代理local進程可以理解類似UNIX風格的信箱,sendmail風格的系統別名資料庫和sendmail風格的.forward檔案。可以同時運行多個local進程,但是對同一個用戶的並發投遞進程數目是有限制的。你可以配置local將郵件投遞到用戶的宿主目錄,也可以配置local將郵件傳送給一個
外部命令,如流行的本地投遞代理procmail。在流行的linux發行版本RedHat中,我們就使用procmail作為最終的本地投遞代理。
遠程投遞代理SMTP進程根據收件人地址查詢一個SMTP伺服器列表,按照順序連線每一個SMTP伺服器,根據性能對該表進行排序。在系統負載太大時,可以有數個並發的SMTP進程同時運行。
pipe是postfix調用
外部命令處理郵件的機制.
延伸程式
EMOS
EMOS是一個基於CentOS,集成ExtMail
郵件系統,只需10分鐘就可安裝配置完畢的小型Linux系統,使安裝不再有壓力。
ExtMail 郵件系統
ExtMail最初以WebMail軟體為主,後逐步完善配套並形成了ExtMail郵件系統,提供完整的SMTP/POP/IMAP/Web和管理支持。目前裝機量超過2萬台。
iRedMail
iRedMail 是一套基於 GPL 發布的 Shell 腳本,目的是全自動安裝和配置郵件服務所需要的組件,以減輕系統管理員的負擔。它提供了一個基本的命令行下的用戶
互動界面(使用 dialog 程式實現),用戶只需要簡單地選擇他所希望使用的組件,就可以在幾分鐘內(少於 3 分鐘)部署好一台功能強大的
郵件伺服器。
Tmail
Tmail最初以postfix後台管理軟體為主,後逐步完善配套並形成了tmail郵件系統,提供完整的SMTP/POP/IMAP/Web和後台管理和監控支持。目前裝機量超過3萬台。
版本發布
2012年02月01日,Postfix 2.9.0/2.8.8 發布,SMTP伺服器。
2012年02月19日,Postfix 2.9.1 發布,SMTP 伺服器。
2012年12月14日,Postfix 2.9.5/2.8.13 發布,SMTP 伺服器。