Postfix服務器與PHP的結合

1.1

首先是post的介紹

現在,運行在Linux環境下免費的郵件服務器,或者稱爲MTA(Mail Transfer Agent)有若干種選擇,比較常見的有Sendmail、Qmail、Postfix、exim及Zmailer 等。

本文希望通過對幾種影響相對來說比較大的主流Linux環境下的MTA的特點進行闡述,並對其優缺點一一分析比較,使用戶在選擇Linux環境下的免費MTA時有一個選擇的依據。

Postfix

Postfix是一個由IBM資助下由Wietse Venema 負責開發的自由軟件工程的一個產物,其目的是爲用戶提供除sendmail之外的郵件服務器選擇。Postfix力圖做到快速、易於管理、提供儘可能的安全性 ,同時儘量做到和sendmail郵件服務器保持兼容性以滿足用戶的使用習慣。起初,Postfix是以VMailer這個名字發佈的,後來由於商標上的原因改名爲Postfix。

一、主要設計目標

Postfix工程的目標是實現一個郵件服務器,提供給用戶除sendmail以外的選擇。其設計目標包括:

性能。 Postfix要比同類的服務器產品速度快三倍以上,一個安裝Postfix的臺式機一天可以收發百萬封信件。Postfix設計中採用了web服務器的的設計技巧以減少進程創建開銷,並且採用了其他的一些文件訪問優化技術以提高效率,但同時保證了軟件的可靠性。

兼容性。Postfix設計時考慮了保持Sendmail的兼容性問題,以使移植變的更加容易。Postfix支持/var[/spool]/mail, /etc/aliases, NIS, 及 ~/.forward等文件。然而Postfix爲保證管理的簡單性,所以沒有支持配置文件sendmail.cf。

安全和健壯性。Postfix設計上實現了程序在過量負載情況下仍然保證程序的可靠性。當出現本地文件系統沒有可用空間或沒有可用內存的情況時,Postfix就會自動放棄,而不是重試使情況變的更糟。

靈活性。Postfix結構上由十多個小的子模塊組成,每個子模塊完成特定的任務,如通過SMTP協議接收一個消息,發送一個消息,本地傳遞一個消息,重寫一個地址等等。當出現特定的需求時,可以用新版本的模塊來替代老的模塊,而不需要更新整個程序。而且它也很容易實現關閉某個功能。

安全性。Postfix使用多層防護措施防範攻擊者來保護本地系統,幾乎每一個Postfix守護進程都能運行在固定低權限的chroot之下,在網絡和安全敏感的本地投遞程序之間沒有直接的路徑?一個攻擊者必須首先突破若干個其他的程序,纔有可能訪問本地系統。Postfix甚至不絕對信任自己的隊列文件或IPC消息中的內容以防止被欺騙。Postfix在輸出發送者提供的消息之前會首先過濾消息。而且Postfix程序沒有set-uid。

二、Postfix的一些特點

支持多傳輸域:sendmai支持在Internet, DECnet, X.400及UUCP之間轉發消息。 Postfix則靈活的設計爲無須虛擬域(vistual domai)或別名來實現這種轉發。但是在早期的發佈裏僅僅支持STMP和有限度地支持UUCP,但對於我國用戶來說,多傳輸域的支持沒有什麼意義。

虛擬域:在大多數通用情況下,增加對一個虛擬域的支持僅僅需要改變一個Postfix查找信息表。其他的郵件服務器則通常需要多個級別的別名或重定向來獲得這樣的效果。

UCE控制(UCE,unsolicited commercial email): Postfix能限制哪個主機允許通過自身轉發郵件,並且支持限定什麼郵件允許接進。Postfix實現通常的控制功能:黑名單列表、RBL查找、HELO/發送者DNS覈實。基於內容過濾當前沒有實現。

表查看: Postfix沒有實現地址重寫語言,而是使用了一種擴展的表查看來實現地址重寫功能。表可以是本地 dbm或 db文件等格式。

三、Postfix體系結構及與Sendmail的比較

Postfix是基於半駐留,互操作的進程的體系結構,每個進程完成特定的任務,沒有任何特定的進程衍生關係(父子關係)。而且,獨立的進程來完成不同的功能相對於“單塊”程序具有更好的隔離性。此外,這種實現方式具有這樣的優點:每個服務如地址重寫等都能被任何一個Postfix部件所使用,無須進程創建等開銷,而僅僅需要重寫一個地址,當然並不是只有postfix採用這種方式。

