在剛開(kāi)始搭建時(shí),遇到了很多的困難,這遠比我想象的要難,尤其還要滿(mǎn)足公司的需要,我看了一些資料,包括Postfix權威指南,看了sery的博文,看了些官方的文檔,只不過(guò)是在centos上搭建的,和debian的環(huán)境有很多不同之處,這在開(kāi)始給我帶來(lái)了很多的麻煩,望以后想搭建的朋友,應該選擇一個(gè)自己較熟悉的系統平臺進(jìn)行測試,我是沒(méi)法子,還有在這里還有提醒一下朋友,在上手之前一定要把郵件系統的知識掌握到一定的程度。
以下是用到的一些軟件:
|
名稱(chēng)
|
用途
|
下載地址
|
|
Apache (httpd-2.2.0)
|
Web方式管理郵件
|
|
|
Php (php-5.2.3)
|
Php 解釋器,與apache一起使用
|
|
|
Mysql (mysql-5.0.41)
|
用數據庫存儲用戶(hù)信息
|
|
|
extman(postfix-2.1.0)
|
郵件賬號后臺web管理工具
|
|
|
SASL(cyrus-sasl-2.1.21.tar.gz)
|
驗證方法
|
|
|
Authlib(courier-authlib-0.59.3.tar.bz2)
|
與SASL一起做驗證
|
|
|
Postfix
|
郵件系統主程序
|
|
|
Courier-imap (courier-imap-4.1.3.tar.bz2)
|
Pop3及IMAP服務(wù)
|
|
|
Perl (perl-5.8.8)
|
解釋器
|
|
|
Maildrop (maildrop-2.0.4.tar.bz2)
|
郵件投遞代理,直觀(guān)的講就是把收到的郵件轉發(fā)到用戶(hù)的郵箱目錄
|
|
|
Pcre (pcre-7.2.tar.bz2)
|
安裝Imap需要-- Perl兼容正則表達式
|
|
|
Extmail (extmail-1.0.1.tar.gz)
|
webmail
|
|
下面我用表格的方式列出postfix系統所需要創(chuàng )建的用戶(hù)及組的情況:
|
用戶(hù)名
|
組名
|
作用
|
備注
|
|
mysql
|
Mysql,extmail,extman
|
數據庫mysql運行用戶(hù),界面與后臺默認用戶(hù)
|
|
|
vmail
|
Vmail
|
Postfix虛擬郵件賬號所使用的用戶(hù)及組
|
uid,gid:2000,2000
|
|
postfix
|
Postfix
|
Postfix主程序使用的賬號和組
|
|
|
|
Postdrop
|
Postfix setgid_group
|
setgid_group=postdrop
|
上面用到的用戶(hù)必須要有
在這里用到的一些基本包就不羅列了,像postfix ,apache,等,就用apt-get 進(jìn)行安裝,途中報錯,注意提示信息,細心就可以了,這里再次強調版本的一致性。下面就直接進(jìn)入正題了,注:有些地方我摘要的是官方文檔的內容,如有筆誤敬請諒解
#####################################################################################
一。在/etc/postfix/main.cf中增加的內容
下面是SSL認證的部分
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients= yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_client_restrictions = permit_sasl_authenticated
#smtpd_sasl_local_domain = $mydomain
下面是結合mysql,extmail,extman 的要求進(jìn)行配置,細節后面會(huì )說(shuō)
# banner
mail_name = Postfix - by XXXX.com
smtpd_banner = $myhostname ESMTP $mail_name
# response immediately
smtpd_error_sleep_time = 0s
unknown_local_recipient_reject_code = 450
# extmail config here
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_transport = maildrop //這里沒(méi)有冒號,指定郵件的relay方式
virtual_mailbox_base = /home/domains/
virtual_gid_maps=static:2000 //注意對應
virtual_uid_maps=static:2000
readme_directory = /usr/share/doc/postfix
html_directory = /usr/share/doc/postfix/html
#====================QUOTA======================== //磁盤(pán)配額的設置
message_size_limit = 14336000
virtual_mailbox_limit = 1000000000 //默認的大小
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 try again later.
virtual_overquota_bounce = yes
##########################################################################################
下面是手動(dòng)加的,和上面的對應
編輯mysql_virtual_alias_maps.cf
vi /etc/postfix/mysql_virtual_alias_maps.cf
內容如下:
user = extmail
password = extmail
hosts = mail.xxxx.com
dbname = extmail
table = alias
select_field = goto
where_field = address
編輯mysql_virtual_domains_maps.cf
vi /etc/postfix/mysql_virtual_domains_maps.cf
內容如下:
user = extmail
password = extmail
hosts = mail.xxxx.com
dbname = extmail
table = domain
select_field = de.ion
where_field = domain
#additional_conditions = and backupmx ='0' and active ='1'
編輯mysql_virtual_mailbox_maps.cf
vi /etc/postfix/mysql_virtual_mailbox_maps.cf
內容如下:
user = extmail
password = extmail
hosts = mail.xxxx.com
dbname = extmail
table = mailbox
select_field = maildir
where_field = username
#additional_conditions = and active = '1'
編輯/etc/postfix/mysql_virtual_limit_maps.cf
user = extmail
password = extmail
|
hosts = 127.0.0.1
|
//這里最好指ip
|
dbname = extmail
table = mailbox
select_field = quota
where_field = username
additional_conditions = AND active = '1'
################################################################################################3
二。安裝cyrus-sasl2
apt-get install libsasl2 libsasl2-modules libsasl2-modules-sql
>創(chuàng )建/etc/postfix/sasl/smtpd.conf 加入下面的內容
pwcheck_method: authdaemond //認證的方式
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/run/courier/authdaemon/socket //注意路徑
#####################################################################################################################
三。安裝Courier-Authlib
運行如下命令安裝相關(guān)軟件包
apt-get install libtool
apt-get install courier-authlib
apt-get install courier-authlib-dev
apt-get install courier-authlib-mysql
mail:/etc/courier# pwd
/etc/courier
mail:/etc/courier# less authdaemonrc
DEBUG_LOGIN=2 //會(huì )生成詳細的錯誤報告,之后置零
修改etc/courier/authdaemon //里面進(jìn)行指定mysql的指定 主要關(guān)系到認證
authmodulelist="authmysql"
authmodulelistorig="authmysql"
編輯/etc/courier/authmysqlrc文件,并將其內容清空,然后增加如下內容:
MYSQL_SERVER mail.xxxx.com
MYSQL_USERNAME extmail
MYSQL_PASSWORD extmail
|
MYSQL_SOCKET /var/run/mysql/mysql.sock
|
//注意這里和centos不一樣
|
MYSQL_PORT 3306
MYSQL_OPT 0
MYSQL_DATABASE extmail
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
MYSQL_UID_FIELD uidnumber
MYSQL_GID_FIELD gidnumber
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD homedir
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD quota
MYSQL_SELECT_CLAUSE SELECT username,password,"",uidnumber,gidnumber,\
CONCAT('/home/domains/',homedir), \//查詢(xún)的內容
CONCAT('/home/domains/',maildir), \
quota, \
name \
FROM mailbox \
WHERE username = '$(local_part)@$(domain)'
存盤(pán)退出后啟動(dòng)courier-authlib:
/etc/init.d/courier-authlib start
如一切正常,命令行將返回如下信息:
Starting Courier authentication services: authdaemond
修改authdaemon socket目錄權限
如果該目錄權限不正確修改,maildrop及postfix等將無(wú)法正確獲取用戶(hù)的信息及密碼認證:
chmod 755 /var/spool/authdaemon
##############################################################################
四。安裝maildrop
apt-get install maildrop
apt-get install mailman
配置master.cf
為了使Postfix支持Maildrop,必須修改/etc/postfix/master.cf文件,注釋掉原來(lái)的maildrop的配置內容,并改為:
maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/bin/maildrop -V3 -w 90 -d ${recipient} //V3為生成詳細的日志,之后記得關(guān)掉
配置main.cf
由于maildrop不支持一次接收多個(gè)收件人,因此必須在main.cf里增加如下參數:
#mailbox_command = procmail -a "$EXTENSION" //這里必須注釋掉
maildrop_destination_recipient_limit = 1 //在里面新加的內容
最后重新啟動(dòng)postfix即可
注意事項:
1.如需重新編譯Maildrop軟件包,必須先獲得其源碼rpm包,并且必須先行安裝courier-authlib及其devel軟件包,否則編譯后的maildrop將無(wú)法打開(kāi)authlib支持。
2.maildrop RPM包安裝時(shí),會(huì )自動(dòng)創(chuàng )建vuser用戶(hù)及vgroup用戶(hù)組,專(zhuān)門(mén)用于郵件的存儲,vuser:vgroup的uid/gid都是1000,這與一般的郵件文檔中提及用postfix用戶(hù)存郵件不一樣。因為postfix用戶(hù)的uid一般都低于500,而Suexec模塊編譯時(shí)對UID/GID的要求是要大于500,因此使用postfix用戶(hù)不能滿(mǎn)足要求。其次,如果用Maildrop作為投遞代理(MDA),以postfix身份投遞的話(huà),會(huì )導致postfix MTA錯誤
######################################################################################################################################
五。配置appache
編輯/etc/httpd/conf/vhost_extmail.conf,里面定義虛擬主機的相關(guān)內容,包括主目錄,以及ExtMail和ExtMan的相關(guān)配置,Suexec的設置等。
# VirtualHost for ExtMail Solution
<VirtualHost *:80>
ServerName mail.xxxx.com
DocumentRoot /var/www/extsuite/extmail/html/
.Alias /extmail/cgi/ /var/www/extsuite/extmail/cgi/
Alias /extmail/ /var/www/extsuite/extmail/html/
.Alias /extman/cgi/ /var/www/extsuite/extman/cgi/
Alias /extman/ /var/www/extsuite/extman/html/
# Suexec config
#SuexecUserGroup vmail vmail
</VirtualHost>
重新啟動(dòng)apache:
/etc/init.d/apache2 restart
##################################################################################################################
六。安裝ExtMail
建立/var/www/extsuite并復制源碼到該目錄,相關(guān)命令:
mkdir /var/www/extsuite
tar -zxvf src/extmail-1[1][1].0.4.tar.gz -C src
cp -r src/extmail-1.0.4 /var/www/extsuite/extmail
cd /var/www/extsuite/extmail
cp webmail.cf.default webmail.cf
cd $OLDPWD
注意:上面命令行中最后一個(gè)cd $OLDPWD是返回原始路徑(即ExtMail Solution軟件包根目錄)
安裝perl-Unix-Syslog包
apt-get install Unix-Syslog-perl
編輯webmail.cf
修改/var/www/extsuite/extmail/webmail.cf里的其他參數,主要變動(dòng)的內容見(jiàn)下:
SYS_USER_LANG = zh_CN
SYS_USER_CHARSET = gb2312
SYS_MFILTER_ON = 1
SYS_NETDISK_ON = 1
SYS_SHOW_SIGNUP = 0
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_DB = extmail
SYS_MYSQL_HOST = mail.XXXX.com
SYS_MYSQL_SOCKET = /var/run/mysql/mysql.sock //注意路徑
SYS_G_ABOOK_TYPE = file
SYS_G_ABOOK_FILE_CHARSET = gb2312
其中SYS_MFILTER_ON及SYS_NETDISK_ON 設置為1是為了打開(kāi)網(wǎng)絡(luò )磁盤(pán)和過(guò)濾器;SYS_SHOW_SIGNUP控制首頁(yè)是否顯示免費注冊郵箱按鈕;全局地址本默認為ldap格式,現在也改為文本格式,并將地址本的轉換編碼改為GB2312
更新cgi目錄權限
由于SuEXEC的需要,必須將extmail的cgi目錄修改成vuser:vgroup權限://前面建立了需帳戶(hù)和組為:vmail fid=uid=2000
chown -R vmail:vmail /var/www/extsuite/extmail/cgi/
############################################################################################################################33
七。安裝ExtMan - web后臺
在ExtMail-Solution軟件包根目錄下執行: //注意man管理界面登陸后要正規退出
tar -zxvf src/extman-0[1][1].2.4.tar.gz -C src
cp -r src/extman-0.2.4 /var/www/extsuite/extman/
配置webman.cf
修改/var/www/extsuite/extman/webman.cf內SYS_CHARSET及SYS_LANG參數為:
SYS_CAPTCHA_ON = 1
# SYS_CAPTCHA_ON參數控制首頁(yè)是否采用校驗碼登陸
SYS_LANG = zh_CN
SYS_MYSQL_USER = webman
SYS_MYSQL_PASS = webman
#SYS_MYSQL_USER = extmail
#SYS_MYSQL_PASS = extmail
SYS_MYSQL_DB = extmail
SYS_MYSQL_HOST = mail.XXXX.com
SYS_MYSQL_SOCKET = /var/run/mysql/mysql.sock //注意要在mysql中建立webman這個(gè)用戶(hù),否則會(huì )不讓登陸后臺
其他參數基本上可以使用默認值。
安裝perl-GD包
apt-get install perl-GD
更新cgi目錄權限
由于SuEXEC的需要,必須將extman的cgi目錄修改成vmail:vmail權限:
###################################################################################################################333
八。確認MySQL狀態(tài)
在執行mysql操作前,必須確認它已被正確安裝并啟動(dòng),可以用rpm命令查詢(xún)mysql server的安裝情況,用ps ax的辦法查看進(jìn)程列表是否有mysqld進(jìn)程:
rpm -aq|grep -i mysql-server
正常情況下應該可以看到mysql-server被安裝:
mysql-server-4.1.20-2.RHEL4.1.0.1
如果沒(méi)有,則表示沒(méi)有安裝好mysql-server,可以從本軟件包RPMS目錄里安裝,也可以找安裝光盤(pán)安裝:
rpm -ivh RPMS/mysql-server-4.1.20-2.RHEL4.1.0.1.i386.rpm
安裝完畢后必須初始化mysql,然后重新啟動(dòng)
/usr/bin/mysql_install_db
service mysqld start
正常情況下將啟動(dòng)成功:
Starting MySQL: [ OK ]
然后用ps命令來(lái)檢查mysqld是否正確運行:
ps ax|grep mysqld
正常情況下應出現如下的結果:
433 pts/0 S 0:00 /bin/sh /usr/bin/mysqld_safe --defaults-file=/etc/my.cnf --pid-file=/var/run/mysqld/mysqld.pid
466 pts/0 Sl 0:00 /usr/libexec/mysqld --defaults-file=/etc/my.cnf --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-locking --socket=/var/lib/mysql/mysql.sock
如果mysql沒(méi)正確啟動(dòng),請檢查/var/log/mysqld.log里面的出錯提示,進(jìn)行處理:
tail /var/log/mysqld.log
數據庫初始化
執行以下命令導入mysql數據庫結構及初始化數據,注意必須逐行輸入以下命令,root密碼默認為空,不可直接用鼠標復制兩行命令直接輸入,否則會(huì )報錯!
mysql -u root -p < /var/www/extsuite/extman/docs/extmail.sql //這里是要導入的數據
mysql -u root -p < /var/www/extsuite/extman/docs/init.sql //注意更改里面的用戶(hù),主機域名,地址,默認的uid與gid改為2000
鏈接基本庫到Extmail
建立臨時(shí)文件夾:
mkdir /tmp/extman
chown -R vmail:vmail /tmp/extman //注意他的存在問(wèn)題
建立剛才導入mysql的postmaster@XXXX.com帳戶(hù)的Maildir,請輸入如下命令:
cd /var/www/extsuite/extman/tools
./maildirmake.pl /home/domains/XXXX.com/postmaster/Maildir //手動(dòng)建立用戶(hù)
chown -R vuser:vgroup /home/domains/XXXX.com
cd $OLDPWD
注意事項:
上面命令行中最后一個(gè)cd $OLDPWD是返回原始路徑(即ExtMail Solution軟件包根目錄)
由于RedHat發(fā)行版中包含了一個(gè)叫tmpwatch的工具,該工具會(huì )定期掃描/tmp/下的文件,如果這些文件很久都沒(méi)被使用,將被刪除,因此如果后臺長(cháng)期不使用,/tmp/extman目錄有可能被tmpwatch刪除,所以要么定期登陸后臺,要么修改 webman.cf將臨時(shí)目錄修改到另一個(gè)地方。此處暫以/tmp/extman默認值為例。
上述導入初始化SQL時(shí),默認的uidnumber/gidnumber都是2000,這和vuser:vgroup 的uid/gid一致,是因為maildrop投遞時(shí)會(huì )從數據庫里取uidnumber/gidnumber,而在master.cf里已經(jīng)定義好了投遞時(shí)的運行身份(vmail:vmail),所以這兩個(gè)字段的內容必須為2000,否則將出現投遞錯誤,例如報0x06等錯誤
chown -R vmail:vmail /var/www/extsuite/extman/cgi
##############################################################
測試authlib
在命令行下執行:
/usr/sbin/authtest -s login postmaster@XXXX.com extmail //注意@后面的域名是否重復了,看一下mysql的日志
結果如下:
Authentication succeeded.
Home Directory: /home/domains/XXXX.com/postmaster
Maildir: /home/domains/XXXX.com/postmaster/Maildir/
Quota: 104857600S
Encrypted Password: $1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0
Cleartext Password: extmail
Options: (none)
這樣表明ExtMan的正確安裝,數據庫也正確導入,courier-authlib能正確連接到mysql數據庫
最后訪(fǎng)問(wèn)[url]http://mail.[/url]xxxx.com/extmail/,如無(wú)意外,將看到webmail的登陸頁(yè),不過(guò)此時(shí)還沒(méi)有加正式的用戶(hù),所以不能登陸,包括postmaster@XXXX.com也不行。必須要登陸到[url]http://mail.[/url]XXXX.com/extman/ 里增加一個(gè)新帳戶(hù)才能登陸。
ExtMan的默認超級管理員帳戶(hù):root@XXXX.com,初始密碼:extmail*123*,登陸成功后,建議將密碼修改,以確保安全。
############################################################################################################################
九。安裝courier-imap
debian @ mail/tmp# apt-get install courier-authdaemon courier-authmysql courier-base courier-imap courier-pop courier-pop-ssl courier-imap-ssl
啟動(dòng):
/etc/init.d/courier-authdaemon start
/etc/init.d/courier-pop3 start
########################################################################################################################
下面是一些測試的方法,我總結如下:
debian @ mail/tmp# perl -MMIME::Base64 -e 'print encode_base64("test\@xxxx.com");' //測試的用戶(hù)和域名
dGVzdEBleHRtYWlsLm9yZw== //生成的編碼
debian @ mail/tmp# perl -MMIME::Base64 -e 'print encode_base64("test");'
dGVzdA== //生成的編碼
debian @ mail/tmp#telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 wader.com ESMTP Mail System
ehlo test
250-mai.wader.com
250-PIPELINING
250-SIZE 14680064
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login
334 VXNlcm5hbWU6
dGVzdEBleHRtYWlsLm9yZw== //生成的編碼進(jìn)行校驗
334 UGFzc3dvcmQ6
dGVzdA== //是否匹配
235 2.0.0 Authentication successful
250 2.1.0 Ok
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Test //信的格式
.
250 2.0.0 Ok: queued as 7185892C
quit
221 2.0.0 Bye
Connection closed by foreign host.
debian @mail/tmp#telnet mail.xxx.com 110 //測試pop3是否正常
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Hello there.
+OK Password required.
pass test //密碼
+OK logged in.
我的備份腳本:
mail:~# less maildb_back.sh
#!/bin/bash
BackupPath=/data/maildata_bk
Mysql_bk_dir=$BackupPath/mysqlbk
Mail_bk_dir=$BackupPath/mailbk
LogFile=$BackupPath/backuplog
#MailBoxDir=/var/mailbox
####################################################################
# define mysql variables #
####################################################################
NewFile="$Mysql_bk_dir"/extmail$(date +%Y%m%d).tgz
DumpFile="$Mysql_bk_dir"/extmail$(date +%Y%m%d).sql
OldFile="$Mysql_bk_dir"/extmail$(date +%Y%m%d --date='5 days ago').tgz
DbUser=extmail
DbPasswd=xxxx
DbName=extmail
##################################################################
# mysql backup proccess #
####################################################################
echo "-------------------------------------------" >> $LogFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile
echo "--------------------------" >> $LogFile
#Delete Old File
if [ -f $OldFile ]
then
rm -f $OldFile >> $LogFile 2>&1
echo "[$OldFile]Delete Old File Success!" >> $LogFile
else
echo "[$OldFile]No Old Backup File!" >> $LogFile
fi
if [ -f $NewFile ]
then
echo "[$NewFile]The Backup File is exists,Can't Backup!" >> $LogFile
else
cd $Mysql_bk_dir
/usr/bin/mysqldump -u $DbUser -p$DbPasswd --opt $DbName > $DumpFile
tar czf $NewFile postfix$(date +%Y%m%d).sql >> $LogFile 2>&1
echo "[$NewFile]Backup Success!" >> $LogFile
rm -rf $DumpFile
fi
###############################################################
# backup mail's user directories and files #
######################################################################
MailFileBk=$Mail_bk_dir/mail$(date +%Y%m%d).tgz
OldMailFileBk=$Mail_bk_dir/mail$(date +%Y%m%d --date='14 days ago').tgz
if [ -f $OldMailFileBk ]
then
rm -rf $OldMailFileBk
fi
if [ -f $MailFileBk ]
then
echo "[$MailFileBk]The Backup File is exists,Can't Backup!" >> $LogFile
else
cd /etc/
tar czf $MailFileBk postfix >> $LogFile 2>&1
fi
echo "-------------------------------------------" >> $LogFile
################################################################################################
異地備份腳本
mail:~# less /home/ssher/ssher.sh
#!/bin/bash
cd /usr/bin/
scp /data/maildata_bk/mailbk/mail$(date +%Y%m%d).tgz ssher@xxxxx:/home/bak/ //前提是建立SSH信任
scp /data/maildata_bk/mysqlbk/postfix$(date +%Y%m%d).tgz ssher@xxxxxx:/home/bak/
###################################################################################################
每天進(jìn)行自動(dòng)的異地備份,如下:
mail:~# less /etc/crontab
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
00 1 * * * root /root/maildb_back.sh
00 3 * * * ssher /home/ssher/ssher.sh
本文出自 “狼行天下” 博客,請務(wù)必保留此出處http://zhangbo.blog.51cto.com/350645/123098