POSTFIX工作原理及相關概念
Postfix內部收信、發信流程圖
整個處理流程分爲三個階段:接收郵件、將郵件排入隊列、遞送郵件。每個階段由一組獨立的Postfix組件負責。當一封郵件被收下並排入隊列之後,隊列管理器(Queue Manager)會啓動適當的MDA,將郵件送到終點。
郵件如何進入Postfix系統
1、Postfix可接受來自本機系統的郵件(本機用戶或自主進程提交的郵件)。
2、Postfix可接受網絡傳入的郵件(來自MUA或者其他MTA)。
3、已經被Postfix收下並交給MDA的郵件,被MDA傳回到Postfix(通常是爲了轉寄到另一個地址)。
4、當Postfix無法將郵件寄到目的地時,自己會產生退信通知函。
郵件有可能在進入Postfix之前就被拒絕了,或者因爲暫時性的故障(網絡斷線、遠程服務器響應暫時性的錯誤等),同樣的郵件可能會每隔一段時間就重複進入Postfix系統一次,重新遞送。
1)來自服務器本機的郵件
在Unix系統上,當用戶要寄出郵件時(不管這封信是寄到哪裏),通常是使用sendmail包內的sendmail命令。Postfix提供了一個與此命令兼容的同名工具,也稱爲sendmail。當用戶以Postfix的sendmail寄出郵件後,sendmail(postfix的版本)會使用postdrop程序將郵件存入Postfix隊列目錄下的maildrop/子目錄。專門注意maildrop子目錄有無變化的是Pickup Daemon,每當有新的郵件進入maildrop時,Pickup Daemon便會讀出新郵件,然後交給cleanup daemon進入“清理程序”。
當郵件剛進入Postfix時,不一定含有構成有效郵件的所有必要字段,而且標頭裏的地址也可能需要被改寫成標準格式([email protected]),並依據規範的或虛擬的查詢表(如果有的話)將原本的地址改成其他地址。所謂“清理程序”就是補足遺漏的標頭字段,這部分工作由cleanup daemon負責;地址的處理由Trivial-Rewrite Daemon負責。
經過Cleanup Daemon處理好的郵件,會被傳入收件隊列(Incoming Queue)。Queue Manager會不斷的注意收件隊列的變化,每當有新郵件進入收件隊列時,便會用適當的MDA將郵件送到下一站,或直接送到最終目的地。
Smtpd一定會收下第一種郵件(如果收件人存在的話),至於第二種郵件(目的地在其他網域),就要看傳郵件過來的客戶端是否有資格。網絡收下要寄到其他網域的郵件,並代爲寄送到目的地的動作稱爲轉發(relay)。在兩種情況下,Postfix願意提供轉發服務:一是客戶端符合配置文件限定的資格,二是收信網域是relay_domain參數所列出的網域之一。
3)通知函
Queue Manager總共維護四種隊列:收件(Incoming)、活動(Active)、延遲(Deferred)、故障(Corrupt)。新郵件通過Cleanup之後的第一站是“收件隊列”。假設系統資源空閒。Queue Manager會將郵件移入“活動隊列”,然後調用適當的MDA來投遞郵件,而投遞失敗的郵件則會被移入“耽擱隊列”。
如果郵件被耽擱太久,或是被判定無法送達,則Queue Manager還要負責協調Bounce與Defer Daemons來產生一份遞送狀態報告,並傳回給系統管理員或送信者(或兩者)。在Postfix的隊列目錄下(默認位置是/var/spool/postfix/),除了上述四種郵件隊列目錄之外,還有bounce/與defer/目錄。這些目錄含有狀態信息,解釋特定郵件爲何被耽擱或無法遞送,Bounce與Defer Daemon就是利用這些目錄下的狀態信息來產生通知函。
投遞操作
對於需要轉寄到他處的郵件,將會被重新提交會Postfix,以便傳送到新地址。如果傳送過程發生了暫時性問題,MDA會通知Queue Manager,而郵件會被保存在延遲隊列等待下次的遞送機會;如果發生永久性問題,則要求Queue Manager將信息退給發信者。
虛擬郵箱郵件
其他郵件
當Smtp MDA收到外地郵件時,它會依據收件地址來判斷郵件應該送到哪個(或哪些)主機,然後依序連接到這些主機,直到有一部主機願意收下郵件爲止。如果投遞過程發生暫時性問題,Smtp會通知Queue Manager將郵件放在延遲隊列,等待下次傳送的機會;如果發生永久性錯誤,則要求Queue Manager退信給發信者。
當因暫時故障而不能連接的遠程主機恢復連接時,Postfix會先採取試探性動作,以免過多的延遲郵件使對方癱瘓。一開始,Smtp只會搭建有限度的幾條連接通道(數量可通過配置文件調整)到收件方,在發現對方能夠成功收下郵件之後,纔會慢慢提升連接通道的數量(到一個可設定的上限);相反的,如果Smtp發現接送方有任何麻煩,它會立刻撤銷連接。
實際上,LMTP最常被用來將郵件交給特殊的POP/IMAP Server,以便使用特殊郵箱格式來存儲郵件。在這種情況下,由於只要POP/IMAP SERVER知道特殊郵件格式,所以只好使用標準的LMTP來交付郵件。如果LMTP投遞過程中出了任何問題,LMTP MDA會通知Queue Manager將郵件放在延遲隊列,等待下次傳送的機會。
實際追蹤POSTFIX的郵件處理流程
讓我們追蹤一封典型郵件如何通過POSTFIX系統。處理流程是一封郵件從發信方到達目的地(信封地址所指的MTA),然後又被轉寄到最終的MTA(收件人實際取信處)。
例如:HELENE的賬戶位於一臺運行POSTFIX的服務器,她使用自己習慣的MUA編寫郵件,然後調用POSTFIX的sendmail命令送出郵件。POSTFIX的sendmail程序從HELENE的MUA軟件中取下郵件,然後放在隊列的MAILDROP/子目錄下。接着,Pickup Daemon從該目錄取出郵件,交給CLEANUP DAEMON運行必要的清理程序,如果HELENE的MUA軟件沒提供地址from:,或是該地址沒使用完整的主機名稱,則Cleanup會自動補齊不足的信息以確保郵件格式符合標準。完成清理程序之後,Cleanup將郵件存入收件隊列,並通知Queue Manager,使其知道有一封新信正在等待投遞。
如果Queue Manager已經準備好處理新郵件,它會將郵件搬移到活動隊列。由於HELENE的信是要送到其他網域系統的用戶,所以Queue Manager使用SMTP MDA來投遞該郵件。SMTP使用DNS查出哪些郵件服務器願意收下目的地網域的郵件,然後從中挑出最優先的郵件交換主機(MX HOST)並與該主機接洽,以SMTP協議送出HELENE寫的郵件。
當目的網域的服務器上的MTA SMTPD收下HELENE的SMTP MDA送來的郵件。當smtpd確認它應該收下該郵件之後,它會將郵件交給Cleanup Daemon進行檢查,然後存入收件隊列。
Queue Manager將郵件搬移到活動隊列,檢查收件人地址,然後使用LOCAL MDA來進行投遞操作。接着,LOCAL發現收件地址其實是一個別名,其真實地址位於另一個網域,所以將郵件與新地址信息傳給CLEANUP DAEMON,回到POSTFIX的隊列系統。
當CLEANUP與Queue Manager處理郵件時,依靠TRIVIAL-REWRITE將地址轉換成標準格式,並判斷傳送方式以及遞送流程到下一站。
當Queue Manager發現新郵件應該送到另一個網絡,則會調用SMTP來進行投遞操作,而SMTP會先向DNS查出哪些郵件服務器可能接收該網域的郵件。該網域的MTA收下這封郵件後,最後會將郵件交給LOCAL MDA,由它將郵件存入該系統的郵箱。
到這個時候,Postfix就完成了它的工作。這時收件人現可以用他自己的MUA來閱讀郵件,至於這個MUA是直接從郵箱取信,還是使用POP或IMAP之類的協議通過網絡下載郵件,都已經不是Postfix所能控制的了。
我們的例子只假設了最理想的簡單狀態,實際的傳送程序可能會遇到一些意外狀況,諸如網絡臨時斷線、遠程主機死機、郵箱空間不足。發生意外時,MDA必須通知Queue Manager,將郵件暫時放回延遲隊列,等待一段時間之後再重新投遞。
除了臨時意外回影響投遞過程,還有一些情況也會影響,比方說,收件人並非實際的系統賬戶,而是IMAP郵件系統的一個賬戶,在這種情況下,Queue Mananger可能要通過LMTP MDA來投遞郵件,或是通過PIPE MDA將郵件送到一個事先確定的外部程序。
Postfix還要面對各式各樣的變化與潛在的複雜性,幸運的,它本身的結構設計足夠穩定,幾乎能夠應付所有可想像到的情況,也有足夠的可塑性來適應未來的可能變化。
隊列種類
Qmgr組件:隊列管理器。各個postfix組件之間的合作依靠隊列交換郵件。
Sendmail組件:服務器本機發送郵件。
Postdrop組件:將郵件存入postfix隊列目錄下的maildrop/子目錄。
Pickup組件:監視maildrop/子目錄,讀出新郵件,交給cleanup組件。
Cleanup組件:補足遺漏的標頭字段。
Trivial-Rewrite組件:地址處理,改成標準格式。決定路由信息,包括傳輸方法、下一站以及收件人地址。
Smtpd組件:接收來自網絡的郵件,交給cleanup組件處理。
Defer組件:郵件被延時時產生通知函。
Bounce組件:郵件無法送達目的地時產生通知函。
Dns組件:查找符合條件的郵件服務器。
postcat:顯示出隊列文件的內容,讓管理員可觀察滯留在隊列裏的郵件內容。
postconf:顯示或改變postfix參數,可一次顯示一個參數,或是顯示所有參數。
postdrop:將郵件放回到maildrop目錄,由postfix重新進行投遞操作。
postfix:啓動或停止postfix系統,或重新讀取配置文件。也可以用於其他維護工作,包括檢查系統配置,以及清空隊列。
postkick:對特定postfix服務發出請求。此工具的作用,主要是給shell scripts提供一個能夠與postfix溝通服務的管道。
postlock:鎖定特定文件,確保能夠獨佔訪問。此工具的作用,主要是讓shell scripts能使用兼容於postfix的鎖定方式。
postlog:將特定的信息記錄到系統日誌文件中。這是支持shell scripts工具,使其能以類似於postfix的樣式來記錄信息到日誌文件。
postmap:創建查詢表的DB數據庫或查詢查詢表內容。postfix有許多配置信息都是記錄在postmap所建的查詢表數據庫中。
postqueue:讓一般的用戶能夠有限度地訪問postfix隊列。可能改變隊列的訪問方式需要有管理員特權才能進行,而這方面的訪問能力由postsuper命令提供。
postsuper:供管理員訪問postfix隊列。管理員可刪除郵件、扣留郵件(搬到hold隊列)、取回郵件(將郵件從hold隊列搬回active隊列),必要時,還可以修復隊列目錄結構。
POSTFIX 配置過程
一、安裝前的準備工作:
安裝前說明:郵件服務依賴於DNS服務,請事先確信您的DNS服務已經爲郵件應用配置完成。
1、安裝所需的rpm包,這包括以下這些:
httpd, 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
2、關閉sendmail,並將它的隨系統自動啓動功能關閉:
# service sendmail stop
# chkconfig sendmail off
3、安裝以下開發所用到的rpm包組:
Development Libraries
Development Tools
二、編譯安裝postfix
# groupadd -g 2525 postfix
# useradd -g postfix -u 2525 -s /sbin/nologin -M postfix
# groupadd -g 2526 postdrop
# useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop
# tar zxvf postfix-2.10.3.tar.gz
# cd postfix-2.10.3
# 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'
此處如果你是源碼安裝或是二進制包安裝,注意你的mysql庫文件和頭文件位置
# make && make install
進行一些基本配置,測試啓動postfix並進行發信
# vim /etc/postfix/main.cf
修改以下幾項爲您需要的配置
myhostname = mail.neo.com
myorigin = neo.com
mydomain = neo.com
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 192.168.100.0/24, 127.0.0.0/8
注:參數說明
myorigin參數用來指明發件人所在的域名,即做發件地址僞裝;
mydestination參數指定postfix接收郵件時收件人的域名,即您的postfix系統要接收到哪個域名的郵件;
myhostname 參數指定運行postfix郵件系統的主機的主機名,默認情況下,其值被設定爲本地機器名;
mydomain 參數指定您的域名,默認情況下,postfix將myhostname的第一部分刪除而作爲mydomain的值;
mynetworks 參數指定你所在的網絡的網絡地址,postfix系統根據其值來區別用戶是遠程的還是本地的,如果是本地網絡用戶則允許其訪問;
inet_interfaces 參數指定postfix系統監聽的網絡接口;
配置postfix啓動服務腳本
###############################################################START#################################
#!/bin/bash
# postfix Postfix Mail Transfer Agent
# chkconfig: 2345 80 30
# description: Postfix is a Mail Transport Agent, which is the program \
# that moves mail from one machine to another.
# processname: master
# pidfile: /var/spool/postfix/pid/master.pid
# config: /etc/postfix/main.cf
# config: /etc/postfix/master.cf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ $NETWORKING = "no" ] && exit 3
[ -x /usr/sbin/postfix ] || exit 4
[ -d /etc/postfix ] || exit 5
[ -d /var/spool/postfix ] || exit 6
RETVAL=0
prog="postfix"
start() {
# Start daemons.
echo -n $"Starting postfix: "
/usr/bin/newaliases >/dev/null 2>&1
/usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix
echo
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down postfix: "
/usr/sbin/postfix stop 2>/dev/null 1>&2 && success || failure $"$prog stop"
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix
echo
return $RETVAL
}
reload() {
echo -n $"Reloading postfix: "
/usr/sbin/postfix reload 2>/dev/null 1>&2 && success || failure $"$prog reload"
RETVAL=$?
echo
return $RETVAL
}
abort() {
/usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure $"$prog abort"
return $?
}
flush() {
/usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure $"$prog flush"
return $?
}
check() {
/usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure $"$prog check"
return $?
}
restart() {
stop
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
reload)
reload
;;
abort)
abort
;;
flush)
flush
;;
check)
check
;;
status)
status master
;;
condrestart)
[ -f /var/lock/subsys/postfix ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|abort|flush|check|status|condrestart}"
exit 1
esac
exit $?
#####################################################################END####################
爲此腳本賦予執行權限:
# chmod +x /etc/rc.d/init.d/postfix
將postfix服務添加至服務列表:
# chkconfig --add postfix
設置其開機自動啓動:
# chkconfig postfix on
使用此腳本重新啓動服務,以測試其能否正常執行:
# service postfix restart
此時可使用本地用戶測試郵件收發了。
#####################################################測試開始####################################
[root@mail ~]# telnet mail.neo.com 25
Trying 192.168.100.5...
Connected to mail.neo.com (192.168.100.5).
Escape character is '^]'.
220 mail.neo.com ESMTP Postfix
ehlo mail.neo.com
250-mail.neo.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from:[email protected]
250 2.1.0 Ok
rcpt to:tom
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
hello,I am [email protected]
are you OK?
.
250 2.0.0 Ok: queued as 9041F29802C
quit
221 2.0.0 Bye
Connection closed by foreign host.
[root@mail ~]# tail /var/log/maillog
Mar 1 10:11:47 mail postfix/qmgr[10162]: 9041F29802C: from=<[email protected]>, size=323, nrcpt=1 (queue active)
Mar 1 10:11:47 mail postfix/local[10195]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
Mar 1 10:11:47 mail postfix/local[10195]: 9041F29802C: to=<[email protected]>, orig_to=<tom>, relay=local, delay=92, delays=92/0.01/0/0.05, dsn=2.0.0, status=sent (delivered to mailbox)
[root@mail ~]# su - tom
[tom@mail ~]$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/tom": 1 message 1 new
>N 1 [email protected] Sat Mar 1 10:11 14/430
Message 1:
From [email protected] Sat Mar 1 10:11:47 2014
X-Original-To: tom
Delivered-To: [email protected]
Date: Sat, 1 Mar 2014 10:10:15 +0800 (CST)
From: [email protected]
hello,I am [email protected]
are you OK?
##########################################測試完成###############################################
爲postfix服務開啓用戶別名支持:
1、在配置文件開啓基於hash的別名文件支持
在main.cf中,找到如下指令,而後啓用它(即移除前面的#號):
#alias_maps = hash:/etc/aliases
2、在/etc/aliases文件中定義新的別名項,其格式通常爲以冒號隔開的兩個字段,前一字段爲別名用戶,後一字段爲實際用戶
redhat: neo
3、將/etc/aliases轉換爲hash格式:
# postalias /etc/aliases
4、讓postfix重新載入配置文件,即可進行測試;
實現postfix基於客戶端的訪問控制
1、基於客戶端的訪問控制概覽
postfix內置了多種反垃圾郵件的機制,其中就包括“客戶端”發送郵件限制。客戶端判別機制可以設定一系列客戶信息的判別條件:
smtpd_client_restrictions
smtpd_data_restrictions
smtpd_helo_restrictions
smtpd_recipient_restrictions
smtpd_sender_restrictions
上面的每一項參數分別用於檢查SMTP會話過程中的特定階段,即客戶端提供相應信息的階段,如當客戶端發起連接請求時,postfix就可以根據配置文件中定義的smtpd_client_restrictions參數來判別此客戶端IP的訪問權限。相應地,smtpd_helo_restrictions則用於根據用戶的helo信息判別客戶端的訪問能力等等。
如果DATA命令之前的所有內容都被接受,客戶端接着就可以開始傳送郵件內容了。郵件內容通常由兩部分組成,前半部分是標題(header),其可以由header_check過濾,後半部分是郵件正文(body),其可以由check_body過濾。這兩項實現的是郵件“內容檢查”。
postfix的默認配置如下:
smtpd_client_restrictions =
smtpd_data_restrictions =
smtpd_end_of_data_restrictions =
smtpd_etrn_restrictions =
smtpd_helo_restrictions =
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
smtpd_sender_restrictions =
這限制了只有mynetworks參數中定義的本地網絡中的客戶端才能通過postfix轉發郵件,其它客戶端則不被允許,從而關閉了開放式中繼(open relay)的功能。
Postfix有多個內置的限制條件,如上面的permit_mynetworks和reject_unauth_destination,但管理員也可以使用訪問表(access map)來自定義限制條件。自定義訪問表的條件通常使用check_client_access, check_helo_access, check_sender_access, check_recipient_access進行,它們後面通常跟上type:mapname格式的訪問表類型和名稱。其中,check_sender_access和check_recipient_access用來檢查客戶端提供的郵件地址,因此,其訪問表中可以使用完整的郵件地址,如[email protected];也可以只使用域名,如neo.com;還可以只有用戶名的部分,如jun@。
實驗1
禁止192.168.100.3這臺主機通過工作在192.168.100.5上的postfix服務發送郵件爲例演示說明其實現過程。訪問表使用hash的格式。
(1)首先,編輯/etc/postfix/access文件,以之做爲客戶端檢查的控制文件,在裏面定義如下一行:
192.168.100.3 REJECT
(2)將此文件轉換爲hash格式
# postmap /etc/postfix/access
(3)配置postfix使用此文件對客戶端進行檢查
編輯/etc/postfix/main.cf文件,添加如下參數:
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
(4)讓postfix重新載入配置文件即可進行發信控制的效果測試了。
實驗2
禁止通過本服務器向baidu.com域發送郵件爲例演示其實現過程。訪問表使用hash的格式。
(1)首先,建立/etc/postfix/deny文件(文件名任取),在裏面定義如下一行:
baidu.com REJECT
(2)將此文件轉換爲hash格式
# postmap /etc/postfix/deny
(3)配置postfix使用此文件對客戶端進行檢查
編輯/etc/postfix/main.cf文件,添加如下參數:
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/deny, permit_mynetworks, reject_unauth_destination
(4)讓postfix重新載入配置文件即可進行發信控制的效果測試了。
爲postfix開啓基於cyrus-sasl的認證功能
查看postfix是否支持cyrus的sasl認證
#postconf -a
cyrus
dovecot
#vim /etc/postfix/main.cf
添加以下內容:
############################cyrus-SASL###################################################
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_path = smtpd
smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!
########################################################################################
# vim /usr/lib/sasl2/smtpd.conf
添加如下內容:
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
讓postfix重新加載配置文件
#/usr/sbin/postfix reload
[root@mail ~]# telnet mail.neo.com 25
Trying 192.168.100.5...
Connected to mail.neo.com (192.168.100.5).
Escape character is '^]'.
220 Welcome to our mail.neo.com ESMTP,Warning: Version not Available!
ehlo mail.neo.com
250-mail.neo.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN
250-AUTH=LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
確保與我們剛開始測試postfix是否能工作,多出了兩行,這樣證名己成功了
安裝Courier authentication library
1、courier簡介
courier-authlib是Courier組件中的認證庫,它是courier組件中一個獨立的子項目,用於爲Courier的其它組件提供認證服務。其認證功能通常包括驗正登錄時的帳號和密碼、獲取一個帳號相關的家目錄或郵件目錄等信息、改變帳號的密碼等。而其認證的實現方式也包括基於PAM通過/etc/passwd和/etc/shadow進行認證,基於GDBM或DB進行認證,基於LDAP/MySQL/PostgreSQL進行認證等。因此,courier-authlib也常用來與courier之外的其它郵件組件(如postfix)整合爲其提供認證服務。
# tar jxvf courier-authlib-0.64.0.tar.bz2
# cd courier-authlib-0.64.0
#./configure \
--prefix=/usr/local/courier-authlib \
--sysconfdir=/etc \
--without-authpam \
--without-authshadow \
--without-authvchkpw \
--without-authpgsql \
--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-mailuser=postfix \
--with-mailgroup=postfix \
--with-ltdl-lib=/usr/lib \
--with-ltdl-include=/usr/include
# make &&make install
# chmod 755 /usr/local/courier-authlib/var/spool/authdaemon/
# cp /etc/authmysqlrc.dist /etc/authmysqlrc
# cp /etc/authdaemonrc.dist /etc/authdaemonrc
修改/etc/authdaemonrc 文件
authmodulelist="authmysql"
authmodulelistorig="authmysql"
daemons=10
配置其通過mysql進行郵件帳號認證
編輯/etc/authmysqlrc 爲以下內容,其中2525,2525 爲postfix 用戶的UID和GID。
MYSQL_SERVER localhost
MYSQL_PORT 3306 (指定你的mysql監聽的端口,這裏使用默認的3306)
MYSQL_USERNAME extmail (這時爲後文要用的數據庫的所有者的用戶名)
MYSQL_PASSWORD extmail (密碼)
MYSQL_SOCKET /var/lib/mysql/mysql.sock
MYSQL_DATABASE extmail
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
MYSQL_UID_FIELD '2525'
MYSQL_GID_FIELD '2525'
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD concat('/var/mailbox/',homedir)
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD concat('/var/mailbox/',maildir)
提供SysV服務腳本
# cp courier-authlib.sysvinit /etc/rc.d/init.d/courier-authlib
# chmod 755 /etc/init.d/courier-authlib
# chkconfig --add courier-authlib
# chkconfig --level 2345 courier-authlib on
# echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf.d/courier-authlib.conf
# ldconfig -v
# service courier-authlib start (啓動服務)
配置postfix和courier-authlib
新建虛擬用戶郵箱所在的目錄,並將其權限賦予postfix用戶:
#mkdir –pv /var/mailbox
#chown –R postfix /var/mailbox
接下來重新配置SMTP 認證,
編輯 /usr/lib/sasl2/smtpd.conf ,確保其爲以下內容:
pwcheck_method: authdaemond
log_level: 3
mech_list:PLAIN LOGIN
authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket
讓postfix支持虛擬域和虛擬用戶
1、編輯/etc/postfix/main.cf,添加如下內容:
########################Virtual Mailbox Settings#####################################################
virtual_mailbox_base = /var/mailbox
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_alias_domains =
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_uid_maps = static:2525
virtual_gid_maps = static:2525
virtual_transport = virtual
maildrop_destination_recipient_limit = 1
maildrop_destination_concurrency_limit = 1
##########################QUOTA Settings##########################################################
message_size_limit = 14336000
virtual_mailbox_limit = 20971520
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please Tidy your mailbox and try again later.
virtual_overquota_bounce = yes
##############################################################################################
此處配置完後最好執行一次postconf -n檢查是否有選項無效,如果有,註釋或刪除都行
2、使用extman源碼目錄下docs目錄中的extmail.sql和init.sql建立數據庫:
# tar zxvf extman-1.1.tar.gz
# cd extman-1.1/docs
# mysql -u root -p < extmail.sql
# mysql -u root -p <init.sql
# cp mysql* /etc/postfix/
3、授予用戶extmail訪問extmail數據庫的權限
mysql> GRANT all privileges on extmail.* TO extmail@localhost IDENTIFIED BY 'extmail';
mysql> GRANT all privileges on extmail.* TO [email protected] IDENTIFIED BY 'extmail';
說明:
1、啓用虛擬域以後,需要取消中心域,即註釋掉myhostname, mydestination, mydomain, myorigin幾個指令;當然,你也可以把mydestionation的值改爲你自己需要的。
2、對於MySQL-5.1以後版本,其中的服務腳本extmail.sql執行會有語法錯誤;可先使用如下命令修改extmail.sql配置文件,而後再執行。修改方法如下:
# sed -i 's@TYPE=MyISAM@ENGINE=InnoDB@g' extmail.sql
1 配置dovecot
# vi /etc/dovecot.conf
##############################################################################################
mail_location = maildir:/var/mailbox/%d/%n/Maildir
……
auth default {
mechanisms = plain
passdb sql {
args = /etc/dovecot-mysql.conf
}
userdb sql {
args = /etc/dovecot-mysql.conf
}
……
############################################################################################
# vim /etc/dovecot-mysql.conf
############################################################################################
driver = mysql
connect = host=localhost dbname=extmail user=extmail password=extmail
default_pass_scheme = CRYPT
password_query = SELECT username AS user,password AS password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, uidnumber AS uid, gidnumber AS gid FROM mailbox WHERE username = '%u'
###########################################################################################
說明:如果mysql服務器是本地主機,即host=localhost時,如果mysql.sock文件不是默認的/var/lib/mysql/mysql.sock,可以使用host=“sock文件的路徑”來指定新位置;例如,使用通用二進制格式安裝的MySQL,其soc文件位置爲/tmp/mysql.sock,相應地,connect應按如下方式定義。
connect = host=/tmp/mysql.sock dbname=extmail user=extmail password=extmail
接下來啓動dovecot服務:
# service dovecot start
# chkconfig dovecot on
2 安裝Extmail-1.2
說明:如果extmail的放置路徑做了修改,那麼配置文件webmail.cf中的/var/www路徑必須修改爲你所需要的位置。本文使用了默認的/var/www,所以,以下示例中並沒有包含路徑修改的相關內容。
1、安裝
# tar zxvf extmail-1.2.tar.gz
# mkdir -pv /var/www/extsuite
# mv extmail-1.2 /var/www/extsuite/extmail
# cp /var/www/extsuite/extmail/webmail.cf.default /var/www/extsuite/extmail/webmail.cf
2、修改主配置文件
#vi /var/www/extsuite/extmail/webmail.cf
部分修改選項的說明:
############################################################################################
SYS_MESSAGE_SIZE_LIMIT = 5242880
用戶可以發送的最大郵件
SYS_USER_LANG = en_US
語言選項,可改作:
SYS_USER_LANG = zh_CN
SYS_MAILDIR_BASE = /home/domains
此處即爲您在前文所設置的用戶郵件的存放目錄,可改作:
SYS_MAILDIR_BASE = /var/mailbox
SYS_MYSQL_USER = db_user
SYS_MYSQL_PASS = db_pass
以上兩句句用來設置連接數據庫服務器所使用用戶名、密碼和郵件服務器用到的數據庫,這裏修改爲:
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_HOST = localhost
指明數據庫服務器主機名,這裏默認即可
SYS_MYSQL_TABLE = mailbox
SYS_MYSQL_ATTR_USERNAME = username
SYS_MYSQL_ATTR_DOMAIN = domain
SYS_MYSQL_ATTR_PASSWD = password
以上用來指定驗正用戶登錄裏所用到的表,以及用戶名、域名和用戶密碼分別對應的表中列的名稱;這裏默認即可
SYS_AUTHLIB_SOCKET = /var/spool/authdaemon/socket
此句用來指明authdaemo socket文件的位置,這裏修改爲:
SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket
########################################################################################
3 apache相關配置
由於extmail要進行本地郵件的投遞操作,故必須將運行apache服務器用戶的身份修改爲您的郵件投遞代理的用戶;本例中打開了apache服務器的suexec功能,故使用以下方法來實現虛擬主機運行身份的指定。此例中的MDA爲postfix自帶,因此將指定爲postfix用戶:
<VirtualHost *:80>
ServerName mail.neo.com
DocumentRoot /var/www/extsuite/extmail/html/
ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi
Alias /extmail /var/www/extsuite/extmail/html
SuexecUserGroup postfix postfix
</VirtualHost>
修改 cgi執行文件屬主爲apache運行身份用戶:
# chown -R postfix.postfix /var/www/extsuite/extmail/cgi/
如果您沒有打開apache服務器的suexec功能,也可以使用以下方法解決:
# vim /etc/httpd/httpd.conf
User postfix
Group postfix
<VirtualHost *:80>
ServerName mail.neo.com
DocumentRoot /var/www/extsuite/extmail/html/
ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi
Alias /extmail /var/www/extsuite/extmail/html
</VirtualHost>
4 依賴關係的解決
extmail將會用到perl的Unix::syslogd功能,您可以去http://search.cpan.org搜索下載原碼包進行安裝。
# tar zxvf Unix-Syslog-0.100.tar.gz
# cd Unix-Syslog-0.100
# perl Makefile.PL
# make && make install
5、啓動apache服務
# service httpd start
# chkconfig httpd on
5 安裝Extman-1.1
1、安裝及基本配置
# tar zxvf extman-1.1.tar.gz
# mv extman-1.1 /var/www/extsuite/extman
修改配置文件以符合本例的需要:
# cp /var/www/extsuite/extman/webman.cf.default /var/www/extsuite/extman/webman.cf
# vi /var/www/extsuite/extman/webman.cf
############################################################################################
SYS_MAILDIR_BASE = /home/domains
此處即爲您在前文所設置的用戶郵件的存放目錄,可改作:
SYS_MAILDIR_BASE = /var/mailbox
SYS_DEFAULT_UID = 1000
SYS_DEFAULT_GID = 1000
此兩處後面設定的ID號需更改爲前而創建的postfix用戶和postfix組的id號,本文使用的是2525,因此,上述兩項需要修改爲:
SYS_DEFAULT_UID = 2525
SYS_DEFAULT_GID = 2525
SYS_MYSQL_USER = webman
SYS_MYSQL_PASS = webman
修改爲:
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
##############################################################################################
而後修改cgi目錄的屬主:
# chown -R postfix.postfix /var/www/extsuite/extman/cgi/
在apache的主配置文件中Extmail的虛擬主機部分,添加如下兩行:
ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi
Alias /extman /var/www/extsuite/extman/html
創建其運行時所需的臨時目錄,並修改其相應的權限:
#mkdir -pv /tmp/extman
#chown postfix.postfix /tmp/extman
修改
SYS_CAPTCHA_ON = 1
爲
SYS_CAPTCHA_ON = 0
好了,到此爲止,重新啓動apache服務器後,您的Webmail和Extman已經可以使用了,可以在瀏覽器中輸入指定的虛擬主機的名稱進行訪問,如下:
http://mail.neo.com
選擇管理即可登入extman進行後臺管理了。默認管理帳號爲:[email protected] 密碼爲:extmail*123*
說明:
(1) 如果您安裝後無法正常顯示校驗碼,安裝perl-GD模塊會解決這個問題。如果想簡單,您可以到以下地址下載適合您的平臺的rpm包,安裝即可: http://dries.ulyssis.org/rpm/packages/perl-GD/info.html
(2) extman-1.1自帶了圖形化顯示日誌的功能;此功能需要rrdtool的支持,您需要安裝此些模塊纔可能正常顯示圖形日誌。
6 配置Mailgraph_ext,使用Extman的圖形日誌:(下面所需的軟件包面要自己下載)
接下來安裝圖形日誌的運行所需要的軟件包Time::HiRes、File::Tail和rrdtool,其中前兩個包您可以去http://search.cpan.org搜索並下載獲得,後一個包您可以到 http://oss.oetiker.ch/rrdtool/pub/?M=D下載獲得; 注意安裝順序不能改換。
安裝Time::HiRes
#tar zxvf Time-HiRes-1.9707.tar.gz
#cd Time-HiRes-1.9707
#perl Makefile.PL
#make
#make test &&make install
7 安裝File::Tail
#tar zxvf File-Tail-0.99.3.tar.gz
#cd File-Tail-0.99.3
#perl Makefile
#make &&make install
8 安裝rrdtool-1.2.23
#tar zxvf rrdtool-1.2.23.tar.gz
#cd rrdtool-1.2.23
#./configure --prefix=/usr/local/rrdtool
#make &&make install
創建必要的符號鏈接(Extman會到這些路徑下找相關的庫文件)
#ln -sv /usr/local/rrdtool/lib/perl/5.8.5/i386-linux-thread-multi/auto/RRDs/RRDs.so /usr/lib/perl5/5.8.5/i386-linux-thread-multi/
#ln -sv /usr/local/rrdtool/lib/perl/5.8.5/RRDp.pm /usr/lib/perl5/5.8.5
#ln -sv /usr/local/rrdtool/lib/perl/5.8.5/i386-linux-thread-multi/RRDs.pm /usr/lib/perl5/5.8.5
複製mailgraph_ext到/usr/local,並啓動之
# cp -r /var/www/extsuite/extman/addon/mailgraph_ext /usr/local
# /usr/local/mailgraph_ext/mailgraph-init start
啓動cmdserver(在後臺顯示系統信息)
# /var/www/extsuite/extman/daemon/cmdserver --daemon
添加到自動啓動隊列
# echo “/usr/local/mailgraph_ext/mailgraph-init start” >> /etc/rc.d/rc.local
# echo “/var/www/extsuite/extman/daemon/cmdserver -v -d” >> /etc/rc.d/rc.local
-------------------------------本文爲學習筆記,經本人親試,完美成功-------------------------------------------