Postfix是按照這種方式實現的:一個駐留主服務器根據命令運行Postfix守護進程,守護進程完成發送或接收網絡郵件消息,在本地遞交郵件等等功能。守護進程的數目由配置參數來決定的,並且根據配置決定守護進程運行的次數(re-used times),當空閒時間到達配置參數指定的限度時,自動消亡。這種方法明顯地降低了進程創建開銷,但是單個進程之間仍然保持了良好的隔離性。

Postfix的設計目標就是成爲Sendmail的替代者。由於這個原因,Postfix系統的很多部分,如本地投遞程序等,可以很容易地通過編輯修改類似inetd的配置文件來替代。

Postfix的核心是由十多個半駐留程序實現的。爲了保證機密性的原因,這些Postfix進程之間通過Unix的socket或受保護的目錄之下的FIFO進行通信。即使使用這種方法來保證機密性,Postfix進程並不盲目信任其通過這種方式接收到的數據。

Postfix進程之間傳遞的數據量是有限制的。在很多情況下,Postfix進程之間交換的數據信息只有隊列文件名和接收者列表,或某些狀態信息。一旦一個郵件消息被保存進入文件,其將在其中保存到被一個郵件投遞程序讀出。

Postfix採用一些通常的措施來避免丟失信息:在收到確認以前通過調用flush和fsync()保存所有的數據到磁盤中。檢查所有的系統調用的返回結果來避免錯誤狀況。

大多數構建郵件服務器者都會選擇sendmail,公平的來講sendmail是一個不錯的MTA(Mail Transfer Agent),最初開發時Eric Allman的設計考慮主要放在了郵件傳遞的成功性。不幸的是,Sendmai開發時沒有太多的考慮Internet環境下可能遇到的安全性問題。Sendmail在大多數系統上只能以根用戶身份運行,這就意味着任何漏洞都可能導致非常嚴重的後果,除了這些問題之外,在高負載的情況Sendmail運行情況不是很好。

四、postfix 的安全

Postfix 則並一定要以root的身份運行,而只需要一個主(master)程序以root身份運行,其生成進程來處理接入、發出及本地郵件投遞工作。通過使用一系列模塊部件,每個任務由一個單獨的程序來運行(這樣使審計變的容易一些)。例如發出郵件被卸載到一個隊列目錄,在這裏“pcikup”程序取到該郵件然後將郵件傳遞給“cleanup”程序,其再將郵件傳遞給“trivial-rewrite”,其負責處理郵件頭,最後若郵件目的是別的系統則將郵件傳遞給“smtp”程序。而且相對於Sendmail來說Postfix也更容易設置chroot‘ed環境。只要簡單地通過編輯master.cf(一般位於/etc/postfix內)文件即可實現,並且Postfix將運行chroot‘ed,以限定在其定義的隊列目錄之下(通常位於/var/spool/postfix),同樣可以在master.cf中對Postfix的單一模塊設置進程限制。用戶可以限制Postfix以哪個用戶的身份運行,一般來說是以“postfix”用戶(概念上該用戶和Apache的nobody類似)運行,該用戶可以訪問特定的隊列目錄。Postfix其他的主要優點是起配置文件的清晰易懂性。

與Sendmail的比較 如sendmail之類的郵件系統是按照一個單塊的結構設計實現的,該“單塊”程序實現所有的功能。當然這種結構有利於在系統的不同部分之間共享數據。但是這種結構容易出現一些致命的錯誤。而如qmail的郵件系統上使用一種分層次的結構,按照固定得順序運行不同功能的子模塊進程,執行完畢之後就將其釋放。這種方法有良好的“絕緣”性,但是增加了進程創建開銷和進程間通信開銷。但是通過合理的規劃子模塊進程的運行順序可以將開銷保持在可以接受的範圍內。

使用其他的MTA替代Sendmail是一件非常麻煩的事情,用戶往往又要花大量的時間去熟悉新的MTA的配置和使用。而使用Postfix,你可以利用很多以有的配置文件。如(access, aliases, virtusertable等等),只需要簡單的在master.cf中定義一下即可。此外,Postfix在行爲上也很象Sendmail,用戶可以使用sendmail命令來啓動Postfix。

當然,使用一個軟件來替代另外一個軟件需要解決特定的問題。部分原因是因爲Postfix安全特性,在配置Postfix時可能會遇到一些問題。最典型的問題是向root用戶發送郵件。Postfix一般不提高自身的權限(向root用戶發送郵件所必須的)來投遞郵件。用戶需要在別名文件中爲root定義別名,如:root: someuser。這同樣會對若干個郵件列表模塊發生影響,特別是SmartList。一般來說實現郵件列表最好使用Majordomo,它易於配置。

