在Internet世界中,大部分的電子郵件都是經過sendmail來投遞的,大約有100萬用戶使用sendmail,天天投遞上億封郵件。這真實一個讓人吃驚的數字。Postfix試圖更快、更容易管理、更安全,同時還與sendmail保持足夠的兼容性。
1、安裝前的準備工做:
一、安裝所需的rpm包:
- yum install -y httpd php php-mysql mysql mysql-server mysql-devel openssl-devel
- dovecot perl-DBD-MySQL tcl tcl-devel libart_lgpl libart_lgpl-devel
//它們處於不一樣的做用,在出現問題時應分開判斷是那個文件的影響!
二、關閉sendmail,並將它的隨系統自動啓動功能關閉:
# service sendmail stop
# chkconfig sendmail off
//由於系統運行須要郵件服務的提供,因此最後在沒有安裝postfix以前,請不要#rpm -e sendmail;
三、安裝如下開發所用到的rpm包組:
- #yum groupinstall -y "Development Libraries"
- "Development Tools"
- "Legacy Software Development"
- "X Software Development"
四、啓動mysql數據庫,並給mysql的root用戶設置密碼:
- #service mysqld start
- #chkconfig mysqld on
- #mysqladmin -uroot password '123456'
- #mysql -uroot -p
- enter--> 123456 //簡單測試
五、啓動saslauthd服務,並將其加入到自動啓動隊列:
# service saslauthd start
//啓用smtp認證
# chkconfig saslauthd on
2、安裝配置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 /bin/false -M postdrop
- # tar zxvf postfix-2.6.5.tar.gz
- # cd postfix-2.6.5
- # 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'
- //編譯時修改的一些參數 // 若是沒有特殊須要,只做爲郵件傳輸MTA應用,沒必要要添加此類參數;
- # make
- # make install
- //若是編譯出錯,檢查出錯狀況,通常是有包忘了裝,要不是參數路徑錯誤;
【註釋】:
xsasl_cyrus_server.c:598: error: 'SASL_OK' undeclared (first use in this function)
xsasl_cyrus_server.c:600: warning: format '%s' expects type 'char *', but argument 3 has type 'int'
xsasl_cyrus_server.c:603: error: 'XSASL_CYRUS_SERVER' has no member named 'username'
xsasl_cyrus_server.c:604: error: 'XSASL_CYRUS_SERVER' has no member named 'username'
xsasl_cyrus_server.c:605: error: 'XSASL_CYRUS_SERVER' has no member named 'username'
xsasl_cyrus_server.c:606: error: 'XSASL_CYRUS_SERVER' has no member named 'username'
xsasl_cyrus_server.c:607: error: 'XSASL_CYRUS_SERVER' has no member named 'username'
make: *** [xsasl_cyrus_server.o] Error 1
make: *** [update] Error 1
#
缺乏cyrus認證包:有cyrus-sasl-md5 cyrus-sasl-lib cyrus-sasl-plain cyrus-sasl cyrus-sasl-devel //2010年12月01日更新
按照如下的提示輸入相關的路徑([]號中的是缺省值,」]」後的是輸入值,省略的表示採用默認值)(可所有采用默認值)
- install_root: [/] /
- tempdir: [/root/postfix-2.6.5]
- config_directory: [/etc/postfix]
- command_directory: [/usr/sbin]
- daemon_directory: [/usr/libexec/postfix]
- data_directory: [/var/lib/postfix]
- html_directory: [no] /
- mail_owner: [postfix]
- mailq_path: [/usr/bin/mailq]
- manpage_directory: [/usr/local/man]
- newaliases_path: [/usr/bin/newaliases]
- queue_directory: [/var/spool/postfix]
- readme_directory: [no]
- sendmail_path: [/usr/sbin/sendmail]
- setgid_group: [postdrop]
(注意)生成別名二進制文件,這個步驟若是忽略,會形成postfix效率極低:
# newaliases
2.進行一些基本配置,測試啓動postfix並進行發信
- #vim /etc/postfix/main.cf
- 修改如下幾項爲您須要的配置
- myhostname = mail.test.com
- myorigin = test.com
- mydomain = test.com
- mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
- mynetworks = 192.168.1.0/24, 127.0.0.0/8
說明:
myorigin參數用來指明發件人所在的域名;
mydestination參數指定postfix接收郵件時收件人的域名,即您的postfix系統要接收到哪一個域名的郵件;
myhostname 參數指定運行postfix郵件系統的主機的主機名,默認狀況下,其值被設定爲本地機器名;
mydomain參數指定您的域名,默認狀況下,postfix將myhostname的第一部分刪除而做爲mydomain的值;
mynetworks 參數指定你所在的網絡的網絡地址,postfix系統根據其值來區別用戶是遠程的仍是本地的,若是是本地網絡用戶則容許其訪問;
inet_interfaces 參數指定postfix系統監聽的網絡接口;
啓動postfix
#/usr/sbin/postfix start
postfix/postfix-script: starting the Postfix mail system
鏈接postfix,驗正服務啓動情況:
- #netstat -tnlp | grep :25
- tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 15497/master
- # telnet localhost 25
- Trying 127.0.0.1...
- Connected to localhost.localdomain (127.0.0.1).
- Escape character is '^]'.
- 220 mail.test.com ESMTP Postfix
- ehlo mail.test.com //本postfix的hostname字段;
- 250-mail.test.com
- 250-PIPELINING
- 250-SIZE 10240000
- 250-VRFY
- 250-ETRN
- 250-ENHANCEDSTATUSCODES
- 250-8BITMIME
- 250 DSN
- mail from:root@test.com //輸入發信人郵箱
- 250 2.1.0 Ok
- rcpt to:hanfeng@test.com //輸入收信人郵箱
- 250 2.1.5 Ok
- data //輸入郵件數據信息
- subject:Mail test! //輸入郵件主題
- hello hanfeng!!! //輸入郵件內容
- . //輸入結束符.
- 250 2.0.0 Ok: queued as C55863E016D
- quit //輸入quit退出郵件系統
- 221 2.0.0 Bye
- Connection closed by foreign host.
- [root@station123 ~]#grep C55863E016D /var/log/maillog //查找發信狀態
-
切換到hanfeng用戶進行收信
- #su - hanfeng
- $mail
- Mail version 8.1 6/6/93. Type ? for help.
- "/var/spool/mail/hanfeng": 1 message 1 new
- >N 1 root@test.com Tue Sep 7 15:59 15/505 "Mail test!"
- & 1
- Message 1:
- From root@test.com Tue Sep 7 15:59:09 2010
- X-Original-To: hanfeng@test.com
- Delivered-To: hanfeng@test.com
- subject:Mail test!
- Date: Tue, 7 Sep 2010 15:57:02 +0800 (CST)
- From: root@test.com
- To: undisclosed-recipients:;
-
- hello hanfeng!!!
-
- & q
- Saved 1 message in mbox
- [hanfeng@station123 ~]$
- 測試成功
3、爲postfix開啓基於cyrus-sasl的認證功能
使用如下命令驗正postfix是否支持cyrus風格的sasl認證,若是您的輸出爲如下結果,則是支持的:
# /usr/local/postfix/sbin/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_application_name = smtpd
- smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!
2011年4月12日
更正:
smtpdsmtpd_sasl_application_name = smtpd
正確:
smtpd_sasl_application_name = smtpd
#vim /usr/lib/sasl2/smtpd.conf
添加以下內容:
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
讓postfix從新加載配置文件
#/usr/sbin/postfix reload
postfix/postfix-script: refreshing the Postfix mail system
- # telnet localhost 25
- Trying 127.0.0.1...
- Connected to localhost.localdomain (127.0.0.1).
- Escape character is '^]'.
- 220 Welcome to our mail.test.com ESMTP,Warning: Version not Available!
- ehlo mail.test.com
- 250-mail.test.com
- 250-PIPELINING
- 250-SIZE 10240000
- 250-VRFY
- 250-ETRN
- 250-AUTH LOGIN PLAIN
- 250-AUTH=LOGIN PLAIN //(請確保您的輸出以相似兩行)
- 250-ENHANCEDSTATUSCODES
- 250-8BITMIME
- 250 DSN
- quit //quit退出便可
4、安裝Courier authentication library
- # tar jxvf courier-authlib-0.62.4.tar.bz2
- # cd courier-authlib-0.62.4
- #./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
- CFLAGS="-march=i686 -O2 -fexpensive-optimizations"
- CXXFLAGS="-march=i686 -O2 -fexpensive-optimizations"
- # make
- # make install
# chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
# cp /etc/authdaemonrc.dist /etc/authdaemonrc
# cp /etc/authmysqlrc.dist /etc/authmysqlrc
修改#vim /etc/authdaemonrc 文件
- authmodulelist="authmysql"
- authmodulelistorig="authmysql"
- daemons=10
編輯#vim /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)
-
- !!!保證此文件的內容不能有錯,不然不能啓用postfix與mysql的鏈接;
# cp courier-authlib.sysvinit /etc/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
# ldconfig -v
# service courier-authlib start (啓動服務)
Starting Courier authentication services: authdaemond (可信的, 可靠的)
新建虛擬用戶郵箱所在的目錄,並將其權限賦予postfix用戶:
#mkdir –pv /var/mailbox
#chown –R postfix /var/mailbox
接下來從新配置SMTP 認證,編輯 /usr/local/lib/sasl2/smtpd.conf ,確保其爲如下內容:
pwcheck_method: authdaemond
log_level: 3
mech_list:PLAIN LOGIN
authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket
5、讓postfix支持虛擬域和虛擬用戶
一、編輯 #vim/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, try again later.
- virtual_overquota_bounce = yes
-
2011年4月12日
更正:
virtual
virtual_transport
= virtual
正確:
virtual_transport
= virtual
二、使用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/
三、授予用戶extmail訪問extmail數據庫的權限
- mysql> GRANT all privileges on extmail.* TO extmail@localhost IDENTIFIED BY 'extmail';
- mysql> GRANT all privileges on extmail.* TO extmail@127.0.0.1 IDENTIFIED BY 'extmail'; 密碼
說明:啓用虛擬域之後,須要取消中心域,即註釋掉myhostname, mydestination, mydomain, myorigin幾個指令;
固然,你也能夠把mydestionation的值改成你本身須要的。
#vim /etc/postfix/main.cf
註釋掉myhostname, mydestination, mydomain, myorigin
6、配置dovecot
# vim /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]
說明:"[]"內爲同一行使用時去掉"[]",下同 2010年11月29日更新
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']
接下來啓動dovecot服務:
# service dovecot start
#netstat -tnlp | grep :110
tcp 0 0 :::110 :::* LISTEN 21456/dovecot
# chkconfig dovecot on
7、安裝Extmail-1.2
一、安裝
- # 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
二、修改主配置文件
#vim /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
三、apache相關配置
因爲extmail要進行本地郵件的投遞操做,故必須將運行apache服務器用戶的身份修改成您的郵件投遞代理的用戶;
本例中打開了apache服務器的suexec功能,故使用如下方法來實現虛擬主機運行身份的指定。
此例中的MDA爲postfix自帶,所以將指定爲postfix用戶:
- #vim /etc/httpd/conf/httpd.conf
- <VirtualHost *:80>
- ServerName mail.test.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功能,也可使用如下方法解決:
- # vi /etc/httpd/httpd.conf
- User postfix
- Group postfix
- <VirtualHost *:80>
- ServerName mail.test.com
- DocumentRoot /var/www/extsuite/extmail/html/
- ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi
- Alias /extmail /var/www/extsuite/extmail/html
- </VirtualHost>
- # tar zxvf Unix-Syslog-0.100.tar.gz
- # cd Unix-Syslog-0.100
- # perl Makefile.PL
- # make
- # make install
五、啓動apache服務
# service httpd start
# chkconfig httpd on
8、安裝Extman-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
修改cgi目錄的屬主:
# chown -R postfix.postfix /var/www/extsuite/extman/cgi/
在apache的主配置文件中Extmail的虛擬主機部分,添加以下兩行:
#vim /etc/httpd/conf/httpd.conf
ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi
Alias /extman /var/www/extsuite/extman/html
建立其運行時所需的臨時目錄,並修改其相應的權限:
#mkdir -pv /tmp/extman
#chown postfix.postfix /tmp/extman
修改 vim /var/www/extsuite/extman/webman.cf
SYS_CAPTCHA_ON = 1
爲
SYS_CAPTCHA_ON = 0
好了,到此爲止,從新啓動apache服務器後,您的Webmail和Extman已經可使用了,能夠在瀏覽器中輸入指定的虛擬主機的名稱進行訪問,以下:
2011-09-12 新增 postfix的 sys v 風格啓動腳本
vim /etc/init.d/postfix
#!/bin/bash
#
# version 0.2
#name postfix script
#author hanfeng
# chkconfig: 2345
#
# processname: mailsys
# pidfile: /var/run/postfix.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -f /usr/sbin/postfix ] || exit 0
RETVAL=0
prog="Postfix"
start() {
# Start daemons.
echo -n $"Starting $prog: "
/usr/sbin/postfix start > /dev/null 2>&1 &
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
touch /var/lock/subsys/postfix
success $"$prog start"
else
failure $"$prog start failure"
fi
echo
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down $prog: "
/usr/sbin/postfix stop > /dev/null 2>&1 &
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
rm -f /var/lock/subsys/postfix
success $"$prog stop"
else
failure $"$prog stop failure"
fi
echo
return $RETVAL
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit $RETVA
--------------------------------------------
添加服務到系統
# chmod 755 /etc/init.d/postfix
#chkconfig --add postfix
# chkconfig --level 2345 postfix on
#service postfix restart
--------------------------------------------
新增說明:2011-11-24
優化郵件服務器內核
將一下內容追加到 /etc/sysctl.conf 中
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000
kernel.shmmax = 134217728
執行如下命令使本次修改生效
#sysctl -p
----------------------------------------------
總結:因爲筆者今天事太多了,又是第一次採用代碼方式書寫的blog,其中可能有疏忽錯誤之處,敬請指教;
在之後可能還會續寫用圖型化來監控extmail的使用流量;所用包均在官方網站可以downloads;
提供技術支持;
如下爲extmail使用的附加圖片僅供參考: