利用postfix搭建基於虛擬賬號的郵件系統

一,postfix概述:

     postfix是Wietse Venema在IBM的GPL協議之下開發的MTA(郵件傳輸代理)軟件。postfix是Wietse Venema想要爲使用最廣泛的sendmail提供替代品的一個嘗試。在Internet世界中,大部分的電子郵件都是通過sendmail來投遞的,大約有100萬用戶使用sendmail,每天投遞上億封郵件。這真是一個讓人吃驚的數字。Postfix試圖更快、更容易管理、更安全,同時還與sendmail保持足夠的兼容性。

     postfix 是一種電子郵件服務器,它是由任職於IBM華生研究中心(T.J. Watson Research Center)的荷蘭籍研究員Wietse Venema爲了改良sendmail郵件服務器而產生的。最早在1990年代晚期出現,是一個開放源代碼的軟件。

二,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程序可以運行在較低的權限之下,不可以通過網絡訪問安全性相關的本地投遞程序等等。

處理過程 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規則的記錄等等。)

     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調用外部命令處理郵件的機制.

三,postfix的結構

postfix由十幾個具有不同功能的半駐留進程組成,並且在這些進程中並無特定的進程間父子關係。某一個特定的進程可以爲其他進程提供特定的服務。

大多數的postfix進程由一個進程統一進行管理,該進程負責在需要的時候調用其他進程,這個管理進程就是master進程。該進程也是一個後臺程序。

這些postfix進程是可以配置的,我們可以配置每個進程運行的數目,可重用的次數,生存的時間等等。通過靈活的配置特性可以使整個系統的運行成本大大降低。

3.1 postfix的郵件隊列(mail queues)

postfix有四種不同的郵件隊列,並且由隊列管理進程統一進行管理:

1. maildrop:本地郵件放置在maildrop中,同時也被拷貝到incoming中。

2. incoming:放置正在到達或隊列管理進程尚未發現的郵件。

3. active:放置隊列管理進程已經打開了並正準備投遞的郵件,該隊列有長度的限制。

4. deferred:放置不能被投遞的郵件。

隊列管理進程僅僅在內存中保留active隊列,並且對該隊列的長度進行限制,這樣做的目的是爲了避免進程運行內存超過系統的可用內存。

3.2 postfix對郵件風暴的處理

當有新的郵件到達時,postfix進行初始化,初始化時postfix同時只接受兩個併發的連接請求。當郵件投遞成功後,可以同時接受的併發連接的數目就會緩慢地增長至一個可以配置的值。當然,如果這時系統的消耗已到達系統不能承受的負載就會停止增長。還有一種情況時,如果postfix在處理郵件過程中遇到了問題,則該值會開始降低。

當接收到的新郵件的數量超過postfix的投遞能力時,postfix會暫時停止投遞deferred隊列中的郵件而去處理新接收到的郵件。這是因爲處理新郵件的延遲要小於處理deferred隊列中的郵件。Postfix會在空閒時處理deferred中的郵件。

3.3 postfix對無法投遞的郵件的處理

當一封郵件第一次不能成功投遞時,postfix會給該郵件貼上一個將來的時間郵票。郵件隊列管理程序會忽略貼有將來時間郵票的郵件。時間郵票到期時,postfix會嘗試再對該郵件進行一次投遞,如果這次投遞再次失敗,postfix就給該郵件貼上一個兩倍於上次時[間郵票的時間郵票,等時間郵票到期時再次進行投遞,依此類推。當然,經過一定次數的嘗試之後,postfix會放棄]對該郵件的投遞,返回一個錯誤信息給該郵件的發件人。

    3.4 postfix對不可到達的目的地郵件的處理

postfix會在內存中保存一個有長度限制的當前不可到達的地址列表。這樣就避免了對那些目的地爲當前不可到達地址的郵件的投遞嘗試。從而大大提高了系統的性能。

3.5 postfix的安全性

postfix通過一系列的措施來提高系統的安全性,這些措施包括:

1. 動態分配內存,從而防止系統緩衝區溢出;

2. 把大郵件分割成幾塊進行處理,投遞時再重組;