Sendmail一個很突出的問題就是可擴展性和性能問題。例如用戶若希望每天重新啓動Sendmail來實現自動更新配置文件(如爲虛擬主機重定向郵件)就會出現問題。Sendmail生成新的進程來處理髮送和接收郵件,這些進程會一直存在直到傳輸結束,之後Sendmail才能退出,這樣你的腳本程序將不能正確的重起Sendmail。而對於Postfix,用戶則只需要發出命令postfix reload即可,Postfix將會重新加載其配置文件。

另外,對於有數以萬計的用戶的郵件服務器來說,使用文件來存儲如匹配用戶發出郵件地址(例如bob發出的信的發信人修改爲[email protected])。對於大量用戶來講,該文件就會變的很巨大,從而影響系統的運行效率。而Postfix則可以和一個數據庫後臺集成起來(當前只支持MySQL)來存放其配置信息,數據庫方式要比文件方式在可擴展性方面強大很多。

遵從IBM的開放源代碼版權許可證,用戶可以自由地分發該軟件,進行二次開發。其唯一的限制就是必須將對Postfix做的修改返回給IBM公司。因爲IBM資助了Wietse的開發。

1.2 安裝

postfix安裝教程

postfix

postfix

我喜歡這隻小老鼠!

一、安裝postfix

如果您安裝了sendmail請先卸載它

命令:

yum remove sendmail

安裝:

yum install postfix

更改默認MTA爲Postfix

命令:

#/usr/sbin/alternatives --set mta /usr/sbin/sendmail.postfix

或者

#alternatives --config mta  ← 設置默認MTA

There are 2 programs which provide 'mta'.

Selection Command-----------------------------------------------*+ 1 /usr/sbin/sendmail.sendmail  ← 當前狀態:sendmail爲默認MTA 2 /usr/sbin/sendmail.postfix

Enter to keep the current selection[+], or type selection number: 2← 在這裏輸入2,使Postfix成爲默認MTA


再次檢查下是否將MTA改爲Postfix了。

命令:

alternatives --display mta


配置Postfix,vi編輯main.cf

vi /etc/postfix/main.cf

輸入?myhostname 查找定位以此類推

二、配置Postfix相關參數

配置文件解釋:
mydomain:
mydomain參數是指email服務器的域名,請確保爲正式域名(如centos.bz)
myhostname:
myhostname參數是指系統的主機名稱(如我的服務器主機名稱是mail.centos.bz)
myorigin:
myorigin參數指定本地發送郵件中來源和傳遞顯示的域名。在我們的例子中,mydomain是centos.bz,也是我的域名。
對於下面的一行,我們的郵件地址是[email protected]而不是[email protected]
myorigin = $mydomain
mynetworks:
mynetworks參數指定受信任SMTP的列表,具體的說,受信任的SMTP客戶端允許通過Postfix傳遞郵件。
mydestination:
mydestination參數指定哪些郵件地址允許在本地發送郵件。這是一組被信任的允許通過服務器發送或傳遞郵件的IP地址。用戶試圖通過發送從此處未列出的IP地址的原始服務器的郵件將被拒絕。
inet_interfaces:
inet_interfaces參數設置網絡接口以便Postfix能接收到郵件。
relay_domains:
該參數是系統傳遞郵件的目的域名列表。如果留空,我們保證了我們的郵件服務器不對不信任的網絡開放。
home_mailbox:
該參數設置郵箱路徑與用戶目錄有關,也可以指定要使用的郵箱風格。

PHP.ini修改

# vi /etc/php.ini默認:sendmail_path = /usr/sbin/sendmail -t -i修改爲sendmail_path = /usr/sbin/sendmail.postfix -t -i


ESC鍵返回Shift+: wq保存

LNMP筆記:Centos下安裝Postfix,替換sendmail發送郵件

倡萌以前介紹過 使用 sendmail 發送郵件,但是  sendmail 發送郵件很慢,要解決這個問題,可以試試 sendmail無法發送郵件及發送過慢等相關問題。倡萌這裏主要是想利用 Postfix 替換 sendmail 組件,因爲據說 Postfix 的效率更高些。測試環境爲阿里雲的 Centos 5.4 32位系統,演示的域名爲 wpdaxue.com,請更換爲自己的實際域名。

1、如果裝了sendmail的話,先卸載了。

yum remove sendmail

2、安裝 Postfix

yum install postfix

3、更改默認MTA爲Postfix:

/usr/sbin/alternatives --set mta /usr/sbin/sendmail.postfix

4、完事兒,再次檢查下是否將MTA改爲Postfix了:

