通过vpopmail实现qmail邮件账户的数据库管理

12/3/2006来源:Qmail人气:5582

摘要:本文在“qmail使用系统用户作为邮件账户的安装与配置”一文的基础上讨论如何通过vpopmail实现qmail邮件账户与系统账户分离,邮件账户存放在数据库文件中的解决方案。

硬件环境:HP Netserver E60 128M内存 单网卡

软件环境:redhat6.2 vpopmail4.9.4 qmail1.3 MySQL-3.23.22-beta ucspi-tcp-0.88

前言
1、mysql安装
2、vpopmail安装过程
3、vpopmail的详细配置选项
4、Qmail和虚拟域
5、笔者安装过程

前言
在一台邮件服务器的上实现多个域的邮件系统是qmail用户非常关心的问题之一,为了解决这个问题,Inter7开发了遵从GPL版权的vpopmail(vchkpw)来使用户方便地在一台qmail邮件服务器上实现邮件虚拟域和非系统账号。其具有一下特点:

●所有的qmail配置及数据文件都提供了具有详细说明的修改的命令。
●仅仅占用一个系统账号,所有的相关进程运行在单个UID/GID之下。
●支持基于named和ip的虚拟域。安全的使用NFS之上。
●通过使用三级平衡树填充技术实现动态的为十个到一千万用户创建邮件目录。
●根据真实世界的管理需求提供了可配置的记录功能。
●支持Oracle, Sybase, Mysql, LDAP, /etc/passwd, /etc/shadow和缺省的cdb用户认证信息存储方式。
●直接传递数据到Maildir,来和qmail-pop3d, .qmail文件或其他任何Maildir程序。
●不需要为虚拟域提供很多.qmail文件,每个域在vpopmail用户主目录下拥有自己的目录,每个域有独立的密码文件。
●详细说明的命令程序能被用在脚本文件及远程管理。
●所有的vpopmail特性的C库都有详细的说明文档。

而且提供了下面的软件包来增强qmail+vpopmail的特性:

●QmailAdmin 基于web的vpopmail管理工具。
●vqsignup一个基于vpopmail管理工具的cgi程序,其允许用户自己申请email账号。
●Courier IMAP IMAP服务器。
●SqWebMail 基于web的email客户程序。

1、Mysql的安装;

笔者使用的rpm包方式的源代码,因此首先要解开rpm包:

[root@radiusd ideal]# rpm -ivh MySQL-3.23.22-1.src.rpm
MySQL ##################################################
然后:
[root@radiusd ideal]# cd /usr/src/redhat/SOURCES/
[root@radiusd SOURCES]# ls -al
total 6432
drwxr-xr-x 2 root root 4096 Oct 29 14:07 .
drwxr-xr-x 7 root root 4096 Oct 30 2000 ..
-rw-r--r-- 1 root root 6560696 Jul 30 11:23 mysql-3.23.22-beta.tar.gz
-rw-rw-r-- 1 root root 3082 Jul 30 11:23 mysql.gif
[root@radiusd SOURCES]# tar xvgz mysql-3.23.22-beta.tar.gz

解压源代码包,就会在当前目录下生成mysql-3.23.22-beta的子目录,其中包含了mysql的源代码,然后使用下面的命令进行安装:

./configure
make
make install
scripts/mysql_install_db

就实现了Mysql数据库服务器安装,其中启动mysql服务器的命令为:

/usr/local/mysql/bin/safe_mysqld %26amp;

现在就实现了mysql数据库服务器的安装和运行,下面我们应当设立基本的用户权限信息。缺省的,mysql拥有一个缺省的具有对数据库完全访问可控制的用户,名字为root,所以首先应当为该用户添加访问密码:

[root@radiusd src]# mysql -u root mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 183 to server version: 3.23.22-beta
Type 'help' for help.
mysql>

这样就进入了mysql服务器的客户程序,然后发出sql语句命令:

UPDATE user SET PassWord = PASSWORD ('new_password') WHERE user = 'root';
FLUSH PRIVILEGES;

这里的new_password是为mysql的root用户设立的密码。但是一般推荐再创建一个权限和root完全相同的用户,命令如下:

INSERT INTO user
VALUES ('host','user','passwd',
'y','y','y','y','y','y','y','y','y','y','y','y','y','y');

一般,mysql与icradius服务器都是运行在同一个服务器上,这时候,host为localhost,若你的icradius服务器运行在另外一台服务器上,则你需要在这里设定host为你的icradius服务器的名字。用户为你设定的用户名,密码为该用户的密码。