3. Postfix的各種進程不[在其他用戶進程的控制之下運行,而是運行在駐留主進程master的控制之下,與其他用戶進程無父子關係,所有有]很好的絕緣性。

4. Postfix的隊列文件有其特殊的格式,只能被postfix本身識別;

四,案例

     拓撲

2012-09-12_093620

[root@mail Server]# yum install yum install httpd  php  php-mysql  mysql  mysql-server  mysql-devel  openssl-devel  dovecot  perl-DBD-MySQL  tcl  tcl-devel  libart_lgpl  libart_lgpl-devel libtool-ltdl  libtool-ltdl-devel  expect 裝載所必需的環境(關於DNS配置詳見本人博客其他內容)
[root@mail Server]# service mysqld start 開啓服務
[root@mail Server]# chkconfig mysqld on 設置爲開機啓動(爲mysql設置密碼此處略)
[root@mail Server]# service sendmail stop 關閉sendmail
[root@mail Server]# chkconfig sendmail off
[root@mail Server]# service saslauthd start 啓驗證服務
[root@mail Server]# chkconfig saslauthd on
拷文件
[root@mail ~]# tar -zxvf postfix-2.8.2.tar.gz -C /usr/local/src/ 利用源代碼實現支持數據庫連接
[root@mail ~]# cd /usr/local/src/
[root@mail src]# cd postfix-2.8.2/
[root@mail postfix-2.8.2]# groupadd -g 2525 postfix 系統賬號組
[root@mail postfix-2.8.2]# useradd -g postfix -u 2525 -s /sbin/nologin -M postfix創建賬號
[root@mail postfix-2.8.2]# groupadd -g 2526 postdrop
[root@mail postfix-2.8.2]# useradd -g postdrop -u 2526 -s /bin/false -M postdrop
[root@mail postfix-2.8.2]# make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl  -DUSE_TLS ' 'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2   -lssl -lcrypto'(無makefile文件 選擇生成 無config文件 用make生成)
[root@mail postfix-2.8.2]# make
[root@mail postfix-2.8.2]# make install

按照以下的提示輸入相關的路徑([]號中的是缺省值,”]”後的是輸入值,省略的表示採用默認值)

install_root: [/] /
tempdir: [/usr/local/src/ postfix-2.6.5] /tmp
config_directory: [/etc/postfix] /etc/postfix
daemon_directory: [/usr/libexec/postfix]
command_directory: [/usr/sbin]
queue_directory: [/var/spool/postfix]
sendmail_path: [/usr/sbin/sendmail]
newaliases_path: [/usr/bin/newaliases]
mailq_path: [/usr/bin/mailq]
mail_owner: [postfix]
setgid_group: [postdrop]  
       html_directory: [no] /var/www/postfix_html
       manpages: [/usr/local/man]
       readme_directory: [no]

生成別名二進制文件,這個步驟如果忽略,會造成postfix效率極低

[root@mail postfix-2.8.2]# newaliases
設置開機啓動 (利用service啓動)

[root@mail abc]# cp  /mnt/cdrom/Server/postfix-2.3.3-2.1.el5_2.i386.rpm /tmp/abc/
[root@mail abc]# rpm2cpio postfix-2.3.3-2.1.el5_2.i386.rpm |cpio –id 借用原rpm包控制腳本
[root@mail abc]# cd etc/
[root@mail rc.d]# cd init.d/
[root@mail init.d]# cp postfix /etc/init.d/
[root@mail init.d]# vim /etc/init.d/postfix
[root@mail init.d]# service postfix start
[root@mail init.d]# chkconfig --add postfix
[root@mail init.d]# vim /etc/postfix/main.cf
 
2012-09-11_174549

2012-09-11_174556

2012-09-11_174624

2012-09-11_174710

2012-09-11_174902

2012-09-11_175402

爲postfix開啓基於cyrus-sasl的認證功能

2012-09-11_175451

 

[root@mail init.d]# cd /usr/lib/sasl2/
[root@mail sasl2]# cp -p Sendmail.conf smtpd.conf
[root@mail sasl2]# vim smtpd.conf
2012-09-11_180020

[root@mail sasl2]# telnet mail.163.com 25

2012-09-11_180427

[root@mail ~]# tar -jxvf courier-authlib-0.63.1.20111230.tar.bz2  -C /usr/local/src/ 與mysql結合 驗證
[root@mail ~]# cd /usr/local/src/
[root@mail src]# cd courier-authlib-0.63.1.20111230/
[root@mail courier-authlib-0.63.1.20111230]# ./configure --prefix=/usr/local/courier-authlib --sysconfdir=/etc --with-authmysql --with-mysql-libs=/usr/lib/mysql --with-mysql-includes=/usr/include/mysql --with-redhat --with-authmysqlrc=/etc/authmysqlrc --with-authdaemonrc=/etc/authdaemonrc --with-ltdl-lib=/usr/lib --with-ltdl-include=/usr/include
[root@mail courier-authlib-0.63.1.20111230]# make
[root@mail courier-authlib-0.63.1.20111230]# make install
[root@mail courier-authlib-0.63.1.20111230]# chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
[root@mail courier-authlib-0.63.1.20111230]# cp /etc/authdaemonrc.dist  /etc/authdaemonrc 調用認證模塊
[root@mail courier-authlib-0.63.1.20111230]# cp /etc/authmysqlrc.dist  /etc/authmysqlrc   調用數據庫
[root@mail courier-authlib-0.63.1.20111230]# vim /etc/authdaemonrc

2012-09-11_182824

2012-09-11_182932

2012-09-11_183007

[root@mail courier-authlib-0.63.1.20111230]# vim /etc/authmysqlrc

2012-09-11_184047

2012-09-11_184100

2012-09-11_184137

2012-09-11_184246

2012-09-11_184430

2012-09-11_184557

2012-09-11_184742

2012-09-11_184938 

利用service啓動

[root@mail courier-authlib]# cd /usr/local/src/courier-authlib-0.63.1.20111230/
[root@mail courier-authlib-0.63.1.20111230]# cp courier-authlib.sysvinit /etc/init.d/courier-authlib
[root@mail courier-authlib-0.63.1.20111230]# chmod 755 /etc/init.d/courier-authlib
[root@mail courier-authlib-0.63.1.20111230]# service courier-authlib start
[root@mail courier-authlib-0.63.1.20111230]# chkconfig --add courier-authlib
[root@mail courier-authlib-0.63.1.20111230]# chkconfig courier-authlib on

[root@mail courier-authlib-0.63.1.20111230]# echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf.d/courier-authlib.conf生成庫文件被其他軟件包調用
[root@mail courier-authlib-0.63.1.20111230]# ldconfig -v調用
建立虛擬賬號目錄
[root@mail courier-authlib-0.63.1.20111230]# mkdir -pv /var/mailbox
[root@mail courier-authlib-0.63.1.20111230]# chown -R postfix /var/mailbox

[root@mail courier-authlib-0.63.1.20111230]# vim /usr/lib/sasl2/smtpd.conf 更改驗證方式 用authlib驗證
2012-09-11_190830

[root@mail courier-authlib-0.63.1.20111230]# service saslauthd restart
[root@mail courier-authlib-0.63.1.20111230]# service courier-authlib restart

讓postfix支持虛擬域和虛擬用戶
[root@mail courier-authlib-0.63.1.20111230]# vim /etc/postfix/main.cf

2012-09-11_191330

2012-09-11_191343

使用extman源碼目錄下docs目錄中的extmail.sql和init.sql建立數據庫:

[root@mail ~]# tar -zxvf extman-1.1.tar.gz
[root@mail ~]# cd extman-1.1
[root@mail extman-1.1]# cd docs/
[root@mail docs]# mysql -u root -p <extmail.sql
[root@mail docs]# mysql -u root -p &lt;init.sql
[root@mail docs]# mysql -u root -p 進行驗證
mysql> show databases;

2012-09-11_192111
mysql&gt; use extmail;
mysql&gt; show tables;

