1、简介
本文对文献[1][2]的方案进行了扩充改进,组建了一个商业级的虚拟域邮件系统。主要增加了webmail和用户注册管理、磁盘限额等功能,改进了邮箱管理,解决了原sendmail用户平稳升级等问题。经实际检验,该方案实用,功能强大,可供构建或升级邮件系统借鉴。
操作系统:FreeBSD4.8 数据库:Mysql3.23
SMTP代理:Postfix2 SMTP认证:Cyrus-Sasl2
Web邮件:OpenWebmail POP3:vm-pop3
认证模块:pam-mysql auth_mysql
2、用户表结构字段名 类别 值 说明 相关程序 user char(20) lily 用户账号 pam owm pop3 name char(30) test user 用户全名 owm passwd char(60) 密码 pam owm pop uid int(5) 2000 用户ID postfix owm gid int(5) 2000 组ID postfix owm home char(60) /vhost/lily 用户目录 owm addr char(60) lily@test.com 邮件地址 postfix mbox char(20) lily 邮箱名 postfix owm status int(3) 1 状态 可选
3、安装和配置
3.1软件安装注意事项
这里没有给出完整的安装方法。本文所用软件均可用ports安装,安装过程很简单,只需在/usr/ports中找到相应软件,然后执行make install。详细的安装和测试方法见参考文献[1][2][3]。补充说明:
(1)安装FreeBSD时请选择安装cvsup,另外/var分区用于保存邮件队列,需要10G以上空间,并创建一个/vhost分区用作保存用户主目录。
(2)安装pam-mysql前需要安装gmake。pam-mysql安装时需要修改pam_mysql.c的源代码,删除第54行#define DEBUG。完装完后将/usr/local/lib/pam_mysql.so拷贝到/usr/local/lib/目录中。
(3)vm-pop3在安装后,需在/etc/inetd.conf添加一行:
3.2认证模块配置
3.2.1 创建数据库并添加数据
(1)创建数据库mail: create database mail;
(2)创建用户数据表mailuser:请根据表1用create table语句创建。
(3)添加用户以数据
(4)创建一个mysql系统用户mailsys,密码为batman,并限制只能本地访问。pam、postfix和openwebmail需要用mailsys用户访问数据库。
3.2.2 配置pam
在pam配置文件(/etc/pam.conf)添加如下两行:
vm-pop3d auth required pam_mysql.so user=mailsys passwd=batman host=localhost db=mail table=mailuser usercolumn=user passwdcolumn=passwd crypt=1 sqllog=0
sqllog没有出现在在readme中,是从其网站中查到的。
3.2.3 配置postfix
(1)主配置文件/usr/local/etc/postfix/postfix.conf
virtual_mailbox_base = /var/mail #用户邮箱目录
virtual_mailbox_domains = test.com #虚拟域名
virtual_uid_maps = static:2000 #用户ID
virtual_gid_maps = static:2000 #组ID
virtual_mailbox_maps=mysql:/usr/local/etc/postfix/mailbox.cf #用户邮箱映射文件
virtual_mailbox_limit = 10000000 #限制/var/mail中用户的邮箱大小为10M
broken_sasl_auth_clients = yes # SMTP认证
smtpd_sasl_auth_enable = yes #使用SMTP认证
smtpd_sasl_security_options = noanonymous #禁止匿名用户
mynetworks=192.168.0.0/24 , 127.0.0.0/8 #IP地址范围
smtpd_recipient_restrictions=permit_sasl_authenticated permit_mynetworks permit_auth_destination reject
(2)邮箱映射文件/usr/local/etc/postfix/mailbox.cf
user = mailsys #数据库系统用户名
password = batman #密码
dbname = mail #数据库名
table = mailuser #用户表
select_field =mbox #用户邮箱。见表1说明
where_field =addr #where查询字段
3.2.4 配置openwebmail
(1)mysql用户认证配置,/www/cgi-bin/openwebmail/auth_mysql.pl
my $sqlusr = “mailsys”; #数据库系统用户名
my $sqlpwd = “batman”; #密码
my $auth_db = “mail”; #数据库名
my $auth_table = “mailuser”; #用户表
my $field_username = “user”; #用户名
my $field_password = “passwd”; #密码
my $field_realname = “name”; #用户全名
my $field_uid = “uid”; #用户ID
my $field_gid = “gid”; #组ID
my $field_home = “home”; #用户主目录
my $pass_type = “crypt”; #密码格式为DES加密
smtpauth yes #发信需要SMTP认证
mailspooldir /var/mail #用户邮箱所在目录
use_syshomedir yes #用户邮件保存在用户主目录
create_syshomedir yes #自动创建用户主目录(/vhost/xxx)
quota_module quota_du.pl #磁盘限额模块
quota_limit 30000 #用户主目录磁盘上限30M
spool_limit 10000 #收件箱上限10M /var/mail
(3)openwebmail的smtp认证配置文件,/www/cgi-bin/openwebmail/etc/smthauth.conf
smtpauth_password smtp_auth #密码
4、用PHP实现用户的注册和管理
我们这里只给出修改用户密码的PHP代码,其它功能模块的实现与下面程序类似,只需修改相应的mysql语句即可。
$conn=mysql_connect("localhost","mailsys","batman") or die("连接失败");
mysql_select_db(“mail”,$conn);
$mypass=crypt(“$pass”); //密码用DES加密
$sql=”update mailuser set passwd=”$mypass” where user=”.$user””;
$result=mysql_query($sql,$conn);
mysql_close_db(“mail”,$conn); ?>
[1] Powerplane, Postfix + Cyrus-SASL + Cyrus-IMAPD + PgSQL HOWTO [J/OL]:
http://www.cnfug.org/journal/5/02.html , 2003-09-06.
[2] Postfix-Cyrus-Web-cyradm-HOWTO:
http://www.delouw.ch/linux/Postfix-Cyrus-Web-cyradm-HOWTO/html/index.html
[3] openwebmail readme:
http://turtle.ee.ncku.edu.tw/openwebmail/doc/readme.txt
,
pop3 stream tcp nowait root /usr/local/sbin/vm-pop3d vm-pop3d
INSERT INTO mailuser(user,name,uid,gid,passwd,home,mbox,addr) VALUES (lily,test user,2000,2000,*****,/vhost/lily, lily,lily@test.com);
注:密码是经过crypt函数加密,我是用vipw拷过来的,尚不知道如何从命令行生成,请网友帮忙解决一下。GRANT ALL ON mail.* TO mailsys@localhost IDENTIFIED BY batman;
smtp auth required pam_mysql.so user=mailsys passwd=batman host=localhost db=mail table=mailuser usercolumn=user passwdcolumn=passwd crypt=1 sqllog=0
注:smtp和vm-pop3d使用pam_mysql.so模块进行认证。后面的参数为账号所在数据库、表等信息。crypt=1是使用des加密。sqllog=0是不在日志文件记录sql查询语句。virtual_transport = virtual #虚拟域设置
注:为了减轻查询工作量,用户ID和组ID是静态的。可以模仿virtual_mailbox_maps将其改为动态的。考虑到一些邮件系统基于IP地址范围限制用户使用SMTP服务,为了平稳过渡,使用了mynetworks和permit_mynetworks参数。hosts = localhost #数据库所在主机
my $SQLHost = “localhost”; #数据库所在主机
(2)openwebmail主配置文件,/www/cgi-bin/openwebmail/etc/openwebmail.confauth_module auth_mysql.pl #认证模块名
注:openwebmail提供了两种磁盘模块quota_unixfs.pl和quota_du.pl。使用quota_unixfs.pl不支持虚拟用户。smtpauth_username owm #用户名
注:openwebmail系统的SMTP认证不够完善,它将配置文件中的用户名和密码提交给SMTP用户认证程序。还不能直接使用邮件用户自己的用户名和密码。可参考4.2.1节第3点的方法将用户owm添加到mailuser表中。