2、vpopmail的安装过程
1、解压软件包:

[root@www src]# tar xvfz vpopmail-4.9.4.tar.gz

2、添加必需的组和用户:

[root@www vpopmail-4.9.4]# /usr/sbin/groupadd vchkpw
[root@www vpopmail-4.9.4]# /usr/sbin/useradd -g vchkpw vpopmail

若希望将vpopmail用户的主目录存放在其他目录,则需要使用下面的命令:

[root@www vpopmail-4.9.4]# /usr/sbin/useradd -g vchkpw -d /path/to/where/you/want vpopmail

3、创建~vpopmail/etc/tcp.smtp文件

若你具有192.168.0的一个c类地址,则在该文件中应该包含内容:

127.0.0.:allow,RELAYCLIENT=""
10.1.1.:allow,RELAYCLIENT=""
:allow

若具有多个C地址,则需要在文件中分别包含对应各个C的地址的条目。

4、配置编译vpopmail:

[root@www vpopmail-4.9.4]# ./configure
[root@www vpopmail-4.9.4]# make
[root@www vpopmail-4.9.4]# make install-strip

5、支持漫游用户

若希望支持漫游用户通过邮件服务器的转发邮件(mail relay),则需要使用如下配置选项:

[root@www vpopmail-4.9.4]# ./configure --enable-roaming-users=y

设置crontab,运行:

[root@www etc]# crontab -e

添加如下内容:
40 * * * * /home/vpopmail/bin/clearopensmtp 2>%26amp;1 > /dev/null

支持漫游用户的原理是当某个漫游用户使用pop3取信以后,则在某断时间内允许该地址通过邮件服务器的转发信件。

6、添加虚拟域

[root@www /]# cd /home/vpopmail/bin
[root@www /]# ./vadddomain test.com
或:
[root@www /]# ./vadddomain test.com password-for-postmaster

该命令将会修改一下几个qmail的配置文件:

/var/qmail/control/locals
/var/qmail/control/rcpthosts
/var/qmail/control/morercpthosts (if rcpthosts > than 50 lines)
/var/qmail/control/virtualdomains
/var/qmail/users/assign
/var/qmail/users/cdb

同时,将创建以下目录或文件:

~vpopmail/domains/test.com
~vpopmail/domains/test.com/postmaster/Maildir ...
~vpopmail/domains/test.com/vpasswd
~vpopmail/domains/test.com/vpasswd.cdb

然后需要重新启动qmail进程来更新配置:
/etc/rc.d/init.d/qmailstartup restart

6、添加新的邮件POP用户

[root@www /]# cd /home/vpopmail/bin/
[root@www bin/]#./vadduser newuser@test.com
or
注[root@www bin/]]#./vadduser newuser@test.com

在这种情况下,用户邮件域需要被指定test.com,这个用户被添加到
~vpopmail/domains/test.com。

7、删除邮件pop用户

[root@www bin/]]# /home/vpopmail/bin/vdeluser newuser@test.com

8、修改一个POP用户密码:

[root@www bin/]]# /home/vpopmail/bin/vpasswd newuser@test.com

9、结合vchkpw与qmail-pop3d

当使用vpopmail时,则需要将pop的运行脚本run修改为:

#!/bin/sh

exec /usr/local/bin/tcpserver -v -H -R 0 pop-3 -u vpopmail -g
vchkpw /var/qmail/bin/qmail-popup
domain1.com /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d
Maildir 2
>%26amp;1 |
/var/qmail/bin/splogger pop3d

注:从exec到"| "都是同一行的内容。