2012-09-11_192329
[root@mail docs]# cp mysql_virtual_* /etc/postfix/
[root@mail docs]# mysql -u root -p
Enter password: 授予用戶extmail訪問extmail數據庫的權限
mysql&gt; GRANT all privileges on extmail.* TO extmail@localhost IDENTIFIED BY 'extmail';

mysql&gt; GRANT all privileges on extmail.* TO [email protected] IDENTIFIED BY 'extmail';
mysql&gt; FLUSH PRIVILEGES;
已經支持虛擬賬號
[root@mail docs]# service postfix restart
[root@mail docs]# vim /etc/dovecot.conf
2012-09-11_193337 

2012-09-11_193603

2012-09-11_193634

2012-09-11_193744

2012-09-11_193822

2012-09-11_193836

2012-09-11_193918

2012-09-11_194003
2012-09-11_194119

2012-09-11_194230

 

[root@mail docs]# vim /etc/dovecot-mysql.conf  調用數據庫
2012-09-11_194622
[root@mail docs]# vim /etc/postfix/main.cf
2012-09-11_194907
[root@mail docs]# service postfix restart
[root@mail docs]# service dovecot restart
[root@mail docs]# chkconfig dovecot on
[root@mail docs]# mkdir -pv /var/www/extsuite  運行固定目錄
[root@mail ~]# tar -zxvf extmail-1.2.tar.gz  web方式訪問郵箱
[root@mail ~]# mv extmail-1.2 /var/www/extsuite/extmail
[root@mail ~]# mv extman-1.1 /var/www/extsuite/extman
[root@mail ~]# cd /var/www/extsuite/ 
2012-09-11_195708
[root@mail extsuite]# cd extmail/
[root@mail extmail]# cp webmail.cf.default webmail.cf 拷貝樣例文件
[root@mail extmail]# vim webmail.cf 
2012-09-11_200058

2012-09-11_200319

2012-09-11_200356

2012-09-11_200515

 2012-09-11_200826


[root@mail extmail]# service httpd start

[root@mail extmail]# chkconfig httpd on
[root@mail extmail]# vim /etc/httpd/conf/httpd.conf

2012-09-11_201558

2012-09-11_201652
[root@mail extmail]# chown -R postfix.postfix /var/www/extsuite/extmail/cgi/

測試

2012-09-11_203134
註冊 裝載extman
[root@mail extmail]# cd /var/www/extsuite/
[root@mail extsuite]# cd extman
[root@mail extman]# cp webman.cf.default webman.cf
[root@mail extman]# vim webman.cf

2012-09-11_203834

2012-09-11_203842
[root@mail extsuite]# cd extmail/
[root@mail extmail]# vim webmail.cf

2012-09-11_204152
[root@mail extmail]# cd ../extman/
[root@mail extman]# chown -R postfix.postfix /var/www/extsuite/extman/cgi/
[root@mail extman]# vim /etc/httpd/conf/httpd.conf
2012-09-11_204630

[root@mail extman]# mkdir  -pv  /tmp/extman
[root@mail extman]# chown postfix.postfix  /tmp/extman

[root@mail ~]# tar -zxvf Unix-Syslog-1.1.tar.gz
[root@mail ~]# cd Unix-Syslog-1.1
[root@mail Unix-Syslog-1.1]# perl Makefile.PL
[root@mail Unix-Syslog-1.1]# make
[root@mail Unix-Syslog-1.1]# make install
[root@mail Unix-Syslog-1.1]# vim /etc/postfix/main.cf
2012-09-11_210409
[root@mail Unix-Syslog-1.1]# service postfix restart
測試圖

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2012-09-11_205408

2012-09-11_205543

2012-09-11_205654

2012-09-11_205800

2012-09-11_205824

2012-09-11_205844

2012-09-11_205858

2012-09-11_210103

 

 

 

 

 

 

 

2012-09-11_210108

2012-09-11_210526

2012-09-11_210609

 

 

 

2012-09-11_210614

2012-09-11_210624

2012-09-11_210630

2012-09-11_210842

 

 

 

2012-09-11_210923

2012-09-11_211010

 

2012-09-11_211034

2012-09-11_211051

 

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