分享
 
 
 

qmail-ldapHOWTO

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

wind<wind@sd163.net>

9/16/2002

Ver2.0

--------------------------------------------------------------------------------

本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: wind@iwebmail.net

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文件就可以了。

这样wind@iwebmail.net用户就可以进行收发电子邮件了。如果不成功的话,那么就需要每一步进行推敲,具体哪儿出的问题需要慢慢测试,请多看各软件包的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”,另一用户wind@iwebmail.com用户名需填写 “wind@iwebmail.com”,除此之外没有其它区别!

添加虚拟域用户的方法:

如: 我们需要填加虚拟域iwebmail.com的用户

则iwebmail.ldif文件内容如下:

dn: ou=iwebmail.com, dc=iwebmail.net

objectClass: top

objectClass: organizationalUnit

ou: iwebmail.com

description: iwebmail.com

用户ldif文件内容如下:

dn: cn=wind@iwebmail.com, ou=iwebmail.com, dc=iwebmail.net

cn: wind@iwebmail.com

sn: wind@iwebmail.com

objectClass: top

objectClass: person

objectClass: inetOrgPerson

objectClass: qmailUser

deliveryMode: normal

qmailDotMode: both

mail: wind@iwebmail.com

mailHost: iwebmail.com

mailMessageStore: /vmail/iwebmail.com/wind

uid: wind@iwebmail.com

accountStatus: active

userPassword: passwd

把这两件文件分别导入LDAP库就可以产生wind@iwebmail.com这个用户了!

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,用户可以自己更改。

致谢

在此特别感谢我老婆以及dongli、lhl、尚玉辉和许许多多在linuxforum、linuxaid和QQ上给了我无私帮助朋友们。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有