3、vpopmail的详细配置选项
--enable-roaming-users=n|y
当pop3认证通过以后,是否打开对该用户的邮件转发(mail relay),缺省是关闭的。若设置该方法为yes,则当某个用户通过了pop3认证,则将其ip地址加入许通过该邮件服务器的进行邮件relay的列表中。一个名为clearopensmtp的cronjob程序可以用来实现在一段时间以后从允许转发邮件地址列表中将该ip地址去除。这个选项要求以-x /etc/tcp.smtp.cdb选项来使用tcpserver运行smtp服务器。
--enable-hardquota=#|n
设置或打开磁盘限额,NOQUOTA为没有限制为没有邮件账号设置磁盘限额,缺省为50M,这里=后面的数字单位为字节,也就是为了限制磁盘限额为10M就需要使用配置参数:
--enable-hardquota=10000000。
若磁盘限额超出,则将拒绝接收该用户的新邮件,并返回一封拒绝信息信件,其中的信息可以定制。
--enable-default-domain=name 设定缺省域名
推荐将所有的域都设置为虚拟域,并且挑选一个作为缺省域。对于缺省域的用户,其通过接收邮件时,只需要在用户名中设置其邮件用户名即可,而对于其他非缺省用户,则需要将用户名设置为 % 的格式才能通过pop3收取信件。
--enable-ip-alias-domains=y|n
允许通过反向解析来察看虚拟域.缺省情况下,每个域使用基于虚拟域的名字,也就是用户必需在pop用户名中提供相应的域信息,也就是 % 。
当然可以是用enable-default-domain配置选项来覆盖该要求。Vpopmail同样支持基于IP地址的虚拟域,若该选项打开则用户不需要在pop用户名中提供
% ,则vpopmai自动对用户连接的服务器的IP地址进行反向解析,若解析得到一个域名,则vpopmail使用该名字作为域,例如:
IP w.x.y.z 对应于域名test.com,用户设置pop服务器的IP地址为w.x.y.z,然后连接pop服务器,vpopmail1得到连接请求,并察看连接的服务器端的IP,然后进行反向DNS查询,得到test.com的域名,用户使用joe作为pop用户名,vpopmail使用test.com。
--enable-relay-clear-minutes=360 允许漫游用户通过邮件服务器的转发邮件的时间段。
若--enable-roamin-users=y,则该选项设置clearopensmtp应该保持该IP在允许列表中的时间,缺省是3小时。

Mysql options
--enable-mysql=n|y 使用mysql,缺省是no.允许通过将账号存放在mysql数据库中来认证用户。
  意:在配置和编译以前需要修改文件vmysql.h,正确的设置mysql服务器的name/ip, mysql用户和mysql用户密码。该用户必需要拥有创建数据库和在其中创建表格的权限。
--enable-sqlincdir= sql头文件的目录,缺省为/usr/local/mysql.
--enable-sqllibdir=/usr/lib/mysql 库文件libmysqlclient.a的目录,缺省为/usr/lib/mysql
--enable-sqllibs=mysqlclient mysql库名,缺省为libmysqlclient.a.
--enable-large-site=n|y 缺省值为no,使用该选项是为了适应大量用户的情况。
缺省的vpopmail将所有的域信息存放在同一个table-vpopmail中,这对于一般情况下具有很好的效率。但是对于大量用户的系统,则需要将该选项设置为yes。这时候,vpoomail将为每个域创建一个table。最主要的区别是域名不存放在数据库中,因为表格包含了域名。对于大于500,000+的用户,这可以节省大量的磁盘空间。但是对于有大量虚拟域的系统可能会影响mysql的性能。

Vpasswd/cdb options
--enable-ucspi-dir=dir 编译好ucspi包的目录位置
使用该目录来设定ucspi-tcp软件包的路径,缺省为../ucspi-tcp-0.84。vpopmail需要使用该目录中的头文件和两个.a文件。

Logging options
--enable-logging=e|y|n 打开(y)或关闭(n)使用syslog进行log,或e仅仅log错误信息。
设置log级别,缺省仅仅记录pop认证错误信息。
--enable-log-name=vpopmail 设置log名

User/group options
--enable-vpopuser=vpopmail
若使用其他的用户来安装该软件包,则在该选项中指定组名。
--enable-vpopgroup=vchkpw
若使用其他的组来安装该软件包,则在该选项中指定组名。
--enable-admin-email=email-address 系统管理员的电子邮件地址。

Directory and file location options
--enable-tcpserver-file=/etc/tcp.smtp tcpserver -x使用的邮件转发配置文件的存放目录,缺省为/etc
--enable-qmaildir=dir qmail的安装目录指定,缺省为/var/qmail。
--enable-tcprules-prog=/usr/local/bin/tcprules tcprules程序的安装位置,缺省为/usr/local/bin
--enable-apop-file=/etc/apop-secrets apop密钥存放目录

Other options
--enable-apop=y|n 允许或禁止apop认证,缺省是yes
--enable-passwd=y|n 允许或禁止/etc/passwd(或shadow)认证。
覆盖自动配置,缺省的配置程序将自动检测系统是使用passwd或shadow密码,通过设置该选项为no,可以禁止所有的/etc/passwd账号认证。

