email - 我的qmail学习笔记
我的qmail学习笔记
2004-04-23 15:18 pm来自:Linux文档
现载:Www.8s8s.coM
地址:无名
日期:2003-06-23 23:31
本人为一网络菜鸟,失业家中已月余,本着边学习边等待机会的想法,开始学习qmail,以下是本人的学习笔记:
一:安装环境
安装平台:RedHat Linux6.2
安装机器:Vmware虚拟机(虚拟出两张网卡IP分别为192.168.1.1&2)
软件包:
bind-8.2.4.tar.gz DNS服务器软件
qmail-1.03.tar.gz qmail基本系统
qmail-103.patch qmail补丁
checkpassword-0.90.tar.gz 系统用户口令验证程序
ucspi-tcp-0.88.tar.gz tcpserver等服务程序用以取代inetd
daemontools-0.70.tar.gz qmail进程守护工具
isoqlog-1.7.tar.gz qmail日志分析工具
mysql-3.23.33.tar.gz mysql数据库软件
apache_1.3.20.tar.gz 老牌的web服务器软件
php-4.0.6.tar.gz php解析软件
vpopmail-4.9.10.tar.gz 虚拟域及其用户管理工具
courier-imap-1.3.10.tar.gz qmail支持imap的工具包
ezmlm-0.53.tar.gz 邮件列表管理
autorespond-2.0.2.tar.gz 自动回复程序
qmailadmin-0.80.tar.gz 邮件域及用户WEB管理
sqwebmail-3.3.7.20020910.tar.gz Webmail
netmania-1.0.2.tar.gz Webmail(可选)
igenus_2_20010904_snap Webmail(可选)
vqsignup-0.5.tar.gz web方式用户注册
vqregister-2.6.tar.gz web方式用户注册(可选)
rblsmtpd-0.70.tar.gz 反垃圾邮件程序
以上所列软件可以构建一个基本的支持多域及上百万用户的E-mail服务器。其实还有很多的qmail扩展程序,比如qmail与ldap的集成,扫病毒程序等等。利用丰富的第三方扩展软件,可以构建出功能更为强大的邮件服务器!
下面正式开始我的qmail学习笔记! :)
二:构建最基本的基于系统帐户的qmail服务器
由于是学习目的,所以我会首先构建最基本的qmail系统,邮件帐号没有与系统帐号分离,没有多余的功能。成功后再一步一步循序渐进的扩展qmail的功能。
1)实现DNS服务,使DNS中有邮件服务器的正确的MX记录。
#cp bind-8.2.4.tar.gz /usr/local/src (假定所有的程序包都拷贝到/usr/local/src下)
#tar xvfz bind-8.2.4.tar.gz
#cd bind-8.2.4
#make
#make install
编译安装完成后
#vi /etc/named.conf
文件内容如下:
options {
directory "/var/named";
};
zone "dream.com"{
type master;
file "dream.com";
};
zone "0.0.127.in-addr.arpa"{
type master;
file "named.local";
};
zone "1.168.192.in-addr.arpa"{
type master;
file "192.168.1";
};
由于只是在内部局域网内测试所以没有加上根域信息"."
创建/var/named目录
#mkdir /var/named
分别创建dream.com、named.local、192.168.1三个文件
#cd /var/named
#vi dream.com 内容如下:
$TTL 86400
@ IN SOA www.dream.com. root.www.dream.com. (
2003062301 ; serial
28800 ; refresh
14400 ; retry
3600000 ; expire
86400 ; default_ttl
)
IN NS www.dream.com.
IN MX 5 mail.dream.com.
IN MX 10 mail2.dream.com.
www IN A 192.168.1.1
mail IN A 192.168.1.2
mail2 IN A 192.168.1.3
ftp IN CNAME www
#vi 192.168.1 内容如下:
$TTL 86400
@ IN SOA www.dream.com. root.www.dream.com. (
2003062302 ; serial
28800 ; refresh
14400 ; retry
3600000 ; expire
86400 ; default_ttl
)
IN NS www.dream.com.
1 IN PTR www.dream.com.
2 IN PTR mail.dream.com.
3 IN PTR mail2.dream.com.
#vi named.local 内容如下:
$TTL 86400
@ IN SOA www.dream.com. root.www.dream.com. (
2003062303 ; serial
28800 ; refresh
14400 ; retry
3600000 ; expire
86400 ; default_ttl
)
IN NS www.dream.com.
1 IN PTR localhost.
#vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.1.1 www.dream.com www
192.168.1.2 mail.dream.com mail
192.168.1.3 mail2.dream.com mail2
注:192.168.1.3为局域网另一台运行E-mail服务(Imail)的Windows 2000服务器,用其和linux平台下的E-mail服务器做测试用)
#vi /etc/host.conf
order hosts,bind
multi on
#vi /etc/resolv.conf
search dream.com
nameserver 192.168.1.1
启动运行DNS服务器:
#ndc start
测试DNS服务器:
#nslookup
>set type=mx
>dream.com
Server: 192.168.1.1
Address: 192.168.1.1#53
dream.com mail exchange=5 mail.dream.com
dream.com mail exchange=10 mail2.dream.com
DNS 服务已设置完毕,接下来我们要开始我们真正的qmail学习历程啦!
2)安装qmail
在安装qmail之前要运行ntsys命令关闭sendmail服务,再用rpm -e --nodeps sendmail卸载掉sendmail
#tar xvfz qmail-1.03.tar.gz
创建qmail安装目录
#mkdir /var/qmail
建立qmail相应的组及用户
#groupadd nofiles
#useradd -g nofiles -d /var/qmail/alias alias
#useradd -g nofiles -d /var/qmail qmaild
#useradd -g nofiles -d /var/qmail qmaill
#useradd -g nofiles -d /var/qmail qmailp
#groupadd qmail
#useradd -g qmail -d /var/qmail qmailq
#useradd -g qmail -d /var/qmail qmailr
#useradd -g qmail -d /var/qmail qmails
编译qmail前先对qmail打补丁
#patch -p0 <qmail-103.patch
#cd qmail-1.03
#make setup check
#./config
如果域名解析没有问题的话应该可以看到安装成功的信息
也可以运行config-fast脚本不进行这一步
#./config mail.dream.com
对某些不能接收邮件的系统帐户添加别名
#cd /var/qmail/alias
#echo admin > .qmail-root
#echo ezboy > .qmail-postmaster
#echo ezboy > .qmail-mailer-daemon
#chmod 644 /var/qmail/alias/.qmail*
3)创建qmail启动脚本
#cp /var/qmail/boot/home /var/qmail/rc
#vi /var/qmail/rc
将其中的“./Mailbox”改为“./Maildir/“
启动qmail只用输入:
#csh -cf /var/qmail/rc &
"&"表明在后台执行
4)启动SMTP和POP3服务
首先注释掉/etc/inetd.conf文件中有关SMTP和POP3的行,然后加上:
smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env
tcp-env /var/qmail/bin/qmail-smtpd
注意""不用输入,它代表前后的内容为一行内容(整行输入)
确认一下/etc/services文件中有下面这一行
pop3 110/tcp pop-3
启动pop前要先安装一个口令验证程序 checkpassword
#cd /usr/local/src
#tar xvfz checkpassword-0.90.tar.gz
#make setup check
此程序安装到/bin目录下
然后在/etc/inetd.conf下加入:
pop3 stream tcp nowait root /var/qmail/bin/qmail-popup qmail-popup mail.dream.com /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir
切记整行输入!!!
5)创建邮件用户
#useradd test
#passwd test
#su test
$/var/qmail/bin/maildirmake Maildir
$echo ./Maildir/ > .qmail
6)测试POP3及SMTP服务启动与否
#telnet 127.0.0.1 110
Trying 127.0.0.1 ......
Connected to 127.0.0.1
Escape character is '^]'
+OK [email protected]
user test
+OK
pass test的密码
+OK
如果看到以上内容说明POP3服务已经启动
#telnet 127.0.0.1 25
Trying 127.0.0.1 ......
Connected to 127.0.0.1
Escape character is '^]'
220 mail.dream.com ESMTP
Helo mail.dream.com
SMTP服务也已正常启动
下面用Outlook Express等邮件客户端来测试。
小结:配置DNS时要注意书写,一般用Tab键来分隔每组字符。编辑 /etc/inetd.conf时也要注意书
写时应是一整行写完。
疑问:测试时邮件帐户形如[email protected]时会提示密码错误(在本机上无错误),改为user反而
可以正常收发邮件,不知何解,请高手指教!
三:用ucspi中的tcpserver取代传统的inetd而获得更好的性能和安全性.
仍然是在/usr/local/src目录下
#tar xvfz ucspi-tcp-0.88.tar.gz
#cd ucspi-tcp-0.88
#make setup check
安装完毕后检查/etc/inetd.conf将所有与POP3及SMTP相关的语句注释掉,然后重新启动inetd:
#killall -HUP inetd
在系统启动文件/etc/rc.d/rc.local中添加以下语句来启动SMTP和POP3服务:
#!/bin/sh
#start smtp service
echo "Starting the smtp service ……"
QMAILDUID=`/usr/bin/id -u qmaild`
NOFILESGID=`/usr/bin/id -g qmaild`
/usr/local/bin/tcpserver -H -R -c 20
-u "$QMAILDUID" -g "$NOFILESGID" 0 smtp
/var/qmail/bin/qmail-smtpd 2>&1 > /dev/null &
#start pop3 service
echo "Starting the pop3 service ……"
/usr/local/tcpserver -l 0 -H -R 0 pop-3
/var/qmail/bin/qmail-popup mail.dream.com
/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &
以下是TCPSERVER的参数列表:
TCPSERVER的一般参数:
参数 说明
-q 安静模式,不输出任何错误信息
-Q 只输出错误信息(缺省)
-v 详细模式,输出错误和状态信息
TCPSERVER的连接参数:
参数 说明
-B text 在连接建立后显示text的内容
-c n 最大的同步连接数目,当有n个同步连接时,将延缓对新连接请求的 响应,直到有连接结束,n必须是一个正的整数,缺省值为40
-d 当主机响应慢时延缓向远端主机发送数据
-D 不延缓向远端主机发送数据
-g gid 接受连接时所要响应的系统用户组的ID,gid必须为正的整数
-l 输出本机端口号到stdout
-o 不对在连接的帧改变其IP设定
-0 删除路由帧的IP设定(缺省)
-u uid 接受连接时所要响应的系统用户的ID,uid必须为正的整数
-x db 以数据库db所定义的规则确定是否接受远端客户的连接
-X 当-x定义的数据库不存在时允许所有的连接
TCPSERVER的数据收集参数:
参数 说明
-h 以DNS查询远端主机名
-H 不以DNS查询远端主机名,为避免循环,此参数必须用于端口53
-l hostname 不以DNS查询本机主机名,使用hostname作为本机主机名。为避免循 环,此参数必须用于53端口
-r 从远端主机获取系统变量$TCPREMOTEINFO
-R 不从远端主机获取系统变量$TCPREMOTEINFO,必须在端口53和113中使用 此参数
-t n 在n秒以后停止获取系统参数$TCPREMOTEINFO
小结:还是老生常谈,修改/etc/rc.d/inetd.conf时要注意书写,注意o和0的区别,另外就是要一
行写完。还有一点就是写POP3启动脚本时 pop-3要和/etc/services中相一致,若/etc/
services中书写为pop3时inetd.conf中也要改为pop3(只是本人安装时的一点体会,不知正
确与否?)
四:qmail的进程工具daemontools
daemontools可以监测qmail服务、停止和启动qmail服务,记录qmail运行日志(multilog)
其中最主要的程序是supervise它监测进程的运行,如果进程因为其他原因中断或者停止,它会自动的重启这个服务进程,从而提高qmail邮件服务的可靠性。另一个重要程序是multilog,用以取代unix中原有的日志程序。因为它更安全,效率更高。
安装daemontools
#tar xvfz daemontools-0.70.tar.gz
#cd /usr/local/daemontools-0.70
#make
#make setup check
所有程序将被安装到/usr/local/bin目录下。
Daemontools软件包所包含的程序及其功能
程序 功能叙述
Envdir 在预设的系统环境中运行一个程序
Envuidgid 在预设的用户和用户组ID的系统环境中运行一个程序
Fghack 禁止一个程序以后台模式运行
Multilog 系统日志程序
Setlock 以预设的文件系统锁运行一个程序
Setuidgid 以预设的用户和用户组运行一个程序
Softlimit 以预设的系统资源限制运行一个程序
Supervise 启动并监测一个进程,如果这个进程中断或者停止,自动启动这个进程
Svc 控制以supervise启动的进程,允许系统管理员启动和停止这个进程
Svok 监测一个supervise进程是否在运行
Svscan 启动和监测多个supervise进程
Svstat 反回supervise监测的进程的状态
Tai64n 在日志中增加一个tai64n的时间戳
Tai64nlocal 将tai64n时间戳转换成本地时间和时间
首先停止所有的qmail进程:
#killall qmail-send
为supervise创建相应的运行目录:
#mkdir /var/qmail/supervise
#mkdir /var/qmail/supervise/qmail-send
#mkdir /var/qmail/supervise/qmail-smtpd
#mkdir /var/qmail/supervise/qmail-pop3d
#mkdir -p /var/qmail/supervise/qmail-send/log
#mkdir -p /var/qmail/supervise/qmail-smtpd/log
#mkdir -p /var/qmail/supervise/qmail-pop3d/log
#chmod +t /var/qmail/supervise/qmail-send
#chmod +t /var/qmail/supervise/qmail-smtpd
#chmod +t /var/qmail/supervise/qmail-pop3d
创建相应的日志存放目录
#chmod -p /var/log/qmail/qmail-smtpd
#chmod -p /var/log/qmail/qmail-send
#chmod -p /var/log/qmail/qmail-pop3d
#chown -R qmaill /var/log/qmail
创建qmail文件,内容如下:
#!/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
echo "pausing qmail-pop3d"
svc -p /var/qmail/supervise/qmail-pop3d
;;
cont)
echo "Continuing qmail.send"
svc -c /var/qmail/supervise/qmail-send
echo "Continuing qmail.smtpd"
svc -c /var/qmail/supervise/qmail-smtpd
echo "Continuing qmail-pop3d"
svc -c /var/qmail/supervise/qmail-pop3d
;;
restart)
echo "Restarting qmail:"
echo "* Stopping qmail-smtpd."
svc -d /var/qmail/supervise/qmail-smtpd
echo "* Stopping qmail-pop3d."
svc -d /var/qmail/supervise/qmail-pop3d
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
echo "* Restarting qmail-pop3d."
svc -u /var/qmail/supervise/qmail-pop3d
;;
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 <<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 .. 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相应的服务,将这个qmail文件拷贝到/etc/rc.d/init.d下,然后执行以下命令:
#chmod 755 /etc/rc.d/init.d/qmail
#ln -s /etc/rc.d/init.d/qmail /usr/local/sbin
#ln -s /etc/rc.d/init.d/qmail /etc/rc.d/rc3.d/S80qmail
#ln -s /etc/rc.d/init.d/qmail /etc/rc.d/rc5.d/S80qmail
在/var/qmail/supervise/qmail-send目录下创建名为run的文件,内容为:
#!/bin/sh
exec /var/qmail/rc
在/var/qmail/supervise/qmail-smtpd目录下创建名为run的文件,内容为:
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
exec /usr/local/bin/softlimit -m 2000000
/usr/local/bin/tcpserver -v -p -x /etc/tcp.smtp.cdb -c 20
-u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
在/var/qmail/supervise/qmail-pop3d目录下创建名为run的文件,内容为:
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
exec /usr/local/bin/softlimit -m 2000000
/usr/local/bin/tcpserver -l 0 -H -R 0 pop-3
/var/qmail/bin/qmail-popup mail.dream.com
/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir
在/var/qmail/supervise/qmail-smtpd/log目录下创建run文件:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/qmail-smtpd
在/var/qmail/supervise/qmail-send/log目录下创建run文件:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t
/var/log/qmail/qmail-send
在/var/qmail/supervise/qmail-pop3d/log目录下创建run文件:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t
/var/log/qmail/qmail-pop3d
然后要改变这些文件的属性以使它们可以运行:
#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
#chmod 755 /var/qmail/supervise/qmail-pop3d/run
#chmod 755 /var/qmail/supervise/qmail-pop3d/log/run
最后:
#vi /etc/tcp.smtp
运行qmail start启动qmail吧!