Qmail简易配置——再次整理篇
2007年09月14日 星期五 10:51
所需软件:
netqmail-1.05.tar.gz-- (不用说应该知道干什么的了吧!)
ucspi-tcp-0.88.tar.gz-- 一个inetd超级服务器的替换程序
daemontools-0.76.tar.gz-- 一个管理后台服务程序以及日志的工具套件
*checkpassword-0.90.tar.gz-- POP3 服务模块化的密码检查


安装基本软件:

现在你需要成为root用户, 如果你还没有, 那就成为root吧
su
umask 022

件所需软件cp到/usr/local/src中
netqmail-1.05.tar.gz
ucspi-tcp-0.88.tar.gz
daemontools-0.76.tar.gz
就是这3个软件。

mkdir -p /package
将daemontools-0.76.tar.gz装入其中
mv daemontools-0.76.tar.gz /package
并赋予权限
chmod 1755 /package


解开软件包:
cd /usr/local/src
tar zxvf netqmail-1.05.tar.gz
cd netqmail-1.05
./collate.sh # 在这儿要注意错误信息(至于错误信息是什么本人尚未了解到)
cd ..
tar zxvf ucspi-tcp-0.88.tar.gz
cd /package
tar zxvf daemontools-0.76.tar.gz


注意qmail安装程序会自行创建需要的子目录, 你只需要创建qmail的"home"目录:
mkdir /var/qmail

最容易的创建用户和组的方式是创建一个小脚本文件然后执行它. 在源代码目录下你可以找到一个名字是INSTALL.ids的文件, 它包括了在你的系统平台下创建用户和组的命令行. 复制这个文件并命名另外一个名字, 编辑它来运行命令既快捷又简单.
cd /usr/local/src/netqmail-1.05/netqmail-1.05
cp INSTALL.ids IDS
vi IDS
将里面内容做成下面所示:
pw groupadd nofiles
pw useradd alias -g nofiles -d /var/qmail/alias -s /nonexistent
pw useradd qmaild -g nofiles -d /var/qmail -s /nonexistent
pw useradd qmaill -g nofiles -d /var/qmail -s /nonexistent
pw useradd qmailp -g nofiles -d /var/qmail -s /nonexistent
pw groupadd qmail
pw useradd qmailq -g qmail -d /var/qmail -s /nonexistent
pw useradd qmailr -g qmail -d /var/qmail -s /nonexistent
pw useradd qmails -g qmail -d /var/qmail -s /nonexistent

(保存退出后会提示
Would you like to edit /etc/shadow now [y/n]?
直接敲回车,不管!)

然后运行这个脚本, 用chmod将脚本设置为可执行
chmod 700 IDS
./IDS
或者用sh来运行它
/bin/sh IDS
这个脚本运行完毕, 你的所有的用户和组就已经添加完毕, 你可以继续下一节的安装了!

(可是如果你的系统在INSTALL.ids 上没有提到, 那你就必须手动创建用户和组了.
vi /etc/group,
增加下面两行:
qmail:*:2107:
nofiles:*:2108:
注意: 首先确定2107和2108没有被使用, 如果已经被占用, 选择2个文件中未用的数字.)

vipw
在文件尾部增加下面这些行:
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


编译软件:

cd /usr/local/src/netqmail-1.05/netqmail-1.05
make setup check
如果你的DNS配置恰当, 运行这个脚本:
./config
如果由于某些原因config 脚本不能在DNS找到你的主机名, 你就必须运行config-fast脚本
(一般试验没有建设专门的DNS所以使用命令
./config-fast the.full.hostname
*the.full.hostname是指你的主机全名)


cd /usr/local/src/ucspi-tcp-0.88
patch < /usr/local/src/netqmail-1.05/other-patches/ucspi-tcp-0.88.errno.patch
make
make setup check
ucspi-tcp安装完毕!


cd /package/admin/daemontools-0.76
cd src
patch < /usr/local/src/netqmail-1.05/other-patches/daemontools-0.76.errno.patch
cd ..
package/install
(使用 "ps -ef | grep svscan" 或者"ps waux | grep svscan" 检查svscan是否在运行)


运行 qmail:
qmail启动脚本:
vi /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 /Mailbox 传送格式
echo ./Mailbox >/var/qmail/control/defaultdelive

如果你手动执行/varqmail/rc 脚本, qmail只会部分被运行起来. 可是我们希望希望每次系统启动后, qmail都能自动被启动; 每次系统停止时候qmail自动被关闭。创建一个如下的 /var/qmail/bin/qmailctl 文件可以完成这个愿望:
vi /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 "Pausing qmail-send"
    svc -p /service/qmail-send
    echo "Pausing 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/lo*
    ;;
**b)
    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 <   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


将上面这个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 文件:
vi /var/qmail/supervise/qmail-send/run
内容如下:
#!/bin/sh
exec /var/qmail/rc

建立 /var/qmail/supervise/qmail-send/log/run 文件:
vi /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 文件:
vi /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 控制文件.
echo 20 > /var/qmail/control/concurrencyincoming
chmod 644 /var/qmail/control/concurrencyincoming

建立 /var/qmail/supervise/qmail-smtpd/log/run 文件:
vi /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是Sendmail, 你应该能利用运行Sendmail的init.d脚本的"stop"参数来停止它的运行.
/etc/init.d/sendmail stop

etc/rc.d/init.d/sendmail stop

把旧的MTA彻底的从你的系统里面删除. 至少禁用它的 init.d 脚本, 防止下一次系统重启动的时候旧的MTA也被试图重启. 对于使用rpm方式安装Sendmail的 Red Hat Linux, 执行下面的命令来删除Sendmail:
rpm -e --nodeps sendmail


检查一下没有其他程序在监听SMTP服务端口(25).
netstat -a | grep 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,所以忽略。如果不删除就不会有提示,这个我试过了,但至于会不会成功建成那就不知道。)

运行 qmail:
qmailctl start

建立用户:
useradd 用户名
passwd 用户名

为用户建立自己的Maildir格式信箱:
su - 用户名
/var/qmail/bin/maildirmake /$HOME/Maildir
echo ./Malidir/ > /$HOME/.qmail
切换回管理员用户:
su -
输入管理员密码

测试安装:
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
(重要的是里面的4个up!)


安装 qmail-pop3d:
cd /usr/local/src
tar zxvf checkpassword-0.90.tar.gz
cd checkpassword-0.90
patch < /usr/local/src/netqmail-1.05/other-patches/checkpassword-0.90.errno.patch
(为POP3打上修补错误返回码的补丁)
make setup check

mkdir /var/qmail/supervise/qmail-pop3d

创建一个/var/qmail/supervise/qmail-pop3d/run 脚本,
vi /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/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2>&1

(FQDN 是你建立的POP服务器的完整的有资格的正式域名)

将下面内容加入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

将下面内容加入qmailctl脚本的"stop"部分

    echo " qmail-pop3d"
    svc -d /service/qmail-pop3d /service/qmail-pop3d/log

将下面内容加入qmailctl脚本的"stat"部分

    svstat /service/qmail-pop3d
    svstat /service/qmail-pop3d/log

将下面内容加入qmailctl脚本的"pause"部分

    echo "Pausing qmail-pop3d"
    svc -p /service/qmail-pop3d

将下面内容加入qmailctl脚本的"cont"部分

    echo "Continuing qmail-pop3d"
    svc -c /service/qmail-pop3d

将下面内容加入qmailctl脚本的"restart"部分

    echo "* Restarting qmail-pop3d."
    svc -t /service/qmail-pop3d /service/qmail-pop3d/log


可以说这个么,基本上么,差不多么,大概么,嗯...应该是可以用了,可以发一封空白测试邮件
echo To: 用户名@主机全名 | /var/qmail/bin/qmail-inject

查信么
cd /home/用户名/Maildir/new
ls
因该看得到了,软后就是windows下的客户端试验了~应该是成功的!
a