postfix+dovecot+SASL+mysql+apache+extmail+extman实现基于虚拟用户的虚拟域邮件系统
声明:省略了前面的基础配置包括安装MYSQL,postfix等,这里用的Apache,MYSQL是rpm的,postfix,courier-authlib是编译安装的,有相关的文章介绍这里省略了;
安装所需的rpm包:(为了以后编译时少出错最好装上几个group如:Desktop Platform Development tools Server Platform等)
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,expect-devdel,sqlite,sqlite-devel
DNS配置:
[root@localhost named]# cat a.com.zone
$TTL 600
@ IN SOA ns.a.com. admin.a.com (
2015082901
2H
10M
3D
1D )
IN NS ns.a.com.
IN MX 10 mail.a.com.
ns IN A 192.168.85.128
mail IN A 192.168.85.128
www IN A 192.168.85.128
[root@localhost named]# cat 192.168.85.zone
$TTL 600
@ IN SOA ns.a.com. admin.a.com. (
2015082901
2H
10M
3D
1D )
IN NS ns.a.com.
128 IN PTR ns.a.com.
128 IN PTR mail.a.com.
128 IN PTR />
1. 先安装courier-authlib
courier-authlib是Courier组件中的认证库,它是courier组件中一个独立的子项目,用于为Courier的其它组件提供认证服务。其认证功能通常包括验正登录时的帐号和密码、获取一个帐号相关的家目录或邮件目录等信息、改变帐号的密码等。而其认证的实现方式也包括基于PAM通过/etc/passwd和/etc/shadow进行认证,基于GDBM或DB进行认证,基于LDAP/MySQL/PostgreSQL进行认证等。因此,courier-authlib也常用来与courier之外的其它邮件组件(如postfix)整合为其提供认证服务。
[root@www ~]# ll | grep courier
-rw-r--r-- 1 root root 2085083 Aug 28 13:31 courier-authlib-0.66.3.tar.bz2
[root@www ~]# tar xf courier-authlib-0.66.3.tar.bz2
[root@www ~]# cd courier-authlib-0.66.3
因为要用到动态模块加载器ltdl所以先安装
[root@www courier-authlib-0.66.3]# yum install libtool-ltdl.i686 libtool-ltdl-devel.i686 -y
[root@www courier-authlib-0.66.3]# ./configure \
--prefix=/usr/local/courier-authlib \
--sysconfdir=/etc \
--without-authpam \
--without-authshadow \
--without-authvchkpw \
--without-authpgsql \
--with-sqlite-libs/usr/lib
--with-sqlite-includes=/usr/include
--with-authmysql \
--with-mysql-libs=/usr/lib/mysql \
--with-mysql-includes=/usr/include/mysql \
--with-authmysqlrc=/etc/authmysqlrc \
--with-authdaemonrc=/etc/authdaemonrc \
--with-mailuser=postfix \
--with-mailgroup=postfix \
--with-ltdl-lib=/usr/lib \
--with-ltdl-include=/usr/include
其中:
--prefix=/usr/local/courier-authlib \ #指定安装目录
--sysconfdir=/etc \ #指定配置文件存放路径
--without-authpam \ #不支持pam认证
--without-authshadow \ #不支持shadow认证
--without-authvchkpw \ #不支持check pw认证
--without-authpgsql \ #不支持pgsql认证
上述认证也可不写只是装上了不使用就行了
--with-authmysql \ #基于MYSQL认证
--with-mysql-libs=/usr/lib/mysql \ #指定MYSQL的库文件位置
--with-mysql-includes=/usr/include/mysql \ #指定MYSQL的头文件位置
--with-authmysqlrc=/etc/authmysqlrc \ #courier-authlib提供给MYSQL的配置文件
--with-authdaemonrc=/etc/authdaemonrc \ #courier-authlib启动的进程的配置文件
--with-mailuser=postfix \ #实现邮件收发的用户
--with-mailgroup=postfix \ #实现邮件收发的组
--with-ltdl-lib=/usr/lib \ #ltdl的库文件路径
--with-ltdl-include=/usr/include #ltdl的头文件路径
2. 配置courier-authlib
2.1 配置文件
[root@localhost courier-authlib]# ll var/spool
drwxr-x--- 2 daemon daemon 4096 Aug 30 08:00 authdaemon
[root@localhost courier-authlib]# chmod 755 var/spool/authdaemon
/usr/local/courier-authlib/var/spool/authdaemon目录存放的是该进程的socket文件,这样其他用户能够进入并跟进程建立通信;也可以在编译时通过--with-authddamonvar=/var/spool/authdaemon选项来指定套接字目录路径;
[root@localhost courier-authlib]# cp /etc/authlib/authdaemonrc.dist /etc/authdaemonrc
[root@localhost courier-authlib]# cp /etc/authlib/authmysqlrc.dist /etc/authmysqlrc #编译时指定的
编辑/etc/authdaemonrc文件修改
authmodulelist="authmysql"
authmodulelistorig="authmysql"
DEBUG_LOGIN=2 #调试登陆功能,虚拟用户无法登陆时可先调为2,好了在关闭;
2.2 配置authdaemon通过mysql进行邮件帐号认证
编辑/etc/authmysqlrc文件修改(postfix用户的uid和gid为2525)
MYSQL_SERVER localhost #指定MYSQL服务器为本机
MYSQL_USERNAME extmail #跟MYSQL连接时用的用户名(为了和后文的配置保持一致这里使用extmail用户)
MYSQL_PASSWORD extmail #用户密码
MYSQL_SOCKET /var/lib/mysql/mysql.sock #MYSQL的套接字位置
MYSQL_PORT 3306 #指定MYSQL监听端口(默认)3306
MYSQL_DATABASE extmail #为postfix提供虚拟用户的数据库(extmail自动创建不需手动建立)
MYSQL_USER_TABLE passwd #用户帐号存放的表(extman自动生成)
MYSQL_CRYPT_PWFIELD password #指定password字段表示为用户密码
MYSQL_UID_FIELD 2525 #邮件服务器运行者账号的uid
MYSQL_GID_FIELD 2525 #邮件服务器运行者帐号的gid
MYSQL_LOGIN_FIELD username #指定username字段表示为用户名
MYSQL_HOME_FIELD concat('/var/mailbox/',homedir) #每个用户的家目录
MYSQL_NAME_FIELD name #用户的登录名
MYSQL_MAILDIR_FIELD concat('/var/mailbox/',maildir) #每个用户的邮箱目录
2.3 为authdaemon提供启动脚本
[root@localhost courier-authlib-0.66.3]# pwd
/root/courier-authlib-0.66.3
[root@localhost courier-authlib-0.66.3]# cp courier-authlib.sysvinit /etc/init.d/courier-authlib
[root@localhost courier-authlib-0.66.3]# chmod +x /etc/init.d/courier-authlib
[root@localhost courier-authlib-0.66.3]# chkconfig --add courier-authlib
[root@localhost courier-authlib-0.66.3]# chkconfig --list courier-authlib
courier-authlib 0:off 1:off 2:on 3:on 4:on 5:on 6:off
启动服务:
[root@localhost courier-authlib-0.66.3]# service courier-authlib start
/etc/authlib/authdaemonrc does not exist, forgot make install-configure?
[root@localhost courier-authlib-0.66.3]# make install-configure
[root@localhost courier-authlib-0.66.3]# service courier-authlib start
Starting Courier authentication services: authdaemond
[root@localhost courier-authlib-0.66.3]# ps aux | grep authdaemon
2.4 新建虚拟用户邮箱所在的目录,并将其权限赋予postfix用户
[root@localhost courier-authlib-0.66.3]# mkdir -pv /var/mailbox
mkdir: created directory `/var/mailbox'
[root@localhost courier-authlib-0.66.3]# chown -R postfix /var/mailbox
2.5 编辑 /usr/lib/sasl2/smtpd.conf重新配置SMTP 认证
[root@localhost courier-authlib-0.66.3]# vim /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
[root@localhost courier-authlib-0.66.3]# service saslauthd reload
3. 配置postfix支持虚拟用户和虚拟域
3.1 编辑/etc/postfix/main.cf添加:
########################Virtual Mailbox Settings########################
virtual_mailbox_base = /var/mailbox #指定用户邮箱位置
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf #用户邮箱的映射表,extman会提供
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 #如果mailbox有限定是否覆盖postfix的限定
#virtual_maildir_limit_message = Sorry, your maildir has overdrawn the quota! #邮箱超出限制时提示的信息
#virtual_overquota_bounce = yes #如果要想超出限制是否将再次发送的邮件回送给发送者
注意:虚拟用户使用的邮箱方式为maildir,home_mailbox = Maildir/,上面因为执行postfix -n 时提示有些选项不能使用,所以注释了;
3.2 创建对应的文件,使用extman源码目录下docs目录中的extmail.sql和init.sql建立数据库
安装httpd
[root@localhost ~]# yum install httpd
解压extman
[root@localhost ~]# tar xf extman-1.1.tar.gz
[root@localhost ~]# cd extman-1.1/docs
[root@localhost docs]# ls
backport init.sql ldap_virtual_mailbox_maps.cf mysql_virtual_limit_maps.cf
extmail.schema ldap_virtual_alias_maps.cf ldap_virtual_sender_maps.cf mysql_virtual_mailbox_maps.cf
extmail.sql ldap_virtual_domains_maps.cf mysql_virtual_alias_maps.cf mysql_virtual_sender_maps.cf
init.ldif ldap_virtual_limit_maps.cf mysql_virtual_domains_maps.cf README.postfix
对于.sql脚本将其中的MYSQL语句都执行一次:
[root@localhost docs]# mysql -u root -p < extmail.sql #root用户来执行,而且密码已经设置了,空密码去掉-p即可
Enter password:
[root@localhost docs]# mysql -u root -p < init.sql
Enter password:
注意:对于MYSQL5.1以后的版本,执行后会出现语法错误,可用sed -i 's@TYPE=MyISAM@ENGINE=InnoDB@g' extmail.sql修改后执行
3.3 登录MYSQL授权:
[root@localhost docs]# mysql -u root -p
Enter password:
Server version: 5.1.73 Source distribution
mysql> GRANT ALL PRIVILEGES ON extmail.* TO extmail@localhost IDENTIFIED BY 'extmail';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT ALL PRIVILEGES ON extmail.* TO extmail@'127.0.0.1' IDENTIFIED BY 'extmail';
Query OK, 0 rows affected (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
3.4 提供配置文件,将文件拷贝到postfix中:
[root@localhost docs]# cp mysql* /etc/postfix
注意:启用虚拟域以后,需要取消中心域,即注释掉myhostname,mydestination,mydomain,myorigin,当然也可以把mydestionation的值改为自己需要的;
重启postfix服务,此时就支持虚拟用户了:
[root@localhost postfix]# service postfix restart
Shutting down postfix: [ OK ]
Starting postfix: [ OK ]
3.5 测试:
[root@localhost postfix]# telnet 192.168.85.128 25
Trying 192.168.85.128...
Connected to 192.168.85.128.
Escape character is '^]'.
220 Welcome to our localhost.localdomain ESMTP!
ehlo maol.a.com
250-localhost.localdomain
250-PIPELINING
250-SIZE 14336000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from:root@a.com
250 2.1.0 Ok
rcpt to:lw@a.com
454 4.7.1 <lw@a.com>: Relay access denied #因为注释了mydomain所以不中继
quit
221 2.0.0 Bye
Connection closed by foreign host.
[root@localhost courier-authlib]# mysql -u root -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| extmail |
| mysql |
| test |
+--------------------+
mysql> use extmail;
mysql> show tables;
+-------------------+
| Tables_in_extmail |
+-------------------+
| alias |
| domain |
| domain_manager |
| mailbox |
| manager |
+-------------------+
mysql> select * from domain\G; #向其中添加域记录就会给本地主机中继了,测试放在后面,通过web页面添加;
4. 配置dovecot支持虚拟用户
4.1 编辑devocot配置文件,在/etc/dovecot/conf.d中有许多.ext文件,他们都被定义在auth.conf中,可根据需要启用或禁用,这里注释所有;
编辑auth.conf:
mail_location = maildir:/var/mailbox/%d/%n/Maildir
auth_mechanisms = plain
4.2 编辑/etc/dovecot/dovecot.conf,添加:
passdb {
driver = mysql
args = /etc/dovecot-mysql.conf
}
userdb {
driver = mysql
args = /etc/dovecot-mysql.conf
4.3 建立/etc/dovecot/dovecot-mysql.conf文件,内容是:
[root@localhost courier-authlib]# vim /etc/dovecot/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'
这表示dovecot认证用户时基于那个帐号密码连接数据库,并去哪个数据库哪个表中查找帐号密码验证;
说明:上述connect用于mysql服务器是本地主机,即host=localhost,如果mysql.sock文件不是默认的/var/lib/mysql/mysql.sock,可以使用host=“sock文件的路径”来指定新位置,如:connect = host=/mysql.sock dbname=extmail user=extmail password=extmail
4.4 重启服务:
[root@localhost dovecot]# service dovecot restart
Stopping Dovecot Imap: [ OK ]
Starting Dovecot Imap: [ OK ]
5. 安装extmail
说明:如果extmail的放置路径做了修改,那么配置文件webmail.cf中的/var/www路径必须修改为你所需要的位置。本文使用了默认的/var/www,所以,以下示例中并没有包含路径修改的相关内容;
5.1 编译安装
[root@localhost ~]# mkdir /var/www/extsuite(为了配合配置文件)
[root@localhost ~]# tar xf extmail-1.2.tar.gz
[root@localhost ~]# mv extmail-1.2 /var/www/extsuite/extmail
5.2 提供并编辑配置文件
[root@localhost extmail]# cp webmail.cf.default webmail.cf
[root@localhost extmail]# vim webmail.cf
SYS_MESSAGE_SIZE_LIMIT = 5242880 #用户可以发送的最大邮件大小
SYS_USER_LANG = zh_CN #语言改为中文
SYS_MAILDIR_BASE = /var/mailbox #用户邮箱存放位置(和前面的配置保持一致)
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail #连接MYSQL时所用的帐号,密码
SYS_MYSQL_DB = extmail #用到的数据库为extmail库
SYS_MYSQL_HOST = localhost #MYSQL服务主机名
SYS_MYSQL_SOCKET = /var/lib/mysql/mysql.sock #MYSQL的sock文件路径
SYS_MYSQL_TABLE = mailbox
SYS_MYSQL_ATTR_USERNAME = username
SYS_MYSQL_ATTR_DOMAIN = domain
SYS_MYSQL_ATTR_PASSWD = password
上述四项指定验证用户登录后用到的表以及用户名,域名,密码对应分别对应表中的列名,默认即可;
SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket #指定authdaemon socket文件位置;
6. 配置Apache
6.1 编辑配置文件
由于extmail要进行本地邮件的投递操作,故必须将运行apache服务器用户的身份修改为您的邮件投递代理的用户postfix;本例中打开了apache服务器的suexec功能,来实现虚拟主机运行身份的指定;
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html" #注释掉
添加虚拟主机:
<VirtualHost *:80>
DocumentRoot /var/www/extsuite/extmail/html/
ServerName mail.a.com
ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi
Alias /extmail /var/www/extsuite/extmail/html
SuexecUserGroup postfix postfix #user和group还是apache也可以去掉该项把user和group改为postfix
ErrorLog logs/mail.a.com-error_log
CustomLog logs/mail.a.com-access_log common
</VirtualHost>
关于Suexec的说明:一般运行httpd的用户,组是apache,但是cgi程序是由httpd启动的,那么cgi的运行者也是apache了,但是邮箱的网页页面实现用户投递代理时要使用postfix用户,这样就起了冲突;可以将user和group改为postfix,这样httpd的运行者就是postfix,而它启动的cgi也是postfix,这意味着所有的web服务的运行者都是postfix,如果有些虚拟主机站点跟邮件服务没关系,那么就不应该以postfix身份运行,而Suexec就是仅在运行某些虚拟主机时不在使用user和group值而是使用自己定义的值;所以假如Apache对Suexec的支持并不好可将user和group设为postfix;
6.2 测试语法并重启httpd服务
[root@localhost ~]# httpd -t
httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
Syntax OK
编辑[root@localhost ~]# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=mail.a.com
[root@localhost ~]# httpd -t
Syntax OK
6.3 修改extmail的cgi执行文件属主为apache运行身份用户
[root@localhost extmail]# pwd
/var/www/extsuite/extmail
[root@localhost extmail]# chown -R postfix.postfix cgi/
6.4 解决依赖关系
测试时报错:Unix::Syslog not found, please install it first! (in cleanup) Undefined subroutine &Ext::Logger::do_closelog called at /var/www/extsuite/extmail/libs/Ext/Logger.pm line 86. 这是因为extmail会用到perl的Unix::syslogd功能;
安装Unix-Syslog:
[root@localhost ~]# tar xf Unix-Syslog-1.1.tar.gz
[root@localhost ~]# cd Unix-Syslog-1.1
[root@localhost Unix-Syslog-1.1]# perl Makefile.PL
[root@localhost Unix-Syslog-1.1]# make && make install
6.5 测试
点击一下登录邮箱-->选择登录邮箱管理-->直接登录-->显示extman错误,这时因为extman还未配置
7. 配置extman
7.1 将extman放到/var/www/extsuite中
[root@localhost ~]# mv extman-1.1 /var/www/extsuite/extman
[root@localhost ~]# cd /var/www/extsuite/extman
7.2 提供并编辑配置文件(部分修改)
[root@localhost extman]# cp webman.cf.default webman.cf
[root@localhost extman]# vim webman.cf
SYS_MAILDIR_BASE = /var/mailbox
SYS_SESS_DIR = /tmp/extman/ #创建目录并将该目录的属主属组改为postfix
SYS_CAPTCHA_ON = 0 #临时关闭验证码
SYS_DEFAULT_UID = 2525 #改为postfix用户的uid号
SYS_DEFAULT_GID = 2525 #改为postfix组的gid号
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail #可以改为extmail也可不改再创建一个webman帐号(和上面的一样,MYSQL中给权限)
7.3 修改webman的cgi目录权限和属主属组
[root@localhost extman]# chown -R postfix.postfix cgi/
7.4 在虚拟主机的配置段中添加:
<VirtualHost *:80>
DocumentRoot /var/www/extsuite/extmail/html/
ServerName mail.a.com
ScriptAlias /extmail/cgi /var/www/extsuite/extmail/cgi
Alias /extmail /var/www/extsuite/extmail/html
SuexecUserGroup postfix postfix
ScriptAlias /extman/cgi /var/www/extsuite/extman/cgi
Alias /extman /var/www/extsuite/extman/html
ErrorLog logs/mail.a.com-error_log
CustomLog logs/mail.a.com-access_log common
</VirtualHost>
重启服务:
[root@localhost extman]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
7.5 测试
点击一下登录邮箱管理-->选择登录邮箱管理-->直接登录
进入管理后台登录
默认用户名:root@extmail.org
默认密码:extmail*123*
登录后报错:
解决:
[root@localhost extman]# mkdir /tmp/extman
[root@localhost extman]# chown -R postfix.postfix /tmp/extman/
刷新页面:
域列表中只有一个域,可添加:
点击修改a.com域,重新勾选自由注册选项保存;
测试注册邮箱:
重新登录到extmail(不是刚才的后台管理)注册
再创建一个用户(过程省略)测试收发邮件:
关于验证码和图形化日志的功能请看: