QMAIL LDAP HOWTO
本HOWTO详细完整地介绍了如何用qmail和openldap构建一个高性能的、高可用性的、大容量的、可分布式的邮件系统。
由于整套系统对初涉及此领域的朋友来说是非常复杂的,涉及到了许多方面的相关知识,同时由于每人的系统的差异性,所以需要读者有比较扎实的至少以下几个方面的知识:
基本的网络知识
tcp/ip协议族的几个成员:smtp、pop3、http
Linux基本操作知识
*nix的知识,本HOWTO是基于Redhat Linux 7.1完成的,同时经过测试的OS有FreeBSD4.3、FreeBSD4.4、RH6.1、RH6.2,同时我认为本HOWTO完全可以应用于其它的Unix和类Unix系统上
qmail知识
qmail是本系统的MTA(Message Transfer Agent 邮件传输代理)
openldap知识
openldap是本系统的LDAP服务器,用于存放用户信息和进行用户验证
--------------------------------------------------------------------------------
目录
本HOWTO的最新版本
简要介绍和本HOWTO的约定
2.1 简介
2.2 约定
2.2.1 域名
2.2.2 关键用户
2.2.3 uid和gid
2.2.4 搜索路径
2.2.5 软件需求
2.2.6 硬盘和分区
2.2.7 命令行格式
其它可用资源
关于qmail-ldap系统的一些整体常识
4.1 qmail
4.2 openldap
4.3 qmail-ldap-patch
4.4 ucspi-tcp
4.5 daemontools
4.6 sqwebmail
4.7 phpQLAdmin
4.8 EnderUNIX QLDAPAdmin
关于LDAP的配置方法
5.1 关于openldap
5.2 关于openldap的schema
安装过程
6.1 准备系统
6.1.1 安装Linux
6.1.2 准备安装目录和用户
6.1.3 设定目录权限
6.2 解压软件包和打qmail的ldap patch
6.3 编辑Makefile
6.4 编译安装
6.5 配置openldap
6.6 配置qmail
6.6.1 基本~control/配置文件
6.6.2 创建自动建立Maildir的文件
6.6.3 qmail启动文件
6.7 安装ucspi-tcp-0.88
6.8 安装daemontools-0.76
6.9 创建qmail、smtp和pop3服务的启动脚本
6.10 添加邮件用户和测试系统
关于qmail-ldap系统的程序
7.1. qmail-queue
7.2. qmail-send
7.3. qmail-lspawn
7.4. qmail-local
7.5. qmail-rspawn
7.6. qmail-remote
7.7. qmail-inject
7.8. qmail-smtpd
7.9. qmail-qmqpd
7.10. qmail-popup
7.11. qmail-pop3d
7.12. auth_pop
7.13. auth_imap
7.14. qmail-ldaplookup
7.15. sendmail
高级服务配置实例
8.1. 多域名支持
8.2. imap 服务
8.3. webmail 系统
其它的附加patch
9.1 SMTP AUTH
9.2 qmail-ldap-control
9.3 RBL Tagging
cluster(分布式)
10.1 分布邮件服务器的原理
10.2 分布式邮件服务器的实现方式
10.3 可能产生的问题
一般问题
11.1 共享库问题
11.2 权限问题
11.3 不能连接LDAP服务器问题
致谢
本HOWTO的最新版本
本Howto的最新可用版本可从http://qldap.126.com处获得。注:上面的网址是不可用的,我没有任何计划再发布新的版本了(2003.7.31)!
简要介绍和本HOWTO的约定
2.1 简介
本Howto只简要地介绍了如何在一个Linux系统中安装qmail+ldap,不涉及qmail和openldap的原理方面的知识,因为它们每一个都可以写一本书的,本Howto只在关键和容易出现问题的地方做了一下说明。
2.2 约定
本Howto为了方便做以下约定:
2.2.1 域名:
对邮件系统来说域名是至关重要的域名使用iwebmail.net,DNS已经做好解析,IP地址是61.156.28.35;本Howto完全支持多域名。
2.2.2 关键用户:
由于权限问题,整个系统中使用ldap做为运行openldap,用vmail作为拥有用户Maildir的用户;
2.2.3 uid和gid:
本系统中所有用到的用户uid和gid都在添加用户时指定;
2.2.4 搜索路径:
我的系统设置了搜索路径所以我直接用useradd、tcpserver等,一般的系统需要使用/usr/sbin/useradd、/usr/local/bin/tcpserver等来写,也就是说要加上全路径。
2.2.5 软件需求:
操作系统使用redhat Linux 7.1完全安装;
qmail使用qmail-1.03.tar.gz;
openldap使用redhat7.2自带的openldap-2.0.7;
qmail-ldap patch使用最新的qmail-ldap-1.03-20011001a.patch.gz;
ucspi-tcp使用ucspi-tcp-0.88.tar.gz;
daemontools使用daemontools-0.76.tar.gz;
phpQLAdmin使用phpQLAdmin-1.1.tar.gz;
EnderUNIX QLDAPAdmin使用qldapadmin-0.40-BETA.tar.gz。
2.2.6 硬盘及分区的建议:
如果做一个互联网的大容量邮件服务器,至少要用SCSI硬盘,推荐使用RAID,以提高可用性和性能。
建议Linux的/、/boot、/usr、/home、/var、/tmp、/vmail进行单独分区,全部采用ext3日志分区格式。
每一个分区都要分配足够的空间,建议值:
/ 2G
/boot 100M
/usr 4.5G
/home 4G
/var 4G
/tmp 2G
SWAP分区看实际情况,一般分内存的两倍
/data 4G 此分区存放openldap的数据,应根据邮件服务器的容量来确定大小,做分布式系统时可以使用专门的LDAP服务器来实现,不用此分区,在第10小节中详细介绍。
/vmail >=36G 此分区存放用户信件,所以多多益善,如果做分布式系统时可以使用专门的存储服务器和NFS来实现,可以不分区,在第10小节中详细介绍。
2.2.7 命令行格式:
本Howto的命令行全部以$或#开头,换句话说,只要是以$或#号开头的行就是命令行,$开头的是以普通用户执行的,#开头的是以root用户执行的。
其它可用资源
书籍:
关于qmail可以看《qmail实用技术指南》清华大学出版社出版,Linuxforum上推荐过,写的不错的。
关于openldap到目前为止还没有发现好的中文书籍,只好看http://www.openldap.org了。:(
网站:
http://cr.yp.to/qmail.html
qmail的老家,当然值得看;
http://www.openldap.org
openldap的老家,上面有许多关于ldap的资料;
http://www.nrg4u.com/qmail/QLDAPINSTALL
qmail-ldap的官方安装文档;
http://www.lifewithqmail.org/ldap
号称qmail圣经的lifewithqmail的qmail-ldap文档;
http://www.linuxforum.net/doc/webmail.html
这是我所见的国内最早的qmail-ldap的文档(本人见识浅薄),也是我的qmail-ldap启蒙文章,本人在看了这篇文章后,才明白做一个可分布式的基于qmail的邮件系统的整体架构的;
http://www.linuxforum.net/doc/ldap-qmail.html
LDAP应用概述与qmail+LDAP安装配置
http://www.linuxaid.com.cn/solution/showsol.jsp?i=290
Qmail+LDAP安装配置实例
http://www.linuxforum.net/doc/qmail-shangyh.html
分布式的Qmail邮件系统
http://phpx.hn.org/show.php?d=faqos&i=14
ldap+qmail+postaci 安装, 用户管理
http://go1.163.com/linuxmail/
hleil(lhl)的qmail+vpopmail+mysql+sqwebmail的Howto,虽然与ldap无关,但是个人认为是国内最好的qmail+vpopmail+mysql文档,看一下对提高对整个系统的认识是非常有好处的。
关于qmail-ldap系统的一些整体常识
4.1 qmail
qmail是可以完全替代Sendmail-binmail体系的新一代UNIX邮件系统,它是一个基于UNIX操作系统的Internet邮件传输代理(Internet Mail Transfer Agent 简称MTA)。它采用标准的简单邮件传输协议(Simple Mail Transfer Protocol 简称SMTP)与Internet上其他MTA交换信息。为了解决用户邮件存储问题,Qmail提出了Maildir存储方式,每个邮件作为单独的一个文件保存在用户个人的邮件目录下,这就避免了加锁。同时,Qmail支持虚拟域(Virtual Domain)和虚拟用户(Virtual User),使邮件系统的用户独立于UNIX系统用户。当前在国内许多流行的免费电子邮件系统都是使用的基于Qmail作为基本服务器软件,采用NFS网络文件系统作为用户邮件存储空间,使用Maildir作为邮件存储格式,提供多级目录以支持大规模和超大规模的用户数。
qmail的特点:
安全----Qmail将Mail处理过程分为多个过程,尽力避免用root用户运行.同时Qmail禁止对特权用户(root,deamon等)直接发信.
可靠----Qmail的直接投递保证Email在投递过程中不会丢失.Qmail同时支持新的更可靠的信箱格式Maildir,保证系统在突然崩溃情况下不至破坏整个信箱.
高效----在运行于奔腾的BSD/OS上,Qmail每天可以轻松的投递200000封信件.
简单----Qmail要比其他的Internet Mail系统小得多.Qmail通过统一的向前机制完成forwarding,alias和maillist等功能,Qmail使用简单高效队列来处理投递.Qmail-smtpd可以由inetd启动,节省了一定资源.
4.2 openldap
LDAP的英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。现在LDAP技术不仅发展得很快而且也是激动人心的。在企业范围内实现LDAP可以让运行在几乎所有计算机平台上的所有的应用程序从LDAP目录中获取信息。LDAP目录中可以存储各种类型的数据:电子邮件地址、邮件路由信息、人力资源数据、公用密匙、联系人列表,等等。通过把LDAP目录作为系统集成中的一个重要环节,可以简化员工在企业内部查询信息的步骤,甚至连主要的数据源都可以放在任何地方。
LDAP协议是跨平台的和标准的协议,因此应用程序就不用为LDAP目录放在什么样的服务器上操心了。实际上,LDAP得到了业界的广泛认可,因为它是Internet的标准。产商都很愿意在产品中加入对LDAP的支持,因为他们根本不用考虑另一端(客户端或服务端)是怎么样的。LDAP服务器可以是任何一个开发源代码或商用的LDAP目录服务器(或者还可能是具有LDAP界面的关系型数据库),因为可以用同样的协议、客户端连接软件包和查询命令与LDAP服务器进行交互。与LDAP不同的是,如果软件产商想在软件产品中集成对DBMS的支持,那么通常都要对每一个数据库服务器单独定制。不象很多商用的关系型数据库,你不必为LDAP的每一个客户端连接或许可协议付费,大多数的LDAP服务器安装起来很简单,也容易维护和优化。
openldap是一个开放源代码的LDAP项目,我们完全可以尽量使用开源软件达到最佳的整体应用效果!
4.3 qmail-ldap-patch
qmail-ldap-patch简单说来是一个qmail的patch,是把qmail和LDAP服务器整合起来的粘合剂。
4.4 ucspi-tcp
ucspi-tcp是djb写的一个基于TCP协议的UNIX客户端/服务器程序接口;它可以为服务器/客户端定义非常详细的环境变量。
ucspi-tcp有以下三个最主要的程序:
tcpserver
可以代替inetd/xinetd来对应用程序提供服务,不同的是一个tcpserver只能提供一个服务。
tcprules
编译控制规则并生成cdb数据库文件。
tcpclient
一个客户程序助手,功能是与一个远程服务器建立网络连接,并把连接传给另外一个应用程序。
4.5 daemontools
由于运行一个qmail服务器需要管理服务程序,Daemontools就是一个为了方便监控和管理服务的程序包。
有以下几个主要程序:
supervise是daemontools的核心程序,用来监控以后台进程运行的程序。如果一个进程死掉了,supervise将试图重新启动它。
svscan程序可以用来使用一条命令启动多个服务,而不必发出多个supervise命令。
svc程序是对进程进行控制的程序。可以停止、暂停、继续、挂起进程。
multilog是一个可以代替logger(创建日志的一个Unix程序)程序的替代品。作者说,它比logger更安全,效率更高。
4.6 sqwebmail
sqwebmail是一个C语言写的高可用性的邮件WEB端,只是界面不够漂亮,不过功能强大,读者如果有较好的C语言定制能力的话,完全可以改写出来一个功能强大、界面美观、性能优异的基于qmail-ldap的WEBMAIL系统。
4.7 phpQLAdmin
phpQLAdmin是一个PHP语言写的基于浏览器的qmail-ldap管理工具,需要qmail-ldap-control支持。
4.8 EnderUNIX QLDAPAdmin
EnderUNIX QLDAPAdmin是一个命令行的qmail-ldap管理工具。
关于LDAP的配置方法
5.1 关于openldap
OpenLDAP是一套基于LDAP(轻量目录访问协议)服务器工具包。
包括的工具有:
slapd - 独立的LDAP服务器软件
slurpd - 独立的LDAP复制服务器软件
LDAP协议库函数
工具包
客户端软件
因为我们的目的是使用开放源代码软件来做一个大容量的MAIL系统,所以我们选择openldap,其实完全可以使用netscape的directory server或Oracle的ldap服务器,理论上性能要比openldap好,不过我们没有进行专业的测试,无法确定。不过,无论如何使用openldap只要cluster,系统支持数百万用户是没有问题的。
5.2 关于openldap的schema
要让qmail能和openldap服务器共同整合服务,必须对qmail、openldap进行专门配置。对于openldap来说,1.x版和2.x版是不一样的。我们只讨论2.x版的配置。
编辑/etc/openldap/slapd.conf文件,在最后一个include后加入以下行:
include /etc/openldap/schema/qmail.schema
详细过程看第6节。
安装过程
6.1 准备系统
6.1.1 安装Linux:
完全安装Redhat linux 7.2。
6.1.2 准备安装目录和用户
创建目录
#mkdir /var/qmail
#mkdir /var/backup
添加qmail用户:
#groupadd -g 1100 vmail
#useradd -u 1100 -g vmail vmail
#groupadd -g 1101 nofiles
#useradd -u 1101 -g nofiles -d /var/qmail/alias alias
#useradd -u 1102 -g nofiles -d /var/qmail qmaild
#useradd -u 1103 -g nofiles -d /var/qmail qmaill
#useradd -u 1104 -g nofiles -d /var/qmail qmailp
#groupadd -g 1102 qmail
#useradd -u 1105 -g qmail -d /var/qmail qmailq
#useradd -u 1106 -g qmail -d /var/qmail qmailr
#useradd -u 1107 -g qmail -d /var/qmail qmails
6.1.3 设定目录权限:
#chmod -R 700 /vmail
#chown -R vmail:vmail /vmail
#chmod -R 700 /data
#chown -R ldap:ldap /data
6.2 解压软件包和打qmail的ldap patch
#cd /home/wind '到主目录,已经把所有需要的软件包传到此处了。
#tar zxvf qmail-1.03.tar.gz
#gunzip qmail-ldap-1.03-20011001a.patch.gz
#cd qmail-1.03
#patch -p1 < ../qmail-ldap-1.03-20011001a.patch
6.3 编辑Makefile
#vi Makefile
编辑Makefile文件,修改如下:
修改"#LDAPFLAGS=-DQLDAP_CLUSTER"成"LDAPFLAGS=-DQLDAP_CLUSTER -DCLEARTEXTPASSWD";
修改"LDAPLIBS=-L/usr/local/lib -lldap -llber"成"LDAPLIBS=-L/usr/lib -lldap -llber";
修改"LDAPINCLUDES=-I/usr/local/include"成"LDAPINCLUDES=-I/usr/include";
修改"#TLSON=-DTLS",去掉前面的#;
修改"#TLSINCLUDES=-I/usr/local/include"成"TLSINCLUDES=-I/usr/include";
修改"#TLSLIBS=-L/usr/local/lib -lssl -lcrypto"成"TLSLIBS=-L/usr/lib -lssl -lcrypto";
修改"#OPENSSLBIN=/usr/local/bin/openssl"成"OPENSSLBIN=/usr/bin/openssl";
修改"#MDIRMAKE=-DAUTOMAILDIRMAKE"成"MDIRMAKE=-DAUTOMAILDIRMAKE";
修改"#HDIRMAKE=-DAUTOHOMEDIRMAKE"成"HDIRMAKE=-DAUTOHOMEDIRMAKE";
修改"BACKUPPATH=/backup/qmail-backup/qmail-ldap.`date "+%Y%m%d-%H%M"`.tar"成"BACKUPPATH=/var/backup/qmail-ldap.`date "+%Y%m%d-%H%M"`.tar";
6.4 编译安装
#make setup check
6.5 配置openldap并启动openldap
#cp /home/wind/qmail-1.03/qmail.schema /etc/openldap/schema/
#vi /etc/openldap/slapd.conf
在最后一个include后加入这一行:include /etc/openldap/schema/qmail.schema;
修改suffix "dc=my-domain,dc=com"成suffix "dc=iwebmail.net";
修改rootdn "cn=Manager,dc=my-domain,dc=com"成rootdn "cn=root,dc=iwebmail.net";
修改# rootpw secret成rootpw password;
修改directory /var/lib/ldap成directory /data;
加入以下行:
access to *
by self read
by self write
by dn="cn=root,dc=iwebmail.net" write
by dn="cn=root,dc=iwebmail.net" read
by * none
把index那两行换成:
index objectClass eq
index mail pres,eq,sub
index mailAlternateAddress eq
index uid eq
index cn pres,eq,sub
然后保存退出。
#/etc/init.d/ldap start
#netstat -na | grep LIST
看有没有在监听389端口,有的话就说明LDAP服务正常启动了。
6.6 配置qmail
6.6.1 基本~control配置文件
#cd /var/qmail/control
#echo > badmailfrom
#echo > badrcptto
#echo master > bouncefrom
#echo 5120 > bouncemaxbytes
#echo 40 > concurrencylocal
#echo 40 > concurrencyremote
#echo '如有任何问题请联系我们,感谢使用iWebMail邮件系统,http://www.iwebmail.net' > custombouncetext
#echo 5242880 > databytes
#echo 'iwebmail.net'> defaultdomain
#echo /var/qmail/bin/createhomedir > dirmaker
#echo 'dc=iwebmail.net'> ldapbasedn
#echo 0 > ldapcluster
#echo ldaponly > ldapdefaultdotmode
#echo '10485760S,500C'> ldapdefaultquota
#echo 1100 > ldapgid
#echo 0 > ldaplocaldelivery
#echo 'cn=root,dc=iwebmail.net'> ldaplogin
#echo '/vmail'> ldapmessagestore
#echo '*' > ldapobjectclass
#echo 'password'> ldappassword
#echo 0 > ldaprebind
#echo '127.0.0.1'> ldapserver
#echo 60 > ldaptimeout
#echo 1100 > ldapuid
#echo 'iwebmail.net'> locals
#echo 10 > maxrcptcount
#echo 'iwebmail.net'> me
#echo 'iwebmail.net' > plusdomain
#echo 21600 > queuelifetime
#echo '您的硬盘空间已满,请尽快清理您的信件。' > quotawarning
#echo 'iwebmail.net' > rcpthosts
#echo 'iWebMail System 2.0' > smtpgreeting
#echo 5 > tarpitcount
#echo 5 > tarpitdelay
#echo 60 > timeoutconnect
#echo 120 > timeoutremote
#echo 120 > timeoutsmtpd
#cd ~alias
#touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
6.6.2 创建自动建立Maildir的文件
#echo '#!/bin/sh' > /var/qmail/bin/createhomedir
#echo 'mkdir -m 700 -p $1' >> /var/qmail/bin/createhomedir
#chmod +x /var/qmail/bin/createhomedir
6.6.3 qmail启动文件
#cp /var/qmail/boot/home /var/qmail/rc
#vi /var/qmail/rc
修改"qmail-start ./Mailbox splogger qmail"成"qmail-start ./Maildir/"
#chmod +x /var/qmail/rc
6.6.4 创建relay规则文件/etc/tcp.smtp
#echo '127.0.0.1:allow,RELAYCLIENT=""' > /etc/tcp.smtp
#echo '61.156.28.35:allow,RELAYCILENT=""' >> /etc/tcp.smtp
#echo '' > /etc/tcp.pop3
6.7 安装ucspi-tcp-0.88
#cd /home/wind
#tar zxvf ucspi-tcp-0.88.tar.gz
#cd ucspi-tcp-0.88
#make
#make setup check
6.8 安装daemontools-0.76
#mkdir -p /package
#chmod 1755 /package
#cd /package
#cp /home/wind/daemontools-0.76.tar.gz ./
#tar zxvf daemontools-0.76.tar.gz
#cd admin/daemontools-0.76
#package/install
6.9 创建qmail-send、smtp和pop3服务的启动脚本
#tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
#tcprules /etc/tcp.pop3.cdb /etc/tcp.pop3.tmp < /etc/tcp.pop3
#chmod 644 /etc/tcp.smtp.cdb
#chmod 644 /etc/tcp.pop3.cdb
#mkdir /var/qmail/supervise
#mkdir /var/qmail/supervise/qmail-send
#mkdir /var/qmail/supervise/qmail-smtpd
#mkdir /var/qmail/supervise/qmail-pop3d
#chmod +t /var/qmail/supervise/qmail-send
#chmod +t /var/qmail/supervise/qmail-smtpd
#chmod +t /var/qmail/supervise/qmail-pop3d
#mkdir /var/qmail/supervise/qmail-send/log
#mkdir /var/qmail/supervise/qmail-smtpd/log
#mkdir /var/qmail/supervise/qmail-pop3d/log
#vi /var/qmail/supervise/qmail-send/run
内容如下:
#!/bin/sh
exec /var/qmail/rc
#vi /var/qmail/supervise/qmail-smtpd/run
内容如下:
#!/bin/sh
# /usr/local/bin/softlimit -m 2048000 /
exec tcpserver -H -R -v -c 150 -x /etc/tcp.smtp.cdb -u 1102 -g 1101 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
#vi /var/qmail/supervise/qmail-pop3d/run
内容如下:
#!/bin/sh
# /usr/local/bin/softlimit -m 2048000 /
exec tcpserver -H -R -v -c 150 -x /etc/tcp.pop3.cdb 0 pop3 /var/qmail/bin/qmail-popup iwebmail.net /
/var/qmail/bin/auth_pop /var/qmail/bin/qmail-pop3d Maildir 2>&1
#vi /var/qmail/supervise/qmail-send/log/run
内容如下:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t '+*' s102400000 n7 /
/var/log/qmail/qmail-send 2>&1
#vi /var/qmail/supervise/qmail-smtpd/log/run
内容如下:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t '+*' s102400000 n7 /
/var/log/qmail/qmail-smtpd 2>&1
#vi /var/qmail/supervise/qmail-pop3d/log/run
内容如下:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t '+*' s102400000 n7 /
/var/log/qmail/qmail-pop3d 2>&1
把以上文件设置可执行权限
#chmod 755 /var/qmail/supervise/qmail-send/run
#chmod 755 /var/qmail/supervise/qmail-send/log/run
#chmod 755 /var/qmail/supervise/qmail-smtpd/run
#chmod 755 /var/qmail/supervise/qmail-smtpd/log/run
#chmod 755 /var/qmail/supervise/qmail-pop3d/run
#chmod 755 /var/qmail/supervise/qmail-pop3d/log/run
创建完以上目录和文件后用以下命令做链接:
#ln -s /var/qmail/supervise/qmail-send /service/qmail-send
#ln -s /var/qmail/supervise/qmail-smtpd /service/qmail-smtpd
#ln -s /var/qmail/supervise/qmail-pop3d /service/qmail-pop3d
下面创建日志目录,这样我们就拥有了强大的日志记载功能:
#mkdir /var/log/qmail
#mkdir /var/log/qmail/qmail-send
#mkdir /var/log/qmail/qmail-smtpd
#mkdir /var/log/qmail/qmail-pop3d
#chown -R qmaill:nofiles /var/log/qmail
为了便于管理,我们使用三个启动脚本来实现整个系统的启动,分别负责qmail服务、smtp服务的和pop3服务的启动、停止、重启等
下面就是我改编的三个服务的脚本,分别是:
qmail-send、qmail-smtpd、qmail-pop3d
只要把它们分别拷贝到/etc/init.d/下就可以了,可以使用/etc/init.d/qmail-send start/stop来启动/停止qmail-send,其它两个服务也一样。
这三个脚本需要supervise进程的支持,因为在6.8节中安装daemontools时,系统已经把启动/service的命令加入了/etc/inittab文件的最后一行,并已经启动了/service,所以这时候正常情况下三种服务已经全部启动了。用ps -aux应该可以看到许多关于qmail的进程应该如下:
/bin/sh /command/svscanboot
svscan /service
readproctitle service errors: .......................................
supervise qmail-send
supervise log
supervise qmail-smtpd
qmail-send
/usr/local/bin/multilog t +* s102400000 n7 /var/log/qmail/qmail-send
tcpserver -p -H -R -c 200 -x /etc/tcp.smtp.cdb -u 1102 -g 1101 0 smtp
qmail-lspawn ./Maildir/
qmail-rspawn
qmail-clean
supervise log
supervise qmail-pop3d
supervise log
/usr/local/bin/multilog t +* s102400000 n7 /var/log/qmail/qmail-smtpd
tcpserver -H -R -v -c 200 0 pop3 /var/qmail/bin/qmail-popup mail.jnin
/usr/local/bin/multilog t +* s102400000 n7 /var/log/qmail/qmail-pop3d
用netstat -na | grep LIST应该可以看到25和110的监听端口。
如果不正常的话,那么就编辑/etc/inittab文件,把最后的一行注释掉。然后
#kill -HUP 1
再分别调试/service下的三个服务。如有问题请仔细理解http://www.lifewithqmail.org/lwq.html和http://cr.yp.to/daemontools.html,或者也可以不用daemontools,而直接用手动启动服务。分别是:
#csh -cf "/var/qmail/rc &"
#tcpserver -p -H -R -c 200 -x /etc/tcp.smtp.cdb -u 1102 -g 1101 0 smtp /var/qmail/bin/qmail-smtpd 2>&1 &
#tcpserver -H -R -v -c 200 0 pop3 /var/qmail/bin/qmail-popup iwebmail.net /var/qmail/bin/auth_pop /var/qmail/bin/qmail-pop3d Maildir 2>&1 &
分别启动qmail、smtp、pop3服务。
6.10 添加邮件用户和测试系统
在服务器上创建一个root.ldif文件,内容如下:
dn: dc=iwebmail.net
objectClass: inetOrgPerson
sn: root
cn: root
wind.ldif内容如下:
dn: cn=wind,dc=iwebmail.net
cn: wind
sn: wind
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: qmailUser
deliveryMode: normal
qmailDotMode: both
mail: [email protected]
mailHost: iwebmail.net
mailMessageStore: /vmail/wind
uid: wind
accountStatus: active
userPassword: passwd
然后用下面的命令往LDAP中添加数据:
#ldapadd -x -D"cn=root,dc=iwebmail.net" -w password -f user.ldif
这样就添加了一个wind用户。注意:user.ldif的第一部分一个根,第二部分才是真正的第一个用户。再添加其它用户时,只要建立第二个部分样式的ldif文件就可以了。
这样[email protected]用户就可以进行收发电子邮件了。如果不成功的话,那么就需要每一步进行推敲,具体哪儿出的问题需要慢慢测试,请多看各软件包的README或INSTALL文档。
关于qmail-ldap系统的程序
7.1. qmail-queue
qmail-queue程序用来处理来自于qmail-inject和qmail-smtpd程序的邮件消息,并将他们转移到一个邮件队列中等待发送,当qmail-queue处理这些消息时,它会扫描发送方和接受方地址。Qmail-queue等待如下特定格式的发送方和接受方信息的出现:发送方地址前面以一个F字符开头,以一个NULL(空)字符结束。每一个接收方地址以一个T字符开头,以一个NULL(空)字符结束。接收方列表的最后用一个额外的NULL(空)字符指明。按照RFC 822标准,qmail-queue程序总是把恰当的Received:头加到邮件消息头中。
7.2. qmail-send
一旦消息成功进入邮件队列中,qmail-send程序将被调用来处理该消息,qmail-send检查邮件队列中每一个消息的状态。在前一次邮件发送尝试中失败的消息被标识出来,并对它们进行判断,看它们是处于一个暂时的还是永久的发送失败状态。处于暂时发送失败状态里的消息将被再一次发出,而处于永久失败状态里的邮件消息将被投递给qmail-clean程序进行删除。这样,这些没有发送的消息都能够继续转发。qmail-send使用了qmail-lspawn和qmail-rspawn程序,任何带有确定接收方为本地服务器的邮件消息都被传送给qmail-lspawn。任何带有确定接收方为远程邮件服务器的邮件消息都被传送给qmail-rspawn程序。一旦消息被地送到这两个程序中的任何一个,qmail-send就算完成了它的任务。
7.3. qmail-lspawn
qmail-lspawn程序是用来调度本地邮件系统上的邮件投递进程的。qmail-lsapwn命令的格式如下:
qmail-lsawpn defaultdelivery
其中defaultdelivery是用来标识投递本地邮件系统上的邮件消息的必要的命令。
7.4. qmail-local
qmail-local是被qmail用来江消息投递给邮件服务器上一个本地用户的,qmail-local的命令格式如下:
qmail-local [-nN] user homedir local dash ext domain sender defaultdelivery
其中user是本地的用户名,homedir是用户的主目录,local和domain是合并起来用来生成用户邮件地址的,dash和ext是用来定义任何用户使用的.qmail的配置文件的,sender是消息信封的发送者,defaultdelivery是任何本地用来投递邮件消息的必要的指令。
7.5. qmail-rspawn
qmail-rspawn程序是被qmail-send调用的,它用在将消息传递给远程邮件服务器上的用户,qmail-rspawn程序试图调度消息以便通过qmail-remote程序投递,然后异步激活qmail-remote程序。qmail-rspawn的一个任务是为每一个消息的接收方判断目的邮件服务器。qmail-remote为每一个远程目的主机调用一次。
7.6. qmail-remote
qmail-remote程序总是把邮件消息投送给远程目的邮件主机的。Qmail-remote命令的格式如下:
qmail-remote host sender recip [recip…]
其中,host是远程邮件服务器的主机名,sender是发送方信封的地址,recip是在远程主机上应该接收消息的用户名。Qmail-remote是用了smtp协议来把邮件消息传输给远程邮件主机。
7.7. qmail-inject
qmail-inject程序是把新的消息插入到邮件队列中去的,qmail-inject命令的格式是:
qmail-inject -[nNaAhH] [-fsender] [recip…]
其中sender是传送给qmail-queue的信封上的发送方地址,recip是该消息的接收方,下表描述了qmail-inject的选项:
-a 将消息发送给命令行上列出的全部接收方
-A 将消息发送给所有列出的接收方,如果没有列出接收方,发送该消息给所有的消息头里的接收方
-h 将消息发送给所有的在消息头里的接收方
-H 将消息发送给所有在消息头里的接收方和所有在命令行上的列出者
7.8. qmail-smtpd
qmail-smtpd程序监听来自远程邮件服务器的网络连接请求。并使用简单邮件传输协议smtp来接收邮件消息,并将这些消息传送给qmail-queue程序去插入到qmail邮件队列中。
7.9. qmail-qmqpd
qmail-qmqpd程序监听来自远程邮件服务器的网络连接请求。并使用简单邮件传输协议qmtp来接收邮件消息。
7.10. qmail-popup
qmail-popup程序是用在于qmail-pop3d程序的连接上的。Qmail-popup程序在激活qmail-pop3d之前,验证pop3连接的pop用户ID和密码。1mail-popup程序能够使用user-pass的无格式认证或者APOP的加密认证机制。
7.11. qmail-pop3d
qmail-pop3d程序是一个pop3服务器程序的qmail版本,它允许远程客户端使用pop协议连接到qmail邮件服务器并阅读他们邮箱中的消息,这个程序只能工作在qmail的Maildir邮箱格式下。
7.12. auth_pop
POP3的验证模块
7.13. auth_imap
IMAP的验证模块
7.14. qmail-ldaplookup
用户和密码查询程序
7.15. sendmail
sendmail是qmail用来取代标准的sendmail程序的,因为sendmail程序在过去已经变得非常流行,以至于大多数MUA程序都使用它来向外转发邮件消息,通过将消息和接收方地址传递给sendmail程序,MUA能够不用提供MTA代码就能包含MTA功能。
配置实例
8.1. 多域名支持
其实qmail-ldap系统的多域名实现是很简单的,在邮件系统中的多域环境中 ,第一个域称为主域 ,其它域为虚拟域,主域和虚拟域用户在使用上是有区别的,区别在于:主域用户使用POP3接收邮件时用户名只要填写其用户名就可以了,而虚拟域用户则必须填写整个邮件地址,如:一用户wind@iwebmail为主域用户,则只需填写“wind”,另一用户[email protected]用户名需填写“[email protected]”,除此之外没有其它区别!
添加虚拟域用户的方法:
如: 我们需要填加虚拟域iwebmail.com的用户
则iwebmail.ldif文件内容如下:
dn: ou=iwebmail.com, dc=iwebmail.net
objectClass: top
objectClass: organizationalUnit
ou: iwebmail.com
description: iwebmail.com
用户ldif文件内容如下:
dn: [email protected], ou=iwebmail.com, dc=iwebmail.net
cn: <a href="mailto:[email protected]">[email protected]</a>
sn: <a href="mailto:[email protected]">[email protected]</a>
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: qmailUser
deliveryMode: normal
qmailDotMode: both
mail: <a href="mailto:[email protected]">[email protected]</a>
mailHost: iwebmail.com
mailMessageStore: /vmail/iwebmail.com/wind
uid: <a href="mailto:[email protected]">[email protected]">[email protected]</a>
sn: <a href="mailto:[email protected]">[email protected]</a>
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: qmailUser
deliveryMode: normal
qmailDotMode: both
mail: <a href="mailto:[email protected]">[email protected]</a>
mailHost: iwebmail.com
mailMessageStore: /vmail/iwebmail.com/wind
uid: <a href="mailto:[email protected]</a>
accountStatus: active
userPassword: passwd
把这两件文件分别导入LDAP库就可以产生[email protected]这个用户了!
8.2 imap 服务
8.3 webmail 系统
其它的附加patch
9.1 SMTP AUTH
增加了SMTP验证的功能,使用方法:
在打完ldap的补丁后,patch -p1 < ../smtp-auth-xx-xx.patch
然后再编译就可以了,此patch增加了一个程序:
auth_smtp
功能即为SMTP启动时的验证模块,/var/qmail/supervise/qmail-smtpd/run文件内容变为:
#!/bin/sh
# /usr/local/bin/softlimit -m 2048000 /
exec tcpserver -H -R -v -c 150 -x /etc/tcp.smtp.cdb -u 1102 -g 1101 0 smtp /var/qmail/bin/qmail-smtpd /
/var/qmail/bin/auth_smtp /usr/bin/true 2>&1
9.2 qmail-ldap-control
9.3 RBL Tagging
cluster(分布式)
10.1 分布邮件服务器的原理
10.2 分布式邮件服务器的实现方式
10.3 可能产生的问题
一般问题
11.1 共享库问题
11.2 权限问题
11.3 不能连接LDAP服务器问题
本HowTo中LDAP服务器用的dc=iwebmail.net作为BASEDN,用户可以自己更改。