1. 介绍
1.1. 什么是qmail?
qmail是一个因特网邮件传送代理, (英文: Mail Transfer Agent, 简写为MTA, 译者注) 它运行在UNIX兼容系统下, 是一个直接代替UNIX下 Sendmail软件的邮件传送程序. qmail 使用简单报文传送代理协议 SMTP 传输邮件(Simple Mail Transfer Protocol).
1.2. 相关的软件包
qmail遵循经典UNIX哲学: 每个软件工具都要有专一的, 规范良好的功能; 而复杂的功能应该由一系列多个独立的简单工具联合完成, 形成一个"流水线"模式. 另外一种方式是在更为简单的工具上不断的建立和丰富越来越复杂的的功能来完成大量的复杂的功能.
qmail并没有拥有所有人要求的任意功能, 这点并不令人惊奇惊奇. 相反的, qmail拥有的是一些实现那些功能的流行的插件(add-ons). 当然了, 许多标准UNIX实用工具也都可以作为插件和qmail协同工作. 下面介绍一些插件:
? dot-forward --一个兼容Sendmail的.forward控制文件的插件
? fastforward -- 一个兼容Sendmail别名数据库的插件
? UCspi-tcp -- 一个inetd超级服务器的替换程序
? daemontools -- 一个治理后台服务程序以及日志的工具套件
? qmailanalog -- 一个qmail日志文件分析工具套件
? serialmail -- 用于低速网络邮件传送的工具
? mess822 -- 剖析因特网邮件的工具
? ezmlm -- 一个基于qmail的治理邮件列表的工具
1.3. 环境预备
首先你要确定的是你有编译程序的必要的工具. 如何确定取决于你使用的UNIX变种. 虽然不能保证可靠, 但最简单的断定方式就是去试.
注重: 下面任何一个测试通过了, 你都可以停下来直接跳到下一节.
? 在计算机的命令提示行下, 敲入 cc 然后回车.
$ cc
cc: No input files specified
$
? 假如你得到类似上面的反应, 表明你的缺省搜索访问路径上有一个可用的C编译器. 假如没有类似反应, 也不意味着你必然没安装任何C编译器. 也有可能那个编译器不在你的缺省搜索访问路径上, 当然, 也有可能你根本没有编译器. 接着来试这几个命令:
o /usr/bin/cc
o /usr/bin/gcc
o /usr/local/bin/cc
o /usr/local/bin/gcc
o /usr/ccs/bin/cc
? 假如他们中间没有一个命令起作用, 你可能要多试点和平台有关的命令啦. 在命令提示符下, 区别于你使用的平台不同, 分别敲入以下命令:
o 对于 Red Hat Linux, 使用: rpm -qa grep gcc 或者 rpm -qa grep egcs
o 对于 FreeBSD: 默认安装已经包括了GCC编译器.
? 假如你找不到编译器, 你必须确定它的位置或者安装一个. 请联络你的操作系统销售商或者操作系统技术支持.
1.4. 软件预备
qmail-1.03.tar.gz
qmail-103.patch
qmail-1_03_errno.patch
qmail-1_03_qmail_local.patch
ucspi-tcp-0.88.tar
ucspi-tcp-0_88_errno.patch
ucspi-tcp-0_88_nobase.patch
ucspi-tcp-0_88_a_record.patch
daemontools-0.76.tar.gz
daemontools-0_76_errno.patch
checkpassWord-0.90.tar
checkpassword-0_90_errno.patch
2. qmail安装
2.1. 解压发行包
用root用户进入linux
[root@test /]# mkdir ?p /usr/local/src/
把qmail-1.03.tar.gz, ucspi-tcp-0.88.tar.gz复制到/usr/local/src/目录下并解压.
[root@test /]# cd /usr/local/src
[root@test src]# gunzip qmail-1.03.tar.gz
[root@test src]# tar XPf qmail-1.03.tar
[root@test src]# gunzip ucspi-tcp-0.88.tar.gz
[root@test src]# tar xpf ucspi-tcp-0.88.tar
[root@test src]# mkdir -p /package
把daemontools-0.76.tar.gz复制到/package目录下并解压.
[root@test /]# cd /package
[root@test package]# gunzip daemontools-0.76.tar.gz
[root@test package]# tar xpf daemontools-0.76.tar.gz
那么, 现在应该有下面几个目录
/usr/local/src/qmail-1.03,
/usr/local/src/ucspi-tcp-0.88,
和 /package/admin/daemontools-0.76.
2.2. 建立目录
qmail安装程序会自行创建需要的子目录, 你只需要创建qmail的"home"目录.
mkdir /var/qmail
然后直达下一节. 注重: 假如你想把qmail的全部或者部分文件安装到除了/var的其他地方, 可以在/var/qmail下建立软链接到其他位置.
举个例子, qmail配置文件可以存放在/etc/qmail下面, 如下操作:
mkdir /etc/qmail
ln -s /etc/qmail /var/qmail/control
2.3. 创建用户和组
[root@test /]# /usr/sbin/groupadd nofiles
[root@test /]# /usr/sbin/useradd -g nofiles -d /var/qmail/alias -s /bin/false alias
[root@test /]# /usr/sbin/useradd -g nofiles -d /var/qmail -s /bin/false qmaild
[root@test /]# /usr/sbin/useradd -g nofiles -d /var/qmail -s /bin/false qmaill
[root@test /]# /usr/sbin/useradd -g nofiles -d /var/qmail -s /bin/false qmailp
[root@test /]# /usr/sbin/groupadd qmail
[root@test /]# /usr/sbin/useradd -g qmail -d /var/qmail -s /bin/false qmailq
[root@test /]# /usr/sbin/useradd -g qmail -d /var/qmail -s /bin/false qmailr
[root@test /]# /usr/sbin/useradd -g qmail -d /var/qmail -s /bin/false qmails
下一步,编辑/etc/passwd文件,在文件尾部增加下面这些行:
alias:*:7790:2108::/var/qmail/alias:/bin/true
qmaild:*:7791:2108::/var/qmail:/bin/true
qmaill:*:7792:2108::/var/qmail:/bin/true
qmailp:*:7793:2108::/var/qmail:/bin/true
qmailq:*:7794:2107::/var/qmail:/bin/true
qmailr:*:7795:2107::/var/qmail:/bin/true
qmails:*:7796:2107::/var/qmail:/bin/true
注重: 首先确定7790-7796这些未被占用以及和刚才上面编辑的2107, 2108是同一个组id. 假如任意一个用户ID(UID)被占用, 必须选用其他未被占用的用户id.
2.4. 对qmail打补丁
[root@test qmail-1.03]# patch ?p1 < qmail-103.patch
[root@test qmail-1.03]# patch ?p1 < qmail-1_03_errno.patch
[root@test qmail-1.03]# patch ?p1 < qmail-1_03_qmail_local.patch
2.5. 编译安装
进入/usr/local/src/qmail-1.03目录
[root@test qmail-1.03]# make setup check
注重: 假如编译出现的错误"errono"是未定义的,可能是你的qmail-1_03_errno.patch补丁没打或补丁错误
这个编译完成之后, 你需要作一些安装后配置工作.
假如你的DNS配置恰当, 这个脚本就是你要的.
./config
假如由于某些原因config不能在DNS找到你的主机名, 你就必须运行config-fast脚本: (这个原因一般来说是由于config在dns反查主机IP对应的规范的主机名时候没有记录或者出错造成的. 现代商业dns一般都不提供IP反查. 译者注)
./config-fast the.full.hostname
举个例子, 假如你的域名是test.com, 你的计算机的主机名是test, 你的config-fast行应该这样写:
./config-fast test.test.com
注重: 你可能计划在小型本地局域网使用假域名比如"local", 举例来说, 假如你的主机名是"mash", 你可能要用 ./config-fast mash.local , 假如你这样作了, 要确定配置qmail在返回地址上使用了合乎逻辑的因特网域名.
qmail现在已经安装到你的系统内, 并且预备运行了! 下一节将要介绍运行和测试qmail.
3. ucspi-tcp安装
3.1. 对ucspi-tcp打补丁
进入ucspi-tcp目录
[root@test /]#cd /usr/local/src/ucspi-tcp-0.88
[root@test ucspi-tcp-0.88]# patch ?p1 < ucspi-tcp-0_88_errno.patch
[root@test ucspi-tcp-0.88]# patch ?p1 < ucspi-tcp-0_88_nobase.patch
[root@test ucspi-tcp-0.88]# patch ?p1 < ucspi-tcp-0_88_a_record.patch
3.2. 编译安装
[root@test ucspi-tcp-0.88]# make
[root@test ucspi-tcp-0.88]# make setup check
ucspi-tcp安装完毕.
4. daemontools安装
4.1. 对daemontools打补丁
进入daemontools安装目录
[root@test /]# cd /package/admin/daemontools-0.76
[root@test daemontools-0.76]# patch ?p1 < daemontools-0_76_errno.patch
4.2. 编译安装
[root@test daemontools-0.76]# package/install
daemontools安装完毕.
注重: 修改/etc/inittab文件,在文件最后加上下面一行:
SV:123456:respawn:/command/svscanboot
5. 运行qmail
5.1. /var/qmail/rc
用你的编辑器将上面的脚本保存为 /var/qmail/rc
注重: 这个脚本使用了反引号(`), 而不是单引号('). 最好拷贝和粘贴上文的脚本而不是自己键盘输入, 后者轻易出错.
然后执行下面这些命令:
chmod 755 /var/qmail/rc
mkdir /var/log/qmail
现在你需要决定一下不是由.qmail 文件传送的邮件的默认传输方式, 下面的列表大致阐述了几种一般性的选择:
邮箱格式 名称 保存位置 缺省的传输方式 注释
mbox Mailbox $HOME ./Mailbox 最常见的格式, 大多数MUA都可以正确识别
maildir Maildir $HOME ./Maildir/ 更可靠, MUA支持较少
mbox username /var/spool/mail 参见 INSTALL.vsm文件 传统的UNIX邮箱
选择缺省的邮箱格式, 只要选择上表里面的"缺省传输方式"的值, 填写到/var/qmail/control/defaultdelivery里面就可以了. 例如, 选择标准的qmail /Mailbox 传送格式, 这样作就行了:
echo ./Maildir >/var/qmail/control/defaultdelivery
我们这里也采用这样的邮箱格式.
注重: defaultdelivery并不是标准的qmail控制文件. 而是上文/var/qmail/rc 文件的要素. 对于qmail-start来说, defaultdelivery 变量 只是在没有实际的 .qmail 文件指定传送指令的情况下作为 .qmail 文件的内容出现的. 加上这个指令就不必再引用shell元字符, 避免了出现多行杂乱的命令参数.
.qmail文件作成.
echo ./Maildir/ >/home/liuping/.qmail
maildir 是 Dan Bernstein 为了表明 mbox 邮箱格式的缺陷而创造的格式. 一个 maildir 邮箱包含三个子目录, new, cur, 和 tmp. 在各个子目录下的每个邮件根据状态的不同分别存储在各个子目录下独立的文件中. 未读邮件存储在new中, cur存储已读邮件, tmp 是为那些正在传送过程中的邮件使用的. maildir 的man手册页具体描述了maildir格式的细节.
maildir 格式的优点之一就是保证邮件传输的安全, 即使在不锁定情况下, 不同邮件代理同时更新邮件, 也能保证传输的可靠. 这意味着maildir 邮箱可以安全的建立在以NFS性质挂接的文件系统上.
例如:
./Maildir/
这个设置表示将把邮件存储在 $HOME/Maildir 下面的 maildir 格式的邮箱.
注重: qmail-local 可以将邮件传送到 maildir 格式邮箱, 但是不能创建这种邮箱. 你需要使用qmail 附带的maildirmake 程序来创建 maildir 格式邮箱. 例如: "maildirmake ~/Maildir". 不过要确定你使用maildir的拥有者运行maildirmake, 而不是 root 用户. 另外的方式, 你的 useradd 和 adduser 命令可能支持"skeleton"骨架目录, 例如: /etc/skel, 然后可以直接复制这个目录给所有新用户.
5.2. 系统启动文件
5.2.1. qmailctl脚本
假如你手动执行/varqmail/rc 脚本, qmail只会部分被运行起来. 可是我们希望希望每次系统启动后, qmail都能自动被启动; 每次系统停止时候qmail自动被关闭.
创建一个如下的 /var/qmail/bin/qmailctl 文件可以完成这个愿望:
将上面这个qmailctl 脚本设置为可执行脚本, 然后链接到你的用户执行程序目录:
chmod 755 /var/qmail/bin/qmailctl
ln -s /var/qmail/bin/qmailctl /usr/bin
5.2.2. supervise脚本
为 qmail 的服务创建 supervise 目录
mkdir -p /var/qmail/supervise/qmail-send/log
mkdir -p /var/qmail/supervise/qmail-smtpd/log
建立 /var/qmail/supervise/qmail-send/run 文件
建立 /var/qmail/supervise/qmail-send/log/run 文件:
建立 /var/qmail/supervise/qmail-smtpd/run 文件:
注重: concurrencyincoming并不是标准的qmail控制文件. 它是上面脚本的一个要素. 并且, 第一个LOCAL 行上面的是"破折号 + 数字1", 下面的tcpserver行上的参数是"破折号 + 小写字母l" . (由于英文小写字母l和数字1轻易混淆, 原作者特意补充的注重事项. 由译者将被提到两行修改成为红色. 这也是为什么作者希望读者直接拷贝脚本而不是自行输入避免脚本出错的主要原因之一. 译者注)
建立concurrencyincoming 控制文件.
echo 20 > /var/qmail/control/concurrencyincoming
chmod 644 /var/qmail/control/concurrencyincoming
建立 /var/qmail/supervise/qmail-smtpd/log/run 文件
将各个run文件设置为可执行文件:
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
然后建立log文件目录:
mkdir -p /var/log/qmail/smtpd
chown qmaill /var/log/qmail /var/log/qmail/smtpd
最后, 建立 supervise 目录到 /service 目录的链接:
ln -s /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /service
/service 目录是 daemontools 安装时建立的目录.
注重: 建立这个链接之后 qmail 系统会很快自动被启动起来, 假如你还不想马上运行qmail, 运行下面这个,命令来停止qmail:
qmailctl stop
5.2.3. SMTP访问控制
答应本地主机通过SMTP方式发送邮件:
echo '127.:allow,RELAYCLIENT=""' >>/etc/tcp.smtp
qmailctl cdb
5.3. 停止并且禁用(其他)已经安装的MTA
虽然有可能同时运行qmail和现存的MTA, 比如Sendmail, 不过我建议你除非你知道自己到底在干什么. 否则, 我可不建议你这么干. 其实, 说实话, 假如你正在读我这段话, 你可能也不知道自己在干嘛. :-)
假如现存的MTA是Sendmail, 你应该能利用运行Sendmail的init.d脚本的"stop"参数来停止它的运行. 例如下面命令中的一个可能是有效的:
/etc/init.d/sendmail stop
/sbin/init.d/sendmail stop
/etc/rc.d/init.d/sendmail stop
假如你找不到任何一个init.d/sendmail 下的脚本, 你可以用 "ps -efgrep sendmail" 或者 "ps wauxgrep sendmail" 命令找出 sendmail 的PID, 然后用下面的命令来停止Sendmail: (kill 命令加上Sendmail的PID作参数, 译者注)
kill PID-of-sendmail
假如你的MTA不是Sendmail, 检查相关文档找出正确的停止MTA的方法.
你应该考虑一下把旧的MTA彻底的从你的系统里面删除. 至少禁用它的 init.d 脚本, 防止下一次系统重启动的时候旧的MTA也被试图重启.
对于使用rpm方式安装Sendmail的 Red Hat Linux, 执行下面的命令来删除Sendmail:
rpm -e --nodeps sendmail
检查一下没有其他程序在监听SMTP服务端口(25). 旧的MTA, inetd, 或者 xinetd 等程序都有可能造成问题. (按照以上步骤执行后, 再) 运行下面的命令应该是没有输出结果的(除非这个时候 qmail-smtpd 服务也在运行).
netstat -a grep smtp
假如有什么程序在运行, 首先确定不是qmail, 那么先运行下面的命令:
qmailctl stop
然后重复 netstat 检查:
netstat -a grep smtp
假如你还是能看到这个命令有一些输出, 你就必须在qmail 的SMTP服务运行起来之前把肇事程序找出来.
最后, 将现存的 /usr/lib/sendmail 替代为 qmail 版本.
mv /usr/lib/sendmail /usr/lib/sendmail.old # 忽略错误提示 ignore errors
mv /usr/sbin/sendmail /usr/sbin/sendmail.old # 忽略错误提示 ignore errors
chmod 0 /usr/lib/sendmail.old /usr/sbin/sendmail.old # 忽略错误提示 ignore errors
ln -s /var/qmail/bin/sendmail /usr/lib
ln -s /var/qmail/bin/sendmail /usr/sbin
注重: 创建 sendmail 的链接是很重要的, 即使不管以前的MTA, sendmail 命令也是一个会被很多程序调用来发送邮件的重要命令.
5.4. 建立系统别名
在所有 qmail 安装上面都要建立三个系统别名:
别名 使用目的
postmaster RFC 2821 标准要求, 指向邮件系统治理员(也就是你)
mailer-daemon 反弹邮件事实上的标准接收者
root 转发根(root)用户的邮件给系统治理者
建立这些系统别名, 取决于你想让这些邮件发送到哪里(一个本地用户或者一个远程地址)并且适当的创建一个.qmail 文件集合. 举个例子, 加入你想让本地用户 dave 接收发给系统治理员和邮件治理员的邮件, 就这么作:
echo liuping > /var/qmail/alias/.qmail-root
echo liup > /var/qmail/alias/.qmail-postmaster
echo liup > /var/qmail/alias/.qmail-mailer-daemon
ln -s .qmail-postmaster /var/qmail/alias/.qmail-mailer-daemon
chmod 644 /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster
这里的bob或adam是系统治理员的普通用户帐号。qmail在接收到一个发给用户user1的信件,qmail-local则首先寻找名为user1的用户,若没有找到,qmail-local将去查询是否有名字为user1的别名用户,若有则发信给user1对应的真正用户。其中别名是通过在/var/qmail/alias中定义的
在 INSTALL.alias 文件里面有更具体的细节. See INSTALL.alias for more details
5.5. 运行qmail
假如依照上文, 你创建 /service 之后就停止了qmail, 你现在应该重新启动 qmail:
qmailctl start
5.6. 测试安装
qmail 现在应该是正在运行的状态. 首先运行 qmailctl stat 来检验那些服务启动并运行中:
[root@test /]# cd /var/qmail/bin/
[root@test bin]# qmailctl stat
/service/qmail-send: up (pid 3240) 493 seconds
/service/qmail-send/log: up (pid 3243) 493 seconds
/service/qmail-smtpd: up (pid 4151) 319 seconds
/service/qmail-smtpd/log: up (pid 3247) 493 seconds
messages in queue: 0
messages in queue but not yet preprocessed: 0
所有的四个服务都应该是"up"(启动了)1秒钟以上. 假如不是这样, 你可能就是在写脚本的时候写错了一些东西或者你漏过了创建一个甚至多个必要的文件, 目录或者链接. 返回上面的安装指导, 一步一步的再检查一下你的工作. 你也可以下载并运行 inst_check 脚本, 在这里下载 http://lifewithqmail.org/inst_check.
运行inst_check时假如出现以下错误
! Couldn't find SV entry in inittab
'! svscan /service' doesn't seem to be running
要先运行以下命令
在/etc/inittab中加入 SV:123456:respawn:/command/svscanboot
在下面?句放到shell中并?行.
/command/svc -dx /service/* /service/*/log
测试发信:
echo 1111111111 /var/qmail/bin/sendmail liuping@test.test.com
在/home/liuping/Maildir/new下可以查看邮件
6. ezmlm
6.1. ezmlm安装
以下执行步骤最好成绩不要颠倒
gzip ?d ezmlm-0.53.tar.gz
tar xf ezmlm-0.53.tar
gzip ?d ezmlm-idx-0.40.tar.gz
tar xf ezmlm-idx-0.40.tar
cp -R ezmlm-idx-0.40/* ezmlm-0.53/
6.2. 对ezmlm打补丁
patch < idx.patch
patch < ezmlm-idx-0_53_400_unified_41.patch
6.3. ezmlm使用
创建列表:
/usr/local/bin/ezmlm/ezmlm-make /list/maillist /list/.qmail-testlist maillist test.test.com
添加一个邮件地址到邮件列表:
cd /usr/local/bin/ezmlm/
./ezmlm-sub /list/maillist liup@test.test.com
查看邮件列表中的邮件地址:
./ezmlm-list /list/maillist
用邮件列表发送邮件:
echo AAAAAAAABBBBBBBBCCCCCCCCCC ./ezmlm-send /list/maillist/
附件:1144760411966qmail.doc(210K)