接上回.
用你的编辑器将上面的脚本保存为 /var/qmail/rc, 然后执行下面这些命令:
chmod 755 /var/qmail/rc mkdir /var/log/qmail
现在你需要决定一下, 除了由.qmail 文件指示传送的邮件外, 其他邮件将采用何种默认传输方式, (.qmail 文件是指示文件传送路径的重要文件, 后面还会讨论.)下面的列表大致阐述了几种一般性的选择:
邮箱格式 名称 保存位置 缺省的传输方式 注释
mbox Mailbox $HOME ./Mailbox 最常见的格式, 大多数MUA都可以正确识别
maildir Maildir $HOME ./Maildir/ 更可靠, 少数MUA支持的格式
mbox username /var/spool/mail 参见 INSTALL.vsm文件 传统的UNIX邮箱
更多信息请参考 INSTALL.mbox, INSTALL.maildir 和 INSTALL.vsm 文件.
选择缺省的邮箱格式, 只要选择上表里面的"缺省传输方式"的值, 填写到/var/qmail/control/defaultdelivery里面就可以了. 例如, 如果选择标准的qmail /Mailbox 传送格式, 这样作就行了:
echo ./Mailbox >/var/qmail/control/defaultdelivery
注意: defaultdelivery并不是标准的qmail控制文件. 而是上文/var/qmail/rc 文件的要素.
对于qmail-start来说, defaultdelivery 变量只是在没有实际的 .qmail 文件指定传送指令的情况下作为 .qmail
文件的内容出现的. 把这个指令加入到单独的控制文件内, 就不必再在指令内重复引用shell元字符, 避免了出现多行杂乱的命令参数.
系统启动文件
qmailctl 脚本
如果你手动执行/varqmail/rc 脚本, qmail只会部分被运行起来. 可是我们希望希望每次系统启动后, qmail都能自动被启动; 每次系统停止时候qmail自动被关闭.
创建一个如下的 /var/qmail/bin/qmailctl 文件可以完成这个愿望:
#!/bin/sh
# description: the qmail MTA
PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
export PATH
QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
case "$1" in
start)
echo "Starting qmail"
if svok /service/qmail-send ; then
svc -u /service/qmail-send /service/qmail-send/log
else
echo "qmail-send supervise not running"
fi
if svok /service/qmail-smtpd ; then
svc -u /service/qmail-smtpd /service/qmail-smtpd/log
else
echo "qmail-smtpd supervise not running"
fi
if [ -d /var/lock/subsys ]; then
touch /var/lock/subsys/qmail
fi
;;
stop)
echo "Stopping qmail..."
echo " qmail-smtpd"
svc -d /service/qmail-smtpd /service/qmail-smtpd/log
echo " qmail-send"
svc -d /service/qmail-send /service/qmail-send/log
if [ -f /var/lock/subsys/qmail ]; then
rm /var/lock/subsys/qmail
fi
;;
stat)
svstat /service/qmail-send
svstat /service/qmail-send/log
svstat /service/qmail-smtpd
svstat /service/qmail-smtpd/log
qmail-qstat
;;
doqueue|alrm|flush)
echo "Flushing timeout table and sending ALRM signal to qmail-send."
/var/qmail/bin/qmail-tcpok
svc -a /service/qmail-send
;;
queue)
qmail-qstat
qmail-qread
;;
reload|hup)
echo "Sending HUP signal to qmail-send."
svc -h /service/qmail-send
;;
pause)
echo " ausing qmail-send"
svc -p /service/qmail-send
echo " ausing qmail-smtpd"
svc -p /service/qmail-smtpd
;;
cont)
echo "Continuing qmail-send"
svc -c /service/qmail-send
echo "Continuing qmail-smtpd"
svc -c /service/qmail-smtpd
;;
restart)
echo "Restarting qmail:"
echo "* Stopping qmail-smtpd."
svc -d /service/qmail-smtpd /service/qmail-smtpd/log
echo "* Sending qmail-send SIGTERM and restarting."
svc -t /service/qmail-send /service/qmail-send/log
echo "* Restarting qmail-smtpd."
svc -u /service/qmail-smtpd /service/qmail-smtpd/log
;;
cdb)
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
chmod 644 /etc/tcp.smtp.cdb
echo "Reloaded /etc/tcp.smtp."
;;
help)
cat <<HELP
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 -- schedules queued messages for immediate delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
queue -- shows status of queue
alrm -- same as doqueue
flush -- same as doqueue
hup -- same as reload
HELP
;;
*)
echo "Usage: $0 {start|stop|restart|doqueue|flush|reload|stat|pause|cont|cdb|queue|help}"
exit 1
;;
esac
exit 0
这个脚本可以在线下载, 地址是http://www.lifewithqmail.org/qmailctl-script-dt70.
(建议所有直接使用, 或者拷贝-粘贴web页面指令和文件格式脚本指令的读者, 都要注意脚本编码转换的问题. 本文讲到的qmail 是在Unix/Linux 类型服务器上运行的, 而UNIX 的回行和DOS/Windows的回车在脚本内表示的ACSII码是完全不同的, 如果遇到这个问题, 在之后的脚本执行中, 可能出现非常奇怪的错误信息. 有兴趣的读者可以在搜索引擎上查找深入介绍内容. 细心的读者还会注意到, 英文原文和翻译版本, 在代码前后都加上了< RE></PRE>格式符, 其目的就是为了保证指令代码不会被web页面的格式代码"污染". 译者注)
你可以自己输入这个脚本, 不过我推荐你用浏览器下载上面链接的文件.
将上面这个qmailctl 脚本设置为可执行脚本, 然后链接到你的用户执行程序目录:
chmod 755 /var/qmail/bin/qmailctl
ln -s /var/qmail/bin/qmailctl /usr/bin
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 文件
#!/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` LOCAL=`head -1 /var/qmail/control/me` if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in echo /var/qmail/supervise/qmail-smtpd/run exit 1 fi if [ ! -f /var/qmail/control/rcpthosts ]; then echo "No /var/qmail/control/rcpthosts!" echo "Refusing to start SMTP listener because it'll create an open relay" exit 1 fi exec /usr/local/bin/softlimit -m 2000000 \ /usr/local/bin/tcpserver -v -R -l "$LOCAL" -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \ -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
注意: concurrencyincoming并不是标准的qmail控制文件. 它是上面脚本的一个要素. 并且, 第一个LOCAL 行上面的是"破折号 + 数字1", 下面的tcpserver行上的参数是"破折号 + 小写字母l" .
注意: 根据你的操作系统和硬件平台的不同, 可能需要调整softlimit命令的的内存限制参数. 如果你的系统出现连接25端口失败和无法接收远程系统发送的邮件, 或者看到了类似下面这样的错误消息:
/usr/local/bin/tcpserver: error while loading shared libraries:
libc.so.6: failed to map segment from shared object: Cannot
allocate memory
试一下把这个参数调整到3000000到4000000.
建立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
将各个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
SMTP 访问控制
允许本地主机通过SMTP方式发送邮件:
echo '127.:allow,RELAYCLIENT=""' >>/etc/tcp.smtp qmailctl cdb
停止并且禁用(其他)已经安装的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 -ef|grep sendmail" 或者 "ps waux|grep 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
注意: 如果你使用基于RPM方式的Linux, 比如 Red Hat, 删除MTA可能带来进一步的问题.
系统的某些应用程序将会试图重新安装Sendmail, 一些MUA程序将无法安装.
检查一下没有其他程序在监听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 命令也是一个会被很多程序调用来发送邮件的重要命令.
最后步骤是建立两个系统别名.
在所有 qmail 安装上面都要建立四个系统别名:
别名 目的
postmaster RFC 2821 标准要求, 指向邮件系统管理员(也就是你)
mailer-daemon 反弹邮件事实上的标准接收者
root 转发特权用户, 根(root)用户的邮件给系统管理者
abuse 事实上的邮件滥用(垃圾邮件)举报地址
建立这些系统别名, 取决于你想让这些邮件发送到哪里(一个本地用户或者一个远程地址)并且适当的创建一个.qmail 文件集合. 举个例子, 加入你想让本地用户 dave 接收发给系统管理员和邮件管理员的邮件, 就这么作:
echo dave > /var/qmail/alias/.qmail-root
echo dave > /var/qmail/alias/.qmail-postmaster
ln -s .qmail-postmaster /var/qmail/alias/.qmail-mailer-daemon
ln -s .qmail-postmaster /var/qmail/alias/.qmail-abuse
chmod 644 /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster
在 INSTALL.alias 文件里面有更详细的细节.
运行 qmail
如果依照上文, 你创建 /service 之后就停止了qmail, 你现在应该重新启动 qmail:
qmailctl start
测试安装
qmail 现在应该是正在运行的状态. 首先运行 qmailctl stat 来检验那些服务启动并运行中 下面命令后部分为演示结果, 并不是必然如此的系统输出. 译者注)
# qmailctl stat
/service/qmail-send: up (pid 30303) 187 seconds
/service/qmail-send/log: up (pid 30304) 187 seconds
/service/qmail-smtpd: up (pid 30305) 187 seconds
/service/qmail-smtpd/log: up (pid 30308) 187 seconds
messages in queue: 0
messages in queue but not yet preprocessed: 0
所有的四个服务都应该是"up"(启动了)1秒钟以上. 如果不是这样, 你可能就是在写脚本的时候写错了一些东西或者你漏过了创建一个甚至多个必要的文件, 目录或者链接. 返回上面的安装指导, 一步一步的再检查一下你的工作. 你也可以下载并运行 inst_check 脚本, 在这里下载 http://lifewithqmail.org/inst_check.
配置
你已经从源代码tarball方式, 或者自编译包方式, 或者var-qmail包方式安装了 qmail. 这一节的内容就是按照你的需要配置qmail.
配置文件
所有的qmail系统配置文件, 除了在~alias下的 .qmail 文件, 都位于 /var/qmail/control 目录下. qmail-control 的man手册页包括了一个像下面这样的表:
控制文件 默认值 被用于 使用目的
badmailfrom none qmail-smtpd From 地址黑名单
bouncefrom MAILER-DAEMON qmail-send 反弹邮件的发送者
bouncehost me qmail-send 反弹邮件的发送者主机名
concurrencyincoming none /service/qmail-smtpd/run 最大并行 SMTP 连接数
concurrencylocal 10 qmail-send 最大并行本地传送数
concurrencyremote 20 qmail-send 最大并行远程传送数
defaultdelivery none /var/qmail/rc 默认的 .qmail 文件
defaultdomain me qmail-inject 默认的域名
defaulthost me qmail-inject 默认的主机名
databytes 0 qmail-smtpd 邮件最大字节数 (0 等于无限)
doublebouncehost me qmail-send 双重反弹的发送者的主机名
doublebounceto postmaster qmail-send 接收双重反弹邮件的用户
envnoathost me qmail-send 对缺少"@"符号的地址配置的缺省域名
helohost me qmail-remote 在SMTP HELLO命令里面使用的主机名
idhost me qmail-inject 在Message-ID 里面使用的主机名
localiphost me qmail-smtpd 替代本地 IP 地址的名字
locals me qmail-send 进行本地传送的域
me 系统的正式域名 FQDN various 许多控制文件的默认要求
morercpthosts none qmail-smtpd 二级rcphosts(接收主机)数据库
percenthack none qmail-send 可以使用"%"模式转信的域
plusdomain me qmail-inject "+"加号拖尾地址替代的域
qmqpservers none qmail-qmqpc QMQP 服务器IP地址
queuelifetime 604800 qmail-send 邮件在队列内可保留秒数
rcpthosts none qmail-smtpd 我们的主机接收邮件的域
smtpgreeting me qmail-smtpd SMTP 问候信息
smtproutes none qmail-remote 人为指定的SMTP路由
timeoutconnect 60 qmail-remote SMTP连接超时秒数
timeoutremote 1200 qmail-remote 远程服务器连接超时秒数
timeoutsmtpd 1200 qmail-smtpd SMTP客户端超时秒数
virtualdomains none qmail-send 虚拟域和用户
查找这些特殊控制文件的更多信息, 请参考上面表格 "被用于" 列下的各个模块的 man 手册页.
相关帖子