1、 postfix概述
postfix是Wietse Venema在IBM的GPL協議之下開發的MTA(郵件傳輸代理)軟件。下面一段話摘自postfix的官方站點([url]http://www.postfix.org[/url]):「postfix是Wietse Venema想要爲使用最普遍的sendmail提供替代品的一個嘗試。在Internet世界中,大部分的電子郵件都是經過sendmail來投遞的,大約有100萬用戶使用sendmail,天天投遞上億封郵件。這真實一個讓人吃驚的數字。Postfix試圖更快、更容易管理、更安全,同時還與sendmail保持足夠的兼容性。」
1.1 postfix的特色
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程序能夠運行在較低的權限之下,不能夠經過網絡訪問安全性相關的本地投遞程序等等。
1.2 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經過一系列的措施來提升系統的安全性,這些措施包括:
1. 動態分配內存,從而防止系統緩衝區溢出;
2. 把大郵件分割成幾塊進行處理,投遞時再重組;
3. Postfix的各類進程不在其餘用戶進程的控制之下運行,而是運行在駐留主進程master的控制之下,與其餘用戶進程無父子關係,全部有很好的絕緣性。
4. Postfix的隊列文件有其特殊的格式,只能被postfix自己識別;
2、 postfix對郵件的處理過程 2.1 接收郵件的過程 當postfix接收到一封新郵件時,新郵件首選在incoming隊列處停留,而後針對不一樣的狀況進行不一樣的處理: 1.對於來自於本地的郵件:sendmail進程負責接收來自本地的郵件放在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]user@fully.qualified.doma[/email]in格式進行排列;重信頭中抽出收件人的地址;將郵件投入incoming隊列中,並請求郵件隊列管理進程處理該郵件;請求trivial-rewrite進程將地址轉換成標準的[email]user@fully.qualified.doma[/email]in格式。 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是用於UUCP協議的投遞代理。