alternatives --display mta

5、配置Postfix,vi編輯main.cf

vi /etc/postfix/main.cf

打開後分別找到以下幾項,將其前面的#去掉,並做配置:

    myhostname = mail.wpdaxue.com
    mydomain = wpdaxue.com
    myorigin = $mydomain
    inet_interfaces = all
    inet_protocols = ipv4
    mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
    mynetworks = 192.168.100.10/28, 127.0.0.0/8
    relay_domains =
    home_mailbox = Maildir/

以上幾個設置項不在同一個位置,需要分別尋找,並進行更改,其中相應的域名請改爲自己的地址,mynetworks我是沒有做改變,自動就有的。我剛開始也是配置錯了導致安裝失敗,後來在 @朱茂海的博客找到該答案,以上幾項的含義解釋也來自該網站,感謝作者提供。

配置文件解釋:
mydomain:
mydomain參數是指email服務器的域名,請確保爲正式域名(如centos.bz)
myhostname:
myhostname參數是指系統的主機名稱(如我的服務器主機名稱是mail.centos.bz)
myorigin:
myorigin參數指定本地發送郵件中來源和傳遞顯示的域名。在我們的例子中,mydomain是centos.bz,也是我的域名。
對於下面的一行,我們的郵件地址是[email protected]而不是[email protected]
myorigin = $mydomain
mynetworks:
mynetworks參數指定受信任SMTP的列表,具體的說,受信任的SMTP客戶端允許通過Postfix傳遞郵件。
mydestination:
mydestination參數指定哪些郵件地址允許在本地發送郵件。這是一組被信任的允許通過服務器發送或傳遞郵件的IP地址。用戶試圖通過發送從此處未列出的IP地址的原始服務器的郵件將被拒絕。
inet_interfaces:
inet_interfaces參數設置網絡接口以便Postfix能接收到郵件。
relay_domains:
該參數是系統傳遞郵件的目的域名列表。如果留空,我們保證了我們的郵件服務器不對不信任的網絡開放。
home_mailbox:
該參數設置郵箱路徑與用戶目錄有關,也可以指定要使用的郵箱風格。

6、檢測並啓動Postfix

service postfix status //檢測,若已啓動會列出其PID,如下:
master (pid 25579) is running...

//若未啓動,執行以下命令:
service postfix start

7、設置開機啓動

chkconfig postfix on

我自己的安裝到此爲止就結束了,因爲我只需要的是mail功能,並非搭建郵件服務器。此時測試郵件發送,OK。

參考資料:http://www.gongzi.org/centos-install-postfix-sendmail.html

8、補充:如果你之前沒有配置過 sendmail 組件,那你很可能沒有修改 php.ini 的郵件發送路徑,那樣可能無法發送郵件。

所以你需要配置php.ini,填寫sendmail的絕對路徑:

使用命令打開編輯php.ini

vi /usr/local/php/etc/php.ini

輸入?sendmail_path 查找定位(或者手動跳轉找到sendmail_path),你會發現默認是下面的代碼

;sendmail_path =

按 i 進入編輯,將這行修改爲

sendmail_path = /usr/sbin/sendmail -t -i

按 Esc 鍵退出編輯,輸入 :wq 保存退出

重啓php-fpm進程

/etc/init.d/php-fpm restart

9、補充2:通過以上配置,就可以正常發送郵件了,但是發件人郵箱會是 [email protected] 這種類型,如果想修改 www 這個參數,比如修改爲 [email protected] 需要按照下面的步驟操作:

編輯 /etc/postfix/canonical:

vi /etc/postfix/canonical

添加下面類型的代碼:

www [email protected]

保存退出,然後進入到 /etc/postfix/ 目錄:

cd /etc/postfix/

執行命令:

postmap canonical

接着編輯 /etc/postfix/main.cf:

vi /etc/postfix/main.cf

一般情況下里面沒有canonical_maps這個參數,在空行處添加:

canonical_maps = hash:/etc/postfix/canonical

保存退出,然後重啓 postfix:

postfix reload

再次發送郵件測試,奇蹟應該就發生啦!

10、補充3:通過上面的設置,雖然可以正常發送郵件,但是建議添加 DNS 解析,以減少被判定爲垃圾郵件的機率。通常需要添加3個解析:A記錄、MX記錄、TXT記錄,比如這裏的 wpdaxue.com 域名的解析如下:

2015-03-19_222530

這樣就好多了,最後,推薦使用下面的網站來測試你的服務器發送的郵件所得分數,它會給出詳細的測試結果和改進方法:

http://www.mail-tester.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章