【IT168 服务器学院】一、安装环境:
本系统为:Red Hat Linux----Advanced Server release 2.1AS
二、安装qmail
本次采用源代码形式安装
2.1、下载源代码(如下面地址不能下载,请到其它网址下载)
* qmail: ftp://cr.yp.to/software/qmail-1.03.tar.gz
* ucspi-tcp: ftp://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
* daemontools: ftp://cr.yp.to/daemontools/daemontools-0.76.tar.gz
2.2、构建源代码
在命令行提示符下,输入cc和并且敲回车:
# cc //确认是否有C编译器
cc: No input files specified //系统有C编译器
#
2.3、打开源文件包
将qmail放在/usr/local/src目录下,ucspi-tcp 和 daemontools 放在/package目录下。
此时应成为root(超级用户)身份,如不是,执行:
$ su
& umask 022
# mkdir -p /usr/local/src
# mv qmail-1.03.tar.gz ucspi-tcp-0.88.tar.gz /usr/local/src
# mkdir -p /package
# chmod 1755 /package
现在展开源文件包:
# cd /usr/local/src
# gunzip qmail-1.03.tar.gz
# tar xpf qmail-1.03.tar
# gunzip ucspi-tcp-0.88.tar.gz
# tar xpf ucspi-tcp-0.88.tar
# rm *.tar //注释:可选,除非空间紧张
# cd /package
# gunzip daemontools-0.76.tar.gz
# tar xpf daemontools-0.76.tar
# rm *.tar // 注释:同上
现在源文件的目录路径为 /usr/local/src/qmail-1.03, /usr/local/src/ucspi-tcp-0.88, 和 /package/admin/daemontools-0.76.
2.4、创建目录
# mkdir/var/qmail
注:由于qmail的安装程序将会创建所需要的子目录,所以仅仅需要创建qmail的“主”文件夹就行了
2.5、创建用户和组
编辑/etc/group
追加下列2行在文件的末尾:
qmail:*:2107:
nofiles:*:2108:
注:确认2107和2108不已经被使用。
如果他们已经被使用,请选其他不被使用的数字。
编辑/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号。
如果这些UID的某一个已经被使用,选不正被使用的数字。
2.6、开始构建
切换到/usr/local/src/qmail-1.03目录下:
# cd /usr/local/src/qmail-1.03
现在输入下面命令就行了:
# make setup check
在编译完后,需要配置邮件。
提供了两个脚本使得这工作更简单。
如果DNS已经配置好了,则输入下面命令就行了:
# ./config
如果由于某种原因配置文件不能在域名服务器(DNS)中发现主机名称,则必须与运行config-fast脚本程序:
# ./config-fast test.example.com //本主机名
现在qmail被安装在系统上了!
2.7、安装ucspi-tcp
现在切换目录到ucspi-tcp文件夹:
# cd /usr/local/src/ucspi-tcp-0.88
接着,做:
# make
# make setup check
就这样,ucspi-tcp被成功安装。
2.8、安装daemontools
改变目录到文件夹daemontools:
# cd /package/admin/daemontools-0.76
接着,做:
# package/install
用 "ps -ef | grep svscan" 或 "ps waux | grep svscan" 来验证svscan是否运行。
2.9、运行qmail
2.9.1、/var/qmail/rc
用编辑器在把下面的内容写入/var/qmail/rc:
#!/bin/sh
# Using stdout for logging
# Using control/defaultdelivery from qmail-local to deliver messages by default
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start "`cat /var/qmail/control/defaultdelivery`"
然后执行命令:
# chmod 755 /var/qmail/rc
# mkdir /var/log/qmail
现在,除了.qmail文件方式,你要选择你缺省的邮件接收方式。下面的表格是一些常用的选择:
邮箱格式 名字 位置 缺省的运送点 备注
mbox Mailbox $HOME ./Mailbox 最常用,可与大多数MUA''s一起运转
maildir Maildir $HOME ./Maildir/ 更可靠,MUA支持较少
mbox username /var/spool/mail 参见INSTALL.vsm 传统UNIX邮箱
更多信息参见:INSTALL.mbox,INSTALL.maildir,INSTALL.vsm。
为了选择缺省的邮箱类型,只要把defaultdelivery的值写入/var/qmail/control/defaultdelivery就可以了。例如,选择标准qmail邮箱,那么:
echo ./Mailbox >/var/qmail/control/defaultdelivery
注意:defaultdelivery并不是qmail的控制文件,而是上面/var/qmail/rc文件的部分。
2.9.2、系统启动文件
2.9.2.1. qmail的启动脚本
如果是手动执行/var/qmail/rc脚本,qmail可能只是部分时间启动,而我们需要一旦系统启动,qmail就可以自动的无时不刻的运行,系统挂起时,我们需要qmail被干净利索的关闭。
下面是一个成功的实现这个目的的脚本(用编辑器将下面代码写入/var/qmail/bin/qmailctl):
#!/bin/sh
PATH=/var/qmail/bin:/usr/local/bin:/usr/bin:/bin
export PATH
case "$1" in
start)
echo -n "Starting qmail: svscan"
cd /var/qmail/supervise
env - PATH="$PATH" svscan &
echo $! > /var/run/svscan.pid
echo "."
;;
stop)
echo -n "Stopping qmail: svscan"
kill `cat /var/run/svscan.pid`
echo -n " qmail"
svc -dx /var/qmail/supervise/*
echo -n " logging"
svc -dx /var/qmail/supervise/*/log
echo "."
;;
stat)
cd /var/qmail/supervise
svstat * */log
;;
doqueue|alrm)
echo "Sending ALRM signal to qmail-send."
svc -a /var/qmail/supervise/qmail-send
;;
queue)
qmail-qstat
qmail-qread
;;
reload|hup)
echo "Sending HUP signal to qmail-send."
svc -h /var/qmail/supervise/qmail-send
;;
pause)
echo "Pausing qmail-send"
svc -p /var/qmail/supervise/qmail-send
echo "Pausing qmail-smtpd"
svc -p /var/qmail/supervise/qmail-smtpd
;;
cont)
echo "Continuing qmail-send"
svc -c /var/qmail/supervise/qmail-send
echo "Continuing qmail-smtpd"
svc -c /var/qmail/supervise/qmail-smtpd
;;
restart)
echo "Restarting qmail:"
echo "* Stopping qmail-smtpd."
svc -d /var/qmail/supervise/qmail-smtpd
echo "* Sending qmail-send SIGTERM and restarting."
svc -t /var/qmail/supervise/qmail-send
echo "* Restarting qmail-smtpd."
svc -u /var/qmail/supervise/qmail-smtpd
;;
cdb)
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
chmod 644 /etc/tcp.smtp*
echo "Reloaded /etc/tcp.smtp."
;;
help)
cat < stop -- stops mail service (smtp connections refused, nothing goes out)
start -- starts mail service (smtp connection accepted, mail can go out)
pause -- temporarily stops mail service (connections accepted, nothing leaves)
cont -- continues paused mail service
stat -- displays status of mail service
cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- sends qmail-send ALRM, scheduling queued messages for delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
queue -- shows status of queue
alrm -- same as doqueue
hup -- same as reload
HELP
;;
*)
echo "Usage: $0 {start|stop|restart|doqueue|reload|stat|pause|cont|cdb|queue|help}"
exit 1
;;
esac
exit 0
注意:如果你发现qmail在系统引导之后存在时间很短,在脚本的开始段以nohup前置env命令,例如:
nohup env - PATH="$PATH" svscan &
使脚本能执行,并建立链接,输入下面命令:
# chmod 755 /var/qmail/bin/qmailctl
# ln -s /var/qmail/bin/qmailctl /usr/bin
2.9.2.2、 管理脚本
为管理脚本建立目录:
# mkdir -p /var/qmail/supervise/qmail-send/log
# mkdir -p /var/qmail/supervise/qmail-smtpd/log
# chmod +t /var/qmail/supervise/qmail-send
# chmod +t /var/qmail/supervise/qmail-smtpd
建立/var/qmail/supervise/qmail-send/run文件:
#!/bin/sh
exec /var/qmail/rc
建立/var/qmail/supervise/qmail-send/log/run文件:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail
建立/var/qmail/supervise/qmail-smtpd/run文件:
#!/bin/sh
QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
exec /usr/local/bin/softlimit -m 2000000 \
/usr/local/bin/tcpserver -v -p -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \
-u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
注意:目前建立的脚本并不是标准的qmail控制文件,而是上面的脚本的部分。
注意:是否增加内存的容量取决于操作系统和硬件,可以在软件限量命令下指定内存用量。如果端口25访问失败,或者远程系统不能发送邮件给本系统,试着把内存用量提高到3,000,000到4,000,000。
建立concurrencyincoming控制文件:
# echo 20 > /var/qmail/control/concurrencyincoming
# chmod 644 /var/qmail/control/concurrencyincoming
建立/var/qmail/supervise/qmail-smtpd/log/run文件:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd
修改文件属性,使这些文件可执行:
# 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
2.9.2.3、SMTP存取控制
允许本地主机通过SMTP传送邮件:
# echo ''127.:allow,RELAYCLIENT=""'' >>/etc/tcp.smtp
# /usr/local/sbin/qmail cdb
2.9.3、停止已经安装的MTA并使之失效
尽管同时运行qmail与已经存在的MTA是可能的,比如Sendmail,但并不推荐这么做.
如果已经存在的MTA是Sendmail,可以通过运行在init.d的Sendmail的控制脚本的“stop”参数来终止它的运行。例如,下面中的一个可能在系统上可以运行:
/etc/init.d/sendmail stop
/sbin/init.d/sendmail stop
/etc/rc.d/init.d/sendmail stop
也可以通过如下命令来结束:
ps -ef |grep sendmail
kill PID-of-sendmail
如果系统应用的MTA不是Sendmail,检查一下它的文件找到正确的应该终止的进程。
应该考虑一下,安装qmail之后,是否把原来的旧的MTA完全的卸载并删除,至少禁止init.d下的Sendmail的启动脚本,避免重新引导的时候再次启动。
对于Red Hat Linux,删除Sendmail:
rpm -e --nodeps sendmail
最后,以qmail版本的执行文件代替Sendmail原来的文件:
# mv /usr/lib/sendmail /usr/lib/sendmail.old #忽略错误
# mv /usr/sbin/sendmail /usr/sbin/sendmail.old #忽略错误
# chmod 0 /usr/lib/sendmail.old /usr/sbin/sendmail.old #忽略错误
# ln -s /var/qmail/bin/sendmail /usr/lib
# ln -s /var/qmail/bin/sendmail /usr/sbin
2.9.4、 建立系统别名
在qmail安装中需要三个系统别名:
别名 目的
postmaster RFC 821要求,指出邮件管理员(就是你自己)
mailer-daemon 事实上标准的反弹邮件接收者
root 重定向系统特权账户给系统管理员
建立别名的目的是为了确定邮件的目的地(可以是一个本地用户或者一个远程地址),生成并且转移到合适的.qmail文件中。举个例子,假如本地用户test是操作系统和邮件系统的管理员:
# echo test > /var/qmail/alias/.qmail-root
# echo test > /var/qmail/alias/.qmail-postmaster
# ln -s .qmail-postmaster /var/qmail/alias/.qmail-mailer-daemon
# chmod 644 /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster
细节见INSTALL.alias文件。
2.9.5、启动、停止与重启qmail
# qmailctl start //启动
# qmailctl stop //停止
# qmailctl restart //重启
2.10、测试安装结果
现在,qmail应该已经运行起来了,按照TEST.deliver和TEST.receive的指导检验qmail是否正常运行。
三、配置
3.1、相关的配置文件
除了在~alias中描述的.qmail文件,都在目录/var/qmail/control中。qmail控制帮助里面包括下面的一个表格:
Control Default Used by Purpose
badmailfrom none qmail-smtpd blacklisted From addresses
bouncefrom MAILER-DAEMON qmail-send username of bounce sender
bouncehost me qmail-send hostname of bounce sender
concurrencyincoming none /service/qmail-smtpd/run max simultaneous incoming SMTP connections
concurrencylocal 10 qmail-send max simultaneous local deliveries
concurrencyremote 20 qmail-send max simultaneous remote deliveries
defaultdelivery none /var/qmail/rc default .qmail file
defaultdomain me qmail-inject default domain name
defaulthost me qmail-inject default host name
databytes 0 qmail-smtpd max number of bytes in message (0=no limit)
doublebouncehost me qmail-send host name of double bounce sender
doublebounceto postmaster qmail-send user to receive double bounces
envnoathost me qmail-send default domain for addresses without "@"
helohost me qmail-remote host name used in SMTP HELO command
idhost me qmail-inject host name for Message-ID''s
localiphost me qmail-smtpd name substituted for local IP address
locals me qmail-send domains that we deliver locally
me FQDN of system various default for many control files
morercpthosts none qmail-smtpd secondary rcpthosts database
percenthack none qmail-send domains that can use "%"-style relaying
plusdomain me qmail-inject domain substituted for trailing "+"
qmqpservers none qmail-qmqpc IP addresses of QMQP servers
queuelifetime 604800 qmail-send seconds a message can remain in queue
rcpthosts none qmail-smtpd domains that we accept mail for
smtpgreeting me qmail-smtpd SMTP greeting message
smtproutes none qmail-remote artificial SMTP routes
timeoutconnect 60 qmail-remote how long, in seconds, to wait for SMTP connection
timeoutremote 1200 qmail-remote how long, in seconds, to wait for remote server
timeoutsmtpd 1200 qmail-smtpd how long, in seconds, to wait for SMTP client
virtualdomains none qmail-send virtual domains and users
需要更多特殊控制文件细节,请参看在“Used by”下列出的帮助文件。
3.2、转信
3.2.1、介绍
什么是转信?就是当一个MTA通过SMTP协议接收到一个邮件,但是这个邮件既不是给一个本地地址也不是从一个本地用户发出的。
在没有垃圾邮件的年代,MTA基本都是开放转信的,服务器不加限制的接收任何人发的邮件,也不加限制的传送邮件给任何人。
但是现在的MTA被设置成完全不能转信,或者只能让某些确定可信的用户和系统通过它们转信。
Chris Johnson为qmail的使用者们写了一篇非常棒的文章,我建议你去看一下,地址是http://www.palomine.net/qmail/relaying.html。
3.2.2、禁止转信
如果按照正式的指导安装qmail,缺省情况下转信功能是被关闭的。这是通过locals和virtualdomains(本地主机)下列出的主机名填写/var/qmail/control/rcphosts文件进行的。控制文件rcpthosts的名字来源于SMTP RCPT(接收邮件方)命令。在一个SMTP会话中,RCPT用来确定接收邮件方的地址,然后,列出可以出现在RCPT地址中的有效的主机名。
3.2.2、为特定的地址提供转信
大多数单用户和小的工作组服务器可以设置为完全拒绝转信,但是对于一个分布式的用户社区,必须准许你的用户,而且仅仅是你的用户能利用的你系统转信。这个功能是通过设置RELAYCLIET环境变量,用tcpserver来调用qmail-smtpd实现的,这个功能将越过rcpthosts文件的限制。
如果你是按照这个文档安装qmail的话,缺省情况下,选择性转信功能被激活。给一个客户转信的权利,在/etc/tcp.smtp文件中加入类似这样的内容:
IP address of client:allow,RELAYCLIENT="" (斜体为客户的IP地址)
然后重建SMTP拥有使用权者数据库:
# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
# chmod 644 /etc/tcp.smtp*
如果你是按照正规的指导来安装的,Chris Johnson有一篇关于如何配置qmail的选择转信主机的文章,地址在: http://www.palomine.net/qmail/selectiverelay.html 。
3.3、多主机名
如果你的系统拥有不止一个名字,例如,所有的形如 user@host1.example.com 的地址也可以写作user@example.com或者user@mail.example.com,然后你必须告诉qmail这些,表示qmail可以传送给邮件给本地的地址以及qmail可以从远程主机接收的邮件。
为了做到这一点,需要两个控制文件加上所有的主机名:
??rcpthosts,这个文件记录了qmail-smtpd将那些地址作为接收邮件主机名的
??locals,这个文件记录了qmail-send将传送到那些地址的主机的邮件传送到本地的
3.4、虚拟域名
虚拟域名类似于上一节我们讨论的多主机名,不过他们有本质的不同。首先,如果example.net主持虚拟域名virtual.example.com,一般来说,传送给joe@virtual.example.net的邮件不会在同名地址joe@example.net结束上结束传送过程,名字空间对于每一个虚拟域都是少有的。
对于qmail,虚拟域在virtualdomains文件内配置,由一个或多个入口形如:
user@domainrepend
qmail转换user@domain地址为prepend-user@dmomain,并且将结果domain视为本地地址。user@部分是可选的,如果忽略,入口将对应于all@domain地址
回到我们刚才的example假设中,如果example.net邮件管理员想要创建一个虚拟域virtual.example.com,在virtualdomains文件可能是这样表达的:
virtual.example.com:john
一个发给joe@virtual.example.com的邮件进入系统后将被重写给john-joe@virtual.example.com然后作本地传送。见.qmail节,以及extension addresses分节有更详细的关于john如何管理这个虚拟域的内容。
如果作为多主机名,所有的虚拟域必须在rcpthosts中记录,这样qmail-smtpd才能够接受具有这些目的地址的邮件。不过,不像多主机名,虚拟域不能被加入locals文件。
注意:域名服务器(DNS)的邮件交换(MX)纪录必须设置指向虚拟域到适当的邮件服务器。这是域名服务器管理员的工作,而且超出了我们的介绍范围。
3.5、别名
qmail的标准别名机制是qmail本地传送机制的自然产物。qmail-local传送一个地址为localpart@host的邮件给一个叫做localpart的本地用户。如果没有找到对应用户,邮件将传送给别名用户,这个伪用户在所有的qmail系统上主目录都是/var/qmail/alias。
举个例子,假如你创建了一个叫做info@example.com的别名转发邮件给用户tom。在example.com上,以root用户身份,这样做:
# echo tom > /var/qmail/alias/.qmail-info
.qmail节以及extension addresses分节描述了如何创建.qmail文件,这个文件指定了存在的别名,以及如何处理发给这些别名的邮件。
注意到别名在qmail系统内的工作方式,别名是不能重载一个(同名的)有效用户的传送的。例如,如果rachel是个正常的用户,~alias/.qmail-rachel将是无用的。
在fastforward包内提供了一个可选的别名机制,这个机制将多个别名写入一个单独的文件内,这个文件和Sendmail的别名数据库兼容。
3.6、关于qmail-users
qmail-users是一个分派地址给用户的系统。一系列的配置文件放置在/var/qmail/users下面。分配文件是以一个分配表形式存在。有两种分配方式:逐一方式的和通配符方式。
注意:其中包含一系列的分配,每行一个,紧随一行包括一个点(.)。如果你手工建立分配,不要忘记这个点行。
3.6.1、逐一分配
一个逐一分配看起来是这个样子的:
=address:user:uid:gid:directory:dash:extension:
这意味着传送给address的邮件将以指定的uid和gid,由用户user运行,文件directory/.qmaildashextension确定如何传送邮件的方式来接收邮件的。
3.6.2、通配符分配
一个通配符分配分配看起来是这个样子:
+prefix:user:uid:gid:directory:dashrepend:
这个意味着传送给prefixrest表达式代表的地址的邮件将以指定的uid和gid,由用户user运行,文件directory/.qmaildashprependrest确定如何传送邮件的方式来接收邮件的。
3.6.3、qmail-user程序
qmail-user有两个帮助程序:qmail-newu和qmail-pw2u。
qmail-newu处理分配文件并且在/var/qmail/users下生成常量数据库(CDB)文件叫做cdb。CDB是二进制格式,这样甚至存在几千条分配项的时候,也可以由qmail-lspawn快速访问。
qmail-pw2u转换系统数据库/etc/passwd为一系列适合分配的项。qmail-pw2u应用一批文件修改转换规则。
include: 包含的用户
??exclude: 排除的用户
??mailnames: 可选的“邮件名字”
??subusers: 额外的用户可控制地址,用一个可选的.qmail扩展
??append: 其他分配
注意:如果应用qmail-pw2u,添加用户、删除用户或者改变UID和GID,不要忘记重复运行qmail-pw2u和qmail-newu。
3.7、垃圾邮件控制
Chris Hardie写了一个很不错的qmail反垃圾HOWTO。可以在地址http://www.summersault.com/chris/techno/qmail/qmail-antispam.html访问到。
四、使用方法
这一节包含了qmail的标准使用方法。如果你应用qmail系统收发信件,这里你就能找到相关的qmail的使用用法。
4.1、.qmail文件
邮件的传送通常有一个或者多个”.qmail”(发音dot kyoo mail)文件,这些文件放置在用户的主目录下,文件名以.qmail开始。dot-qmail手册页(man page)描述了具体的用法。
.qmail文件包含了一个传送指令列表,一行一个指令。每行的第一个字符确定是那种传送方式:
字符 传送方式 含义
# 注释 忽略
| program 在shell下运行的命令
/或者. mbox (如果最后一个字符不是一个 /) mbox路径(包括 / 或者 .)
/ or . maildir (如果最后一个字符是一个/) maildir的路径(包括 / 或者 .)
& forward 转发的地址
字母或数字 forward 转发的地址,包括第一个字符
4.1.1、程序传送
当执行一个程序传送的时候,qmail调用一个命令解释器(shell)(/bin/sh)来执行命令。它通过标准输入传送一个引入的邮件的副本给命令。在qmail-command的手册页(man page)有详细的关于这个过程细节的描述。
程序传送非常的强大,可以用来实现大范围的功能比如邮件过滤,自动回复,通过第三方传送代理,如procmail传送邮件。
例如:
??preline /usr/ucb/vacation djb
将使qmail调用preline,转送/usr/ucb/vacation给这个命令,以djb为参数,并且生成一个邮件的副本到标准输入。
4.1.2、mbox 传送
“Mbox”是qmail-speak作为标准UNIX信箱格式,这种格式把多个邮件储存在一个文件里,每个邮件以”Form”开头,开头的一行看起来像一个头,不过这可不是传送代理简单的附加来表示每个邮件在这个文件内部的开始部分的。
例如:
./Mailbox
这个格式把邮件附加到$HOME/Mailbox下,邮件用一个预置的”From”开始。
一个简单的mbox拥有一封邮件的信箱在文件内部看起来是这个样子的:
From user1@example.net Thu May 13 18:34:50 1999
Received: (qmail 1287205 invoked from network); 13 May 1999 18:34:49 -0000
From: user1@example.net
To: user2@example.com
Subject: hey
What''s up?
第一行是qmail在传送过程中加上的。
4.1.3、maildir传送
“Maildir”是由Dan Bernstein为了避免mbox格式的缺点而开发的邮箱格式。一个maildir邮箱包含三个子目录:new,cur和tmp。邮箱里面的每个邮件在哪一个子目录取决于邮件的状态,new是未读邮件,cur是已读邮件,tmp是正在传送中的邮件。maildir的帮助页(man page)有详细的格式描述。
maildir格式的一个优点在于,虽然maildir方式不是应用锁定来保护不同传送代理对邮件的并行更新,它的工作同样可靠,这意味着maildir邮箱能够安全的在NFS文件系统上应用。
例如:
./Maildir/
这个格式把邮件保存到$HOME/Maildir下的maildir格式的邮箱。
注意:qmail-local能够传送邮件到maildir信箱,可是不能创建这种格式的信箱。maildir信箱可以由qmail附带的maildirmake程序创建。例如:“maildirmake ~/Maildir ” 。
4.1.4、forward传送
forward用来重发邮件到指定地址。地址清单在.qmail文件内,并且不能包括注视和额外空间。
下面这些是错误的写法:
&
& user@example.com
&Joe User
正确的应该是这样的:
&user@example.com
user@example.com
&user
前两个将给user@example.com发送一个邮件的副本,最后的发一个副本给本地用户user。
4.1.5、扩展地址
qmail支持用户控制的扩展地址。在基本地址上附加,形如,username@hostname.domain,用户可以用username-extension@hostname.domain来接收邮件。对于剩下的部分,由于动作发生在本地系统上,我们将舍弃”@hostname.domain”部分。
对于username-extension的传送指令在~username/.qmail-extension内部指定。
扩展可以发生在多个地方,例如,dave-list-qmail,由~dave/.qmail-list-qmail控制。这个例子里面,dave-list-qmail定作qmail的邮件列表,而~dave/.qmail-list-qmail归档邮件到另外的邮箱内。
.qmail等文件缺省的情况下可以应用-default。所以dave-list-qmail也被~dave/.qmail-list-default控制。这允许一个控制全局的.qmail文件操作所有的dave-list-whatever(任意的)地址。注意dave-list不会被~dave./qmail-list-default控制,因为在”list”后面没有”-”。
qmail应用最相近匹配查找,例如,当一个发给地址dave-list-qmail的邮件,会按照下面找到的第一个地址发送:
.qmail-l ist-qmail
.qmail-list-default
.qmail-default
如果没有找到匹配的.qmail文件,qmail返回传送失败消息,并反弹邮件给发送者。
4.2、发信
邮件使用者通常不直接应用MTA来发送邮件。典型的,写好邮件并应用邮件用户代理(Mail User Agent,MUA),比如pine或者mutt来发送邮件,然后MUA调用MTA来传送邮件。这个提交到MTA的过程,被称作注入(injection)。
有两种方法将邮件注入MTA:通过简单邮件传送协议,SMTP,或者应用一个MTA支持的程序来完成。
4.2.1、SMTP
MUA能够在本地或者指定的邮件服务器上打开标准SMTP端口25,然后MUA和MTA将开始一个对话,取决于两种可能中的一种:
??邮件正在传送到MTA,或者
??返回给MUA的错误状态
SMTP是没有认证功能的,所以发送邮件不要求用户名和密码,但是,大量的MTA拒绝接受既不是从本地用户发送的,也不是发送给本地用户的邮件。如果这样的邮件被拒收,很有可能是因为转信规则的设置导致的。请参见转信查找具体配置。
4.2.2、/var/qmail/bin/sendmail
Sendmail作为UNIX的MTA有好多年了。它的存在太普遍了,大量的程序员仅仅认定Sendmail为MTA。结果Sendmail的本地诸如机制成为了标准的本地邮件注入(injection)应用程序员接口(Application Programmer’s Interface,API)。qmail和其他的类Sendmail的MTA提供了一个sendmail本地注入程序,和真正的Sendmail的同名程序以相同的方式工作。
qmail的sendmail,一般来说在/var/qmail/bin/sendmail,在qmail通常用来代替Sendmail的sendmail程序。sendmail程序典型的位置包括:
?? /usr/lib/sendmail
?? /usr/sbin/sendmail
在qmail系统里,”ls –l path-to-sendmail”可以看出sendmail是/var/qmail/bin/sendmail的一个符号链接。
$ ls -l /usr/lib/sendmail
lrwxrwxrwx 1 root root 29 Feb 19 11:04 /usr/lib/sendmail -> /var/qmail/bin/sendmail
sendmail的帮助页(man page)提供了qmail下的应用程序。
4.2.3、qmail-inject
除了仿效sendmail API之外,i有自己的注入程序—qmail-inject。实际上,sendmail仅仅是qmail-inject的一个外包装。
作为API,sendmail因为它的广泛的应用,可能更好。qmail的API由qmail-inject提供,只能工作在qmail系统下,不过它和sendmail的界面接口几乎是一样的。
举个例子,发送一个内容为空的邮件给joe@example.com:
# echo To: joe@example.com | /var/qmail/bin/qmail-inject
4.3、环境参数
某些qmail程序设置或者应用了环境变量。下面的表就是这些参数以及描述。
名称 帮助页 设置或应用 目的
DATABYTES qmail-smtpd 应用的 重载control/databytes
DEFAULT qmail-command 设置的 匹配.qmail 文件名内的"-default" 地址部分
DTLINE qmail-command 设置的 Delivered-To报头区域
EXT qmail-command 设置的 地址扩展
EXT2 qmail-command 设置的 在第一个破折号之后的EXT部分
EXT3 qmail-command 设置的 在第二个破折号之后的EXT部分
EXT4 qmail-command 设置的 在第三个破折号之后的EXT部分
HOME qmail-command 设置的 用户主目录
HOST qmail-command 设置的 接收地址的域部分
HOST2 qmail-command 设置的 HOST的最后一个点之前的部分
HOST3 qmail-command 设置的 HOST的倒数第二个点之前的部分
HOST4 qmail-command 设置的 HOST的倒数第三个点之前的部分
LOCAL qmail-command 设置的 接收地址的local 部分
LOGNAME qmail-inject 应用的 在From头部分的用户名(4)
MAILHOST qmail-inject 应用的 在From头部分的主机名(2)
MAILNAME qmail-inject 应用的 在From头部分的人名(2)
MAILUSER qmail-inject 应用的 在From头部分的用户名(2)
NAME qmail-inject 应用的 在From头部分的人名(3)
NEWSENDER qmail-command 设置的 转发的收件人地址(参见 "man dot-qmail")
QMAILDEFAULTDOMAIN qmail-inject 应用的 重载 control/defaultdomain
QMAILDEFAULTHOST qmail-inject 应用的 重载 control/defaulthost
QMAILHOST qmail-inject 应用的 在From头部分的主机名(1)
QMAILIDHOST qmail-inject 应用的 重载 control/idhost
QMAILINJECT qmail-inject 应用?指定不同的选项(参见下一个表)
QMAILMFTFILE qmail-inject 应用的 File containing list of mailing list addresses for Mail-Followup-To generation
QMAILNAME qmail-inject 应用的 指定不同的选项(参见下一个表)
QMAILPLUSDOMAIN qmail-inject 应用的 重载 control/plusdomain
QMAILSHOST qmail-inject 应用的 信封上的发件人地址的主机名
QMAILSUSER qmail-inject 应用的 信封上的发件人地址的用户名
QMAILUSER qmail-inject 应用的 在From头部分的用户名(1)
RECIPIENT qmail-command 设置的 信封上的收件人地址
RELAYCLIENT qmail-smtpd 应用的 忽略 control/rcpthosts 并且附加接收人地址
RPLINE qmail-command 设置的 返回路径头部分
SENDER qmail-command 设置的 信封上的发件人地址
UFLINE qmail-command 设置的 UUCP格式的 "From " 行
USER qmail-command 设置的 目前的用户
USER qmail-inject 应用的 在From头部分的用户名(3)
qmail注入标志位
字符 用途
c 在From头部分应用地址注释模式(address-comment style)
s 不考虑任何引入的返回路径部分(Return-Path field)
f 删除所有引入的From部分
i 删除所有引入的邮件ID部分
r 应用一个每用户VERP
m 应用一个每邮件VERP
五、提高(高级)话题
5.1、procmail
procmail是流行的邮件传送代理(MDA)。MDA的功能是为特定的用户从MTA接收邮件,然后按照用户的意图传送邮件。procmail可以根据不同的头部分或者邮件体内容来“过滤”邮件。举个例子,从某个特定用户发来的邮件可以被指引到只为着个用户准备的信箱里。
在qmail下运行procmail有两个诀窍,第一个,procmail通常用来传送到一个邮件到/var/spool/mail下的mbox格式的邮箱。你可以重新安装procmail使之传送到缺省目录$HOME,或者指令用户不依赖procmail传送到mbox的缺省位置。除非你修补procmail传送到$HOME,procmail仍然会把/var/spool/mail作为临时文件。
另外一个问题是qmail-command和procmail下的exit返回值不是普通理解上的含义。procmail应用标准UNIX返回值:零是成功,非零失败。失败的原因由/usr/include/sys/errno.h指示。但是qmail-command用确定的非零返回指示永久性错误,其余的作为临时返回值。可以用一个小的外壳(shell)外包脚本来为qmail-command翻译exit返回值。这个脚本已经被发表在qmail列表上,可以在 http://www.ornl.gov/its/archives/mailing-lists/qmail/1998/04/msg00487.html下载
同样,较老版本的procmail(3.14之前)不直接传送邮件到maildir格式的信箱。你最好升级到最新版本的procmail。另外一个解决方式是safecat,这个程序通过标准输入将邮件写到指定的maildir。用户可以编写procmail的recipes(传送指令),它用safecat来归档邮件。你也可以完全跳过procmail,用maildrop。
最后,procmail能够接受的邮件格式是mbox,普通的qmail程序程序传送仅仅包括邮件的实际部分,不包括”From”行。preline命令可以用来格式化procmail需要的邮件。
举个例子,我们假设用户”dave”需要用procmail处理他的邮件,dave的系统管理员已经设置了缺省情况下让procmail传送邮件到$HOME而且编写了一个退出代码外包,来调用/usr/local/bin/qmail-procmail。他的.qmail文件应该是这样写的:
??/var/qmail/bin/preline /usr/local/bin/qmail-procmail dave
5.2、POP和IMAP服务器
qmail包括一个POP服务器,qmail-pop3d,不过在qmail的安装和配置过程中,是不包括这个服务器的。你也可以用其它的为Sendmail编写的POP或IMAP服务器,但是要在qmail下运行故且鲆恍┎钩涞墓ぷ鳌?br />
5.2.1、qmail-pop3d
qmail-pop3d是包含在qmail里的POP服务器。用起来很不错,而且很多应用qmail的站点也同时用它。它是模块化的,通过不同的认证模块可以实现多种配置的认证。
注意:qmail-pop3d只支持maildir格式的邮箱,所以如果你的用户登录到POP服务器或者本地运行MUA的话,都是需要maildir的支持的。如果你的所有用户都是通过POP来收信的,那么邮箱的格式就无关紧要了。
5.2.1.1、qmail-pop3d结构
qmail-pop3d服务器包括三个模块:
??qmail-popup—取 用户名/密码
??checkpassword—验证用户名/密码
??qmail-pop3d—POP 守护进程
qmail-popup是很典型的通过inetd或者tcpserver来运行的程序,监听110的POP3端口,当建立一个连接之后,提示输入用户名和密码,然后调用checkpassword,葱Q橛没?密码,如果通过校验,则调用qmail-pop3d。
5.2.1.2、安装qmail-pop3d
1. 完整的安装和测试qmail。如果你像要所有用户都拥有POP邮箱,确认defaultdelivery已经设置位./Maildir/,如果你是按照说明安装的qmail脚本,那么配置文件应该在control/defaultdelivery。如果没有找到,很有可能在/var/qmail/rc里面的qmail-start命令行。
2. 在http://www.qmail.org/top.html#checkpassword下载一个口令检查程序。标准的checkpassword,在http://cr.yp.to/checkpwd.html也有一个,如果你想做点其他有趣的事的话。
3. 按照指导编译并安装checkpassword,确定你安装在/bin/checkpassword。
4. 新建一个脚本/var/qmail/supervise/qmail-pop3d/run包含如下内容:
#!/bin/sh
exec /usr/local/bin/softlimit -m 2000000 \
/usr/local/bin/tcpserver -v -R -H -l 0 0 110 /var/qmail/bin/qmail-popup \
FQDN /bin/checklocalpwd /var/qmail/bin/qmail-pop3d Maildir 2>&1
注: FQDN是设定的POP服务器的全名,如:test.example.com。
5、新建一个脚本/var/qmail/supervise/qmail-pop3d/log/run包含如下内容:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \
/var/log/qmail/pop3d
6、建立记录文件夹并使run脚本可执行,并使服务文件链接到/service:
# chmod +t /var/qmail/supervise/qmail-pop3d # if daemontools < 0.75
# mkdir /var/log/qmail/pop3d
# chown qmaill /var/log/qmail/pop3d
# chmod 755 /var/qmail/supervise/qmail-pop3d/run
# chmod 755 /var/qmail/supervise/qmail-pop3d/log/run
# ln -s /var/qmail/supervise/qmail-pop3d /service
7. 将下面代码加入到qmailctl的 "start"段:
if svok /service/qmail-pop3d ; then
svc -u /service/qmail-pop3d /service/qmail-pop3d/log
else
echo qmail-pop3d supervise not running
fi
8. 将下面代码加入到qmailctl的 "stop"段:
echo " qmail-pop3d"
svc -d /service/qmail-pop3d /service/qmail-pop3d/log
9. 将下面代码加入到qmailctl的 "stat"段:
svstat /service/qmail-pop3d
svstat /service/qmail-pop3d/log
10. 将下面代码加入到qmailctl的 "pause"段:
echo "Pausing qmail-pop3d"
svc -p /service/qmail-pop3d
11. 将下面代码加入到qmailctl的 "cont"段:
echo "Continuing qmail-pop3d"
svc -c /service/qmail-pop3d
12. 将下面代码加入到qmailctl的 "restart"段:
echo "* Restarting qmail-pop3d."
svc -t /service/qmail-pop3d /service/qmail-pop3d/log
5.2.2、Qpopper
如果你需要一个以mbox格式工作的POP守护程序的话,你可以用Qualcomm的qpopper。Vince Vielhaber作了一个能使它在用户的主目录下的邮箱工作的补丁,放在http://www.qmail.org/qpopper2.53.patch.tar.gz。qpopper可以在http://www.eudora.com/freeware/qpop.html得到。
5.2.3、Solid
Solid POP3服务器支持maildir和mbox邮箱。主页在http://solidpop3d.pld.org.pl/。
5.2.4、imap-maildir
David R. Harris整理了华盛顿大学(University of Washington)IMAP服务器。文档和安装过程参见http://www.davideous.com/imap-maildir/。
5.2.5、Courier-IMAP
Sam Varshavchik编写了一个只支持maildir邮箱的IMAP服务器,见http://www.inter7.com/courierimap/。
5.3、POP和IMAP客户端
5.3.1、fetchmail
fetchmail是一个从POP或者IMAP服务器上接收并且本地重新注入的程序。fetchmail从qmail服务器上接收邮件没问题,可是作为qmail客户端,要顺利工作,还要知道两个诀窍。
下面是一个范例,显示了qmail系统下的一个.fetchmailrc文件:
poll mail.example.net proto pop3 nodns
user dsill with password flubgart is dave here
fetchall forcecr to * here
这些脚本指示fetchmail通过POP3连接mail.example.net,作为用户dsill登录,密码是flubgart,接收所有邮件并转送到dave@localhost上。forcecr这项使fetchmail通过SMTP注入邮件到本地系统的时候用会车键结束每一行,这是qmail要求的。
注意:fetchmail不是非常的可靠。如果重注入过程由于某种原因失败(例如格式错误导致的反弹或者SMTP服务器没有运行),邮件将会丢失。
5.3.2、getmail
getmail接收POP邮件,传送到maildir格式邮箱里。实际上它是一个Python脚本,所以你需要事先安装Python解释器。
getmail由Charles Cazabon编写,它维护一个关于getmail的网页http://www.qcc.sk.ca/~charlesc/software/getmail/。
5.4、多接收和逐一接收的比较
假设你是一个MTA,你的一个用户发送一封邮件给三个在hoxtx.example.com上的信箱,有几种方法可以接收它。
1、你可以建立一个SMTP到hostx的连接,发送一个邮件的副本给第一个信箱,一个副本给第二个信箱,一个给第三个,然后关闭连接。
2、你可以开三个进程,每一个都建立一个到hostx的连接,每个连接发送一个副本给每个信箱,然后关闭连接。
3、你可以建立一个SMTP连接到hostx,发送一个有三个地址的邮件副本,然后关闭连接。
第一个方法明显的比第三个差,即使邮件很微小,多传送一个副本同样要耗费一定的时间。如果邮件很大,就会耗费相当多的时间和带宽。
所以,排除第一个。
第二个和第三个方法很有意思。
第三个方法仅仅建立一个连接到hostx,只发送一个邮件的副本,是非常节约带宽的方法。第二个应用多个连接发送多个副本,非常“浪费”带宽,可是由于SMTP协议要求更小的来回延迟的特点,它是要比第三种方法更快的。而且比第三种方法更简单,这样就可以以更直接的方式编写MTA的代码。这可能有助于MTA解决VERP(见下节)。
qmail总是应用第二种方式(逐一接收)。没有关于第三种方式(多接收)的补丁—这需要大量的工作。
虽然逐一接收比多接收要慢,可是简单性和VERP的优势重于前者。
单接收传送比多接收应用更多的带宽,可是这种差别常常只是夸大其词,绝大多数邮件最多只有两个接收者,而邮件的目的地通常是不同的主机,多接收对此毫无益处。至于在列表服务器上,多接收可能是有用的,潜在的优点也是很微小的,因为SMTP在大多数连接中只用掉了带宽的一小部分—HTTP留下的残羹剩饭。
举个例子,如果你的上行带宽中10%用来联系SMTP,应用多接收能够降低带宽25%,仅仅降低你的SMTP带宽到7.5%。
5.5、可变回复信封路径 VERP
如果邮件未能传送成功,MTA将按照信封上的返回路径(ERP)反弹邮件。被反弹的邮件必须有反弹接收者的地址,以及未能发送的原因,是否是暂时的还是永久性的问题。某些MTA可能作的并不好,可能反弹邮件给发送者的地址,或者反弹不校验接收者。
对于大多数用户-用户邮件,这个毛病不是大问题,通常可以按照定时反弹和反弹内容解决。但是对于邮件列表,错误反弹就是严重的问题,如果订阅者改变了接收地址,转发邮件到新的地址,新地址出现传送问题,他将不可能告知是那个方面中断了。
Dan Bernstein提出VERP(Variable Envelope Return Path,可变信封回复路径)解决这个问题。应用VERP每个发送给用户的列表邮件都拥有一个完整的返回路径,这就使反弹控制者检查问题用户成为可能。
举个例子,一个典型的非VERP邮件列表的返回地址形如listname-owner@domain,而VERP的返回地址是listname-owner-subscriber=sdomain@ldomain,这里订阅者的地址被嵌入在”owner”和”@”之间。(在订阅者地址内的”@”被”=”代替)。
ezmlm列表管理程序应用VERP来自动控制反弹,ezmlm还提供了解决因为暂时的传送问题导致列表邮件丢失的错误,订阅者可以从存档文件中重新接找回未能接收的邮件。
Russell Nelson为qmail下的Majordomo制作了一个反弹管理器,不过没有继续维护,可以在http://www.qmail.org/bounceman-0.4.shar找到。
5.6、问题处理
5.6.1、进程
一个能够正常运行的,完整的,最小化安装的qmail应该有下面四个进程:
??qmail-send由用户qmails运行
??qmail-clean由用户qmailq运行
??qmail-rspawn由用户qmailr运行
??qmail-lspawn由用户root运行
下面的命令格式和你应用的UNIX有关,能列出上面的这些进程,可能会少一些:
# ps -ef | grep qmail
# ps waux | grep qmail
例如:
[dave@sparge dave]$ ps waux|grep qmail
dave 2222 0.0 0.8 836 348 p4 S 10:25 0:00 grep qmail
qmaild 351 0.0 1.0 840 400 ? S N 12:43 0:00 /usr/local/bin/tcpserver -v -x /etc/tcp.smtp.cdb -u 49491 -g 31314 0 smtp /var/qmail/bin/qmail-smtpd-
qmaild 2220 0.0 1.0 844 420 ? S N 10:25 0:00 /usr/local/bin/tcpserver -v -x /etc/tcp.smtp.cdb -u 49491 -g 31314 0 smtp /var/qmail/bin/qmail-smtpd-
qmaill 365 0.0 0.8 748 344 ? S N 12:43 0:00 splogger qmail
qmailq 368 0.0 0.7 736 292 ? S N 12:43 0:00 qmail-clean
qmailr 367 0.0 0.6 732 272 ? S N 12:43 0:00 qmail-rspawn
qmails 350 0.0 0.8 776 336 ? S N 12:43 0:00 qmail-send
root 340 0.0 0.6 724 252 ? S N 12:43 0:00 /usr/local/sbin/supervise /var/supervise/qmail-send /var/qmail/rc
root 341 0.0 0.6 724 252 ? S N 12:43 0:00 /usr/local/sbin/supervise /var/supervise/tcpserver-qmail /usr/local/bin/tcpserver -v -x /etc/tcp.smtp
root 366 0.0 0.7 736 276 ? S N 12:43 0:00 qmail-lspawn ./Mailbox
[dave@sparge dave]$
如果你在supervise下运行qmail,作为上面的例子,你也能能够看到那些进程。如果你在tcpserver下运行qmail-smtpd,你可以看到一个tcpserver父进程加一个另外的处理每个引入的SMTP的进程。
如果你用splogger(或者multilog或者cyclog)控制日志,你还有一个splogger(或者multilog或者cyclog)进程或者两个由用户qmaill运行的进程。
同样,如果qmail忙于传送邮件本地和远程主机的时候,你可以在上面看到concurrencylocal qmail-local(本地)进程和concurrencyremote qmail-remote(远程)进程。
5.6.2、日志
5.6.2.1、splogger
splogger应用syslog 日志记录系统给邮件打时间戳,然后送交syslog守护进程。syslog的配置文件在/etc/syslog.conf。sysloge通过邮件具有的****和优先权分配邮件到指定的日志文件,远程日志,或者控制台。splogger缺省记录邮件的****,所以你在syslog.conf文件里面用grep查找字串”mail”,可以看出qmail邮件邮件邮件日志记录的部署情况。
典型的位置包括:
/var/log/syslog
/var/adm/SYSLOG
/var/log/maillog
典型的syslog记录入口看起来类似于:
Jun 3 11:35:23 sparge qmail: 928424123.963558 delivery 153: success: did_1+0+0/
"Jun 3 11:35:23" 是syslog时间戳
"sparge" 是发送邮件系统的名字
"qmail:" splogger置于所有qmail 日志入口
"928424123.963558" 是一个可选的TAI时间戳(见下节)
"delivery 153: success: did_1+0+0/" 是邮件日志本身
5.6.2.2、multilog
multilog,记录邮件日志为一系列指定目录下的文件,multilog是daemontools包的一部分。
日志纪录文件夹由multilog的命令行来设定,qmail的启动脚本能够找到这个命令。
multilog的选项决定了日志纪录文件夹内的文件的最大大小,以及文件的个数。日志文件的文件名是根据文件开始记录时的TAI( Temps Atomique International )时间戳命名的。这个tai64nlocal命令,同样来自daemontools,转换TAI时间戳为本地,易读时间戳。
一个典型的multilog日志入口:
@4000000038c3eeb104a6ecf4 delivery 153: success: did_1+0+0/
" @4000000038c3eeb104a6ecf4 " 是TAI时间戳,是可选的,建议你选上它,
" delivery 153: success: did_1+0+0/ " 是邮件收发纪录。
5.6.2.3、邮件日志纪录
下面的是一个典型的从本地系统发送邮件到远程系统的邮件纪录:
1 @4000000038c3eeb027f41c7c new msg 93869
2 @4000000038c3eeb027f6b0a4 info msg 93869: bytes 2343 from qp 18695 uid 49491
3 @4000000038c3eeb02877ee94 starting delivery 2392: msg 93869 to remote lwq@w3.to
4 @4000000038c3eeb0287b55ac status: local 0/10 remote 1/20
5 @4000000038c3eeb104a13804 delivery 2392: success: 209.85.127.177_accepted_message.
/Remote_host_said:_250_CAA01516_Message_accepted_for_delivery/
6 @4000000038c3eeb104a4492c status: local 0/10 remote 0/20
7 @4000000038c3eeb104a6ecf4 end msg 93869
第1行显示qmail接受了一个新邮件,队列标示符为93869,这个标示符其实是包含这个邮件的 /var/qmail/queue/mess/NN/ 文件的i节点数。标示符保证了在队列内的邮件的唯一性。
第2行显示了这个邮件来自dave@sparge.sill,大小是189字节。
第3行显示了qmail-remote开始传送邮件到lwq@w3.to,并且分配给这个传送标示符2392。
第4行显示0本地传送和1远程传送在传输中。
第5行显示2392传送已经成功完成,返回远程服务器的回应,这个纪录里通常包含了远程邮件主机的管理者可能需要的对于这次传送的跟踪信息。在这个例子里,"CAA01516" 是远程系统的传送标示符。
第6行显示0本地传送和0远程传送在传输中,也就是说,传送完成了。
第7行显示邮件已经被传送并且被移出队列,这里,队列标示符93869被重用到其它的传送。
5.7、大型服务器
同时参见qmail-ldap。
5.7.1、可升级并行系统
应用快速NFS网络文件服务器存储用户目录。建立多个等优先级SMTP服务器来传送邮件到文件服务器上的maildir邮箱。
5.8、从Sendmail到qmail的转移
首先,参考Dan Bernstein的Sendmail到qmail页:http://cr.yp.to/qmail/sendmail.html。
5.9、邮件列表管理器
邮件列表管理器(MLM’s)能够帮助邮件列表的拥有者管理列表,管理任务分担为两个主要部分:管理订户,控制订户的邮件重发。
大多数(所有的?)UNIX邮件列表管理器都可以被应用在qmail下。
5.9.1、ezmlm
ezmlm由Dan Bernstein编写,他也是qmail的作者。ezmlm是为qmail编写的,为qmail的几个特点支持,特别显著的是,ezmlm应用VERPs来可靠的处理反弹邮件。相对于其他邮件列表管理器(MLM’s),ezmlm有点独特的地方是它不处理发送到列表主地址的命令,而是附加在列表名字后面的命令,例如:如果你要订阅”foo@list.example.net ”列表,需要发信到foo-subscribe@list.example.net。
需要更多关于ezmlm的信息,请参考http://www.ezmlm.org/,这是很有用的东西。
5.9.2、Majordomo
Majordomo是最受欢迎的UNIX邮件列表管理器,如果有一些简单的修改,它能和qmail共同运行的相当好。Russ Allbery撰写了一个关于qmail/Majordomo的FAQ,http://www.eyrie.org/~eagle/faqs/mjqmail.html。
5.10、补丁
下载补丁
http://www.ckdhr.com/ckd/qmail-103.patch
http://www.qmail.org/qmailqueue-patch
http://www.shupp.org/patches/qmail-maildir++.patch
http://qmail.te8.com/rpms/glibc-2.3.1/qmail-1.03.errno.patch
http://qmail.te8.com/rpms/glibc-2.3.1/qmail-1.03.qmail_local.patch
http://members.elysium.pl/brush/qmail-smtp-auth/dist/qmail-smtpd-auth-0.31.tar.gz
进入qmail源代码目录,运行patch命令来安装补丁。
# cd /usr/local/src/qmail/qmail-1.03
# patch -p0
通过结束qmail-send进程或者依靠qmail的启动脚本使qmail停止:
# qmailc stop
然后重新编译安装二进制代码:
# make setup check
5.11、快速邮件传送协议(QMTP)
QMTP,快速邮件传输协议(Quick Mail Transfer Protocol),由Dan Bernstein设计的SMTP的替代协议。这个协议的定义在http://cr.yp.to/proto/qmtp.txt。QMTP与SMTP相似,而且更简单,更快,和SMTP兼容。qmail包括QMTP服务器,qmail-qmtp,非常类似于qmail-smtp。QMTP通常应用端口209。
qmail不包括QMTP客户端,serialmail里面包括一个客户端。maildir2qmtp通过QMTP传送一个maildir邮箱下的邮件到指定的QMTP服务器。
QMTP并不是一个SMTP的代替品,在互联网上应用也不是很广泛。