4、Qmail和虚拟域
Qmail对于邮件域有"local"和"virtual"的概念。local域是实现匹配/etc/passwd账号;而虚拟域则匹配于罗列在qmail的控制文件"virtualdomains"的各个域。Vpopmail则利用qmail的users/assign和virtualdomains文件。users/assign文件(该文件的含义可以参考Life with qmail中的qmail-users 3.6的说明)被编译为users/cdb的形式,它是一个哈希数据库来加快查找速度。若任意一个模式得到匹配,则qmail使用文件中定义的uid和gid传送该邮件到文件中定义的目录。Vpopmail利用该方法来实现使qmail以单一的vpopmail/vchkpw身份来传输所有的虚拟域的邮件,从而实现将邮件传输到vpopmail/domains/ 目录下的不同用户。

对于qmail来说,qmail-local程序一旦从users/assign得到相关信息,则其进行标准的.qmail文件操作。一般来说,.qmail- 文件被用来完成邮件转发、别名或调用其他程序如ezmlm等。若没有找到匹配,则qmail-local查找.qmail-default文件,这是qmail-local邮件投递机制中最后一步。 Vpopmail利用该文件来调激活vdelivermail 程序,该程序以两个参数被调用,第一个当前没有作用,主要是用作向后兼容的;第二个参数是用来在一个虚拟域用户没有被找到时的缺省投递,一般来说,缺省投递可以是将邮件投递到某个目录或某个邮件地址或返回无此用户的返回信件。

5、笔者安装过程
笔者是在安装成功了真实用户qmail系统的基础上进一步实现将账号存放在mysql数据库中。这里支持漫游用户,用户磁盘限额为10M,系统具有多个域:domain1.com和domain2.com,并且这两个域是完全等同的,即:用户一旦拥有了系统信箱,将拥同时有usr1@domain1.com和usr2@domain2.com两个地址。笔者的mysql服务器按照缺省配置已经安装成功,运行正常。并且将所有的邮件账号都放进虚拟域中,不允许通过/etc/passwd进行认证。

第一步:修改文件/usr/src/vpopmail-4.9.4/vmysql.h,修改

/* Edit to match your set up */
#define MYSQL_SERVER "localhost"
#define MYSQL_USER "root"
#define MYSQL_PASSWD "passwoerd"
/* End of setup section*/

中mysql服务器的地址,若你的mysql服务器存放在其他机器上,则将localhost修改为你的mysql服务器的ip地址;若你希望使用其他具有对数据库读写及创建库和表格的用户来访问数据库,则将root为你希望的用户名;将passwoerd修改为你的mysql数据库对应的访问密码。

拷贝//usr/local/lib/mysql下的所有内容到/lib/中

第二步:创建需要的用户和组:

/usr/sbin/groupadd vchkpw
/usr/sbin/useradd -g vchkpw vpopmail

第三步:配置编辑vpopmail:

./configure --enable-roaming-users=y --enable-hardquota=10000000
--enable-default-domain=secfocus.com --enable-mysql=y
--enable-sqlincdir=/usr/local/include/mysql/
--enable-sqllibdir=/usr/local/lib/mysql
--enable-ucspi-dir=../ucspi-tcp-0.88 --enable-passwd=n
(注:以上全为一行)
make
make install

第四步:添加虚拟域
/home/vpopmail/bin/vadddomain domain1.com
/home/vpopmail/bin/vaddaliasdomain domain2.com

第五步:添加用户
/home/vpopmail/bin/vadduser user@domain1.com

第六步:支持pop3
当使用vpopmail时,则需要将pop的运行脚本run修改为:

#!/bin/sh
exec /usr/local/bin/tcpserver -v -H -R 0 pop-3 -u vpopmail -g
vchkpw /var/qmail/bin/qmail-popup
domain1.com /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d
Maildir 2
>%26amp;1 |
/var/qmail/bin/splogger pop3d

注:从exec到“|“为一行
注:在这里笔者在dns的设置中,有如下的容:

@ IN SOA ns.domain1.com. root.ns.domian1.com. (
2000103001 ; serial
0 ; refresh
0 ; retry
0 ; expire
0 ; default_ttl
)
@ IN NS ns.domian1.com.
@ IN MX 10 mail.domian1.com.
@ IN A 210.112.11.200
..
...
mail IN A 210.112.11.200

@ IN A 210.112.11.200表示当按照一般的域名查询(非MX查询,而是A查询)domain1.com时,返回解析地址为210.112.11.200,而mail.doamin1.com也解析为210.112.11.200。,