mysql开启邮件服务_邮件服务之实现基于虚拟用户的虚拟域邮件系统

postfix+dovecot+SASL+mysql+apache+extmail+extman实现基于虚拟用户的虚拟域邮件系统

b9b1ba5b3f69aafa77e150267c09b4ba.png

声明:省略了前面的基础配置包括安装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     www.a.com.

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 : 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"#注释掉

添加虚拟主机:

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

关于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  测试

05614bd4e0136eb0c30ef2bf3432df98.png

点击一下登录邮箱-->选择登录邮箱管理-->直接登录-->显示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  在虚拟主机的配置段中添加:

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

重启服务:

[root@localhost extman]# service httpd restart

Stopping httpd: [  OK  ]

Starting httpd: [  OK  ]

7.5  测试

2f9fe2a58370a0651e4dbde219c00f21.png

点击一下登录邮箱管理-->选择登录邮箱管理-->直接登录

2f18ef5707110b8608eb302991015e42.png

进入管理后台登录

9565336ecbf0dee25c1adb30e023e21f.png

默认用户名:root@extmail.org

默认密码:extmail*123*

登录后报错:

bc0254fe02e61632015f4a3ba89742fc.png

解决:

[root@localhost extman]# mkdir /tmp/extman

[root@localhost extman]# chown -R postfix.postfix /tmp/extman/

刷新页面:

190b778ff24b170a0bd109a3148bdca4.png

域列表中只有一个域,可添加:

ff4d17448a202fc55957292d3f9219fe.png

7851fdc59e44771f71a47df943ea596b.png

d82bfaf6da3d3d575e499483264d15f0.png

点击修改a.com域,重新勾选自由注册选项保存;

测试注册邮箱:

重新登录到extmail(不是刚才的后台管理)注册

b284867e7cd92818e40143047bd0e6d4.png

0e6d9968f887707bcb8c4a85b53b94e0.png

013fe717aaf0424976409436fe174afb.png

f36940c50f7f201f991e12d93ee4927e.png

53f023e933105498c5dab19731782bb9.png

5958743503f054de206d7679694adb56.png

再创建一个用户(过程省略)测试收发邮件:

6e7a59c31ae12cb1c9c45c9fee1455ad.png

bcfe4d548fea6331470aabb3bd38241a.png

e3f8ba17f6acbf82d0b31f547b796ae7.png

关于验证码和图形化日志的功能请看:

阅读(1228) | 评论(0) | 转发(0) |

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值