【实验名称】

Qmail邮件服务器的搭建
【实验环境】
REAL-HAT-5.4虚拟机一台
【实验目标】
掌握Qmail邮件服务器的基本配置,实现基本的邮件收发。
【实验步骤】
第一步:实验环境的搭建。
1)修改系统信息。
System-config-network
Vi /etc/sysconfig/network
Vi /etc/hosts
Vi /etc/sysconfig/selinux
清楚默认防火墙策略,并保存设置。
(1)     安装DNS相关软件包,并作相关配置。配置完成之后重启。
挂载光盘,并且安装DNS服务相关软件包。
编辑主配置文件添加区域记录,vi /etc/named.rfc1929.zone
编辑正向区域数据文件,并且添加相应的MX记录。
编辑反向区域数据文件。
更改区域数据文件的属组为named
启动服务,并且进行解析测试。
(2)     挂载Qmail光盘,将服务软件包释放的相应的目录。
netqmail-1.03 qmail基本系统包含补丁集和一些脚本
ucspi-tcp-0.88 tcpsever
等服务程序,一个inetd超级服务器的替换程序,由一组工具组成。它们用来简单的建立客户机-服务器tcp后台程序  
daemontools-0.76
监视工具,是inetdwinetd的代替品,用它来监听qmail-send,qmail-smtpd,qmail-pop3d
checkpassword-0.90 pop3
验证用户的程序,POP3服务模块化的密码检查
4)开始正式配置Qmail服务器。
创建一个package目录将daemontools-0.76.tar.gz释放到这个目录下。
为创建的目录赋予相应的权限,非常重要,如果没有赋予相应的权限smtp服务是不能启动的。
进入netqmail-1.05这个目录,然后运行此脚本。出现一下7行信息表示运行成功。
注意qmail安装程序会自行创建需要的子目录, 只需要创建qmail的"home"目录:
创建Qmail所需要的相应用户和组。
注意:在创建相应组和用户时,Qmail自带一个脚本,只需要在一下目录中将原脚本文件拷贝然后做相应的修改,其次加上可知行权限,最后执行就OK了
以下是经过修改的脚本文件。
赋予可执行权限,然后执行。
注意:这里的提示是说此用户已经存在,当要创建此用户时,系统会将原来这个用户的目录文件拷贝过来,不用理会就可以了。
5)进行软件的编译以及安装。
注意:以上步骤中创建用户与组没有创建完整,那么此步的编译安装会出现错误。
出现以下信息表明编译安装成功完成。
编译完成之后,执行当前目录下的./config脚本文件,此脚本是为了将您系统的主机全名写入Qmai的相关配置文件中。
但是为了避免后面的配置中出现错误,可以使用./config-fast zlb.xapc.com 进行再次指定。
6)编译安装ucspi-tcp-0.88 tcpsever等服务程序,在安装之前必须先打上相关补丁。
然后执行make && make setup check 出现以下信息表明编译安装成功。
7)编译安装daemontools-0.76 监视工具,在安装之前先打补丁。
回到上一级目录进行安装。
安装完成之后查看svscan服务是否正常运行。
8)创建Qmai启动脚本。
Vi /var/qmai/rc
为创建的脚本添加可执行权限,然后创建qmail日志文件目录。
如果选择标准的qmail /Mailbox 传送格式
如果你手动执行/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/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
将上面这个qmailctl 脚本设置为可执行脚本, 然后链接到你的用户执行程序目录:
9)建立supervise 脚本,为 qmail 的服务创建 supervise 目录:
vi /var/qmail/supervise/qmail-send/run脚本内容如下:
#!/bin/sh
exec /var/qmail/rc
vi /var/qmail/supervise/qmail-send/log/run脚本内容如下:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail
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 控制文件.
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文件设置为可执行文件:
然后建立log文件目录并且设置目录属组为qmaill
建立 supervise 目录到 /service 目录的链接,其中这个service目录是daemontools 安装时建立的目录。
建立这个链接之后,qmail系统会自动启动。这时可以使用命令将其停止。
设置SMTP访问控制。以下命令是设置只允许Qmail服务器为127网段以及192.168.3网段的主机提供服务。
启动Qmai服务,并且创建邮件用户。
依次为用户建立自己的Maildir格式信箱:在切换其他用户时,先使用exit命令退出当前shell
测试安装,查看Qmail启动状态。
10.安装qmail-pop3d
为验证用户的程序包打补丁。
然后进行编译安装。
Make setup check出现以下信息表示安装成功完成。
创建运行pop3d服务的相应目录已经运行脚本。
脚本内容如下:
创建pop3d日志监视脚本。
脚本内容如下:
建立log日志文件夹并且设置相应的run脚本, 将脚本链接到 /service 目录:
修改qmailctl脚本:
将下面内容加入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
添加完成之后,重启qmail服务,然后进行测试。
测试成功。
实验总结:
问题原因
这个问题是Qmail的经典问题,因为life with qmail中的pop3启动脚本中softlimit限制了默认的内存使用上限为2000000,而实际这是不够的
所以使用默认的脚本就会出现各种各样的连接110端口错误,常见的还有
 /usr/local/bin/tcpserver: error while loading shared libraries: 
   libc.so.6: failed to map segment from shared object: Cannot allocate memory
解决方案
修改pop3启动脚本
vi /var/qmail/supervise/qmail-pop3d/run
# 2000000改为3000000或者5000000保存退出
重启qmail服务,其实只要重启pop3就可以了,因为传统的qmail是用qmailctrl控制的,所以重启qmail比较方便一点
/path/to/qmailctl restart这样问题就已经解决了。