在刚开始搭建时,遇到了很多的困难,这远比我想象的要难,尤其还要满足公司的需要,我看了一些资料,包括
Postfix
权威指南,看了
sery
的博文,看了些官方的文档,只不过是在
cent
os
上搭建的,和
debian
的环境有很多不同之处,这在开始给我带来了很多的麻烦,望以后想搭建的朋友,应该选择一个自己较熟悉的系统平台进行测试,我是没法子,还有在这里还有提醒一下朋友,在上手之前一定要把邮件系统的知识掌握到一定的程度。
以下是用到的一些软件:
名称
|
用途
|
下载地址
|
Apache (httpd-2.2.0)
|
Web
方式管理邮件
|
[url]www.apache.org[/url]
|
Php (php-5.2.3)
|
Php
解释器,与
apache
一起使用
|
[url]www.php.org[/url]
|
Mysql (mysql-5.0.41)
|
用数据库存储用户信息
|
[url]www.mysql.com[/url]
|
extman
(
postfix-2.1.0
)
|
邮件帐号后台
web
管理工具
|
[url]http://sourceforge.net/projects/postfixadmin/[/url]
|
SASL
(
cyrus-sasl-2.1.21.tar.gz
)
|
验证方法
|
[url]http://ftp.andrew.cmu.edu/pub/cyrus-mail/[/url]
|
Authlib(courier-authlib-0.59.3.tar.bz2)
|
与
SASL
一起做验证
|
[url]http://www.courier-mta.org/download.php[/url]
|
Postfix
|
邮件系统主程序
|
[url]http://www.postfix.org[/url]
|
Courier-imap (courier-imap-4.1.3.tar.bz2)
|
Pop3
及
IMAP
服务
|
[url]http://www.courier-mta.org/[/url]
|
Perl (perl-5.8.8)
|
解释器
|
[url]http://www.cpan.org[/url]
|
Maildrop (maildrop-2.0.4.tar.bz2)
|
邮件投递代理,直观的讲就是把收到的邮件转发到用户的邮箱目录
|
[url]http://www.courier-mta.org/[/url]
|
Pcre
(
pcre-7.2.tar.bz2
)
|
安装
Imap
需要
--
Perl
兼容正则表达式
|
[url]http://www.pcre.or[/url]
g
|
Extmail (extmail-1.0.1.tar.gz)
|
webmail
|
[url]http://www.extmail.org[/url]
|
源文档 < [url]http://sery.blog.51cto.com/10037/45500[/url]>
下面我用表格的方式列出postfix系统所需要创建的用户及组的情况:
用户名
|
组名
|
作用
|
备注
|
mysql
|
Mysql
,
extmail
,
extman
|
数据库
mysql
运行用户
,
界面与后台默认用户
|
|
vmail
|
Vmail
|
Postfix
虚拟邮件帐号所使用的用户及组
|
uid,gid:2000,2000
|
postfix
|
Postfix
|
Postfix
主程序使用的帐号和组
|
|
|
Postdrop
|
Postfix setgid_group
|
setgid_group=postdrop
|
源文档 < [url]http://sery.blog.51cto.com/10037/45500[/url]>
上面用到的用户必须要有
在这里用到的一些基本包就不罗列了,像
postfix
,
apache
,
等,就用
apt-get
进行安装,途中报错,注意提示信息,细心就可以了,这里再次强调版本的一致性。下面就直接进入正题了
,
注:有些地方我摘要的是官方文档的内容,如有笔误敬请谅解
#####################################################################################
一。在/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
的要求进行配置,细节后面会说
# 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
//
这里没有冒号,指定邮件的
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========================
//
磁盘配额的设置
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
####################################################################
######################
下面是手动加的,和上面的对应
编辑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
>创建/etc/postfix/sasl/smtpd.conf 加入下面的内容
pwcheck_method: authdaemond
//
认证的方式
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/run/courier/authdaemon/socket
//
注意路径
#####################################################################################################################
三。安装Courier-Authlib
运行如下命令安装相关软件包
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
//会生成详细的错误报告,之后置零
修改etc/courier/authdaemon
//里面进行指定mysql的指定
主要关系到认证
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), \
//
查询的内容
CONCAT('/home/domains/',maildir),
\
quota,
\
name
\
FROM mailbox
\
WHERE username = '$(local_part)@$(domain)'
存盘退出后启动courier-authlib:
/etc/init.d/courier-authlib start
如一切正常,命令行将返回如下信息:
Starting Courier authentication services: authdaemond
修改authdaemon socket目录权限
如果该目录权限不正确修改,maildrop及postfix等将无法正确获取用户的信息及密码认证:
chmod 755 /var/spool/authdaemon
##
############################################################################
四。安装maildrop
apt-get install maildrop
apt-get install mailman
配置master.cf
为了使Postfix支持Maildrop,必须修改/etc/postfix/master.cf文件,注释掉原来的maildrop的配置内容,并改为:
maildrop
unix
-
n
n
-
-
pipe
flags=DRhu user=vmail argv=/usr/bin/maildrop -V3 -w 90 -d ${recipient}
//V3
为生成详细的日志,之后记得关掉
配置main.cf
由于maildrop不支持一次接收多个收件人,因此必须在main.cf里增加如下参数:
#mailbox_command = procmail -a "$EXTENSION"
//
这里必须注释掉
maildrop_destination_recipient_limit = 1
//在里面新加的内容
最后重新启动postfix即可
注意事项:
1.如需重新编译Maildrop软件包,必须先获得其源码rpm包,并且必须先行安装courier-authlib及其devel软件包,否则编译后的maildrop将无法打开authlib支持。
2.maildrop RPM包安装时,会自动创建vuser用户及vgroup用户组,专门用于邮件的存储,vuser:vgroup的uid/gid都是1000,这与一般的邮件文档中提及用postfix用户存邮件不一样。因为postfix用户的uid一般都低于500,而Suexec模块编译时对UID/GID的要求是要大于500,因此使用postfix用户不能满足要求。其次,如果用Maildrop作为投递代理(MDA),以postfix身份投递的话,会导致postfix MTA错误
######################################################################################################################################
五。配置
appache
编辑/etc/httpd/conf/vhost_extmail.conf,里面定义虚拟主机的相关内容,包括主目录,以及ExtMail和ExtMan的相关配置,Suexec的设置等。
# VirtualHost for ExtMail Solution
<VirtualHost *:80>
ServerName mail.
xxx
x
.
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 v
mail
v
mail
</VirtualHost>
重新启动apache:
/etc/init.d/apache2
restart
##################################################################################################################
六。安装ExtMail
建立/var/www/extsuite并复制源码到该目录,相关命令:
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
注意:上面命令行中最后一个cd $OLDPWD是返回原始路径(即ExtMail Solution软件包根目录)
安装perl-Unix-Syslog包
apt-get install Unix-Syslog-perl
编辑webmail.cf
修改/var/www/extsuite/extmail/webmail.cf里的其他参数,主要变动的内容见下:
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是为了打开网络磁盘和过滤器;SYS_SHOW_SIGNUP控制首页是否显示免费注册邮箱按钮;全局地址本默认为ldap格式,现在也改为文本格式,并将地址本的转换编码改为GB2312
更新cgi目录权限
由于SuEXEC的需要,必须将extmail的cgi目录修改成vuser:vgroup权限://前面建立了需帐户和组为: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参数控制首页是否采用校验码登陆
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这个用户,否则会不让登陆后台
其他参数基本上可以使用默认值。
安装perl-GD包
apt-get install perl-GD
更新cgi目录权限
由于SuEXEC的需要,必须将extman的cgi目录修改成
vmail:vmail
权限:
###################################################################################################################333
八。确认MySQL状态
在执行mysql操作前,必须确认它已被正确安装并启动,可以用rpm命令查询mysql server的安装情况,用ps ax的办法查看进程列表是否有mysqld进程:
rpm -aq|grep -i mysql-server
正常情况下应该可以看到mysql-server被安装:
mysql-server-4.1.20-2.RHEL4.1.0.1
如果没有,则表示没有安装好mysql-server,可以从本软件包RPMS目录里安装,也可以找安装光盘安装:
rpm -ivh RPMS/mysql-server-4.1.20-2.RHEL4.1.0.1.i386.rpm
安装完毕后必须初始化mysql,然后重新启动
/usr/bin/mysql_install_db
service mysqld start
正常情况下将启动成功:
Starting MySQL:
[
OK
]
然后用ps命令来检查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没正确启动,请检查/var/log/mysqld.log里面的出错提示,进行处理:
tail /var/log/mysqld.log
数据库初始化
执行以下命令导入mysql数据库结构及初始化数据,注意必须逐行输入以下命令,root密码默认为空,不可直接用鼠标复制两行命令直接输入,否则会报错!
mysql -u root -p < /var/www/extsuite/extman/docs/extmail.sql
//
这里是要导入的数据
mysql -u root -p < /var/www/extsuite/extman/docs/init.sql
//注意更改里面的用户,主机域名,地址,默认的uid与gid改为2000
链接基本库到Extmail
建立临时文件夹:
mkdir /tmp/extman
chown -R v
mail:vmail
/tmp/extman
//注意他的存在问题
建立刚才导入mysql的postmaster@
XXXX
.
com
帐户的Maildir,请输入如下命令:
cd /var/www/extsuite/extman/tools
./maildirmake.pl /home/domains/
XXXX
.
com
/postmaster/Maildir
//
手动建立用户
chown -R vuser:vgroup /home/domains/
XXXX
.
com
cd $OLDPWD
注意事项:
上面命令行中最后一个cd $OLDPWD是返回原始路径(即ExtMail Solution软件包根目录)
由于RedHat发行版中包含了一个叫tmpwatch的工具,该工具会定期扫描/tmp/下的文件,如果这些文件很久都没被使用,将被删除,因此如果后台长期不使用,/tmp/extman目录有可能被tmpwatch删除,所以要么定期登陆后台,要么修改 webman.cf将临时目录修改到另一个地方。此处暂以/tmp/extman默认值为例。
上述导入初始化SQL时,默认的uidnumber/gidnumber都是
2
000,这和vuser:vgroup 的uid/gid一致,是因为maildrop投递时会从数据库里取uidnumber/gidnumber,而在master.cf里已经定义好了投递时的运行身份(
vmail
:vmail
),所以这两个字段的内容必须为
2
000,否则将出现投递错误,例如报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数据库
最后访问
[url]http://mail.[/url]
xxxx
.com
/extmail/
,如无意外,将看到webmail的登陆页,不过此时还没有加正式的用户,所以不能登陆,包括postmaster@
XXXX
.
com
也不行。必须要登陆到[url]http://mail.[/url]
XXXX
.
com
/extman/ 里增加一个新帐户才能登陆。
ExtMan的默认超级管理员帐户: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
启动:
/
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
");'
/
/
测试的用户和域名
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==
//
生成的编码进行校验
334 UGFzc3dvcmQ6
dGVzdA==
//
是否匹配
235 2.0.0 Authentication successful
250 2.1.0 Ok
rcpt to:<
test@
Xxx
.com
>
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
//
测试
pop
3
是否正常
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"/
e
xtmail
$(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/
###################################################################################################
每天进行自动的异地备份,如下:
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