qmail基本工作原理
qmail邮件投递工作基本原理:qmail-inject负责
qmail的使用简介
编译前修改系统参数。
建立qmail工作目录:
默认情况下,qmail原代码会把qmail的目录设置成/
qmail配置参数:
1. badmailfrom
这个配置文件是控制邮件系统拒绝接收的邮件地址和邮件域,
11@11.com //拒绝这个地址发来的邮件
22@2w.com
@33.com //拒绝这个邮件域下的所有帐号发来
@44.com
2. boucefrom
bouceform是定义当邮件投递失败时系统返回给发送者一个
echo postmaster > /var/qmail/control/bouncefrom
就是定义投递者为postmaster,
3. concurrencylocal
这个文件定义了qmail可以同时投递的本地邮件的个数。
4. concurrencyremote
这个参数定义了qmail可以同时投递的远端邮件的个数,
5. defaultdomain
它主要用于邮件用户在投递给同一邮件服务器的邮件用户时的邮件投
6. defaulthost
它和defaultdomain类似,
7. databyes
它定义了qmail-smtpd所允许接收的邮件的最大字节数。
echo 10485760 > /var/qmail/control/databytes
这样任何大于10M的邮件都会被拒绝。
8. doublebouncehost
这个配置文件定义了出现“双重反弹”的时候,
9. doublebounceto
这个参说是结合blebouncehost来使用的,
10. helohost
这个配置文件定义了当程序qmail-remote和远程邮件系
11. locals
这个配置文件是定义本地邮件域的,在qmail-send处理邮
12. me
这个配置文件是qmail系统十分重要的一个文件,
13. queuelifetime
这个配置文件是定义一个邮件在邮件队列中存活的时间,缺省值为7
14. rcphosts
这个配置文件也是qmail一个十分重要的文件,
15.virtualdomains
这也是qmail的一个非常重要的配置文件,它定义了qmail
16. smtproutes
这个配置文件是定义qmail邮件系统的静态SMTP路由表信息
HOST: targetHOST //HOST可以是主机名或者域名。
下面给一些例子和一些特殊的表示方法:
cnunix.com.cn:cnunix.com //这行表示的意思是将所有发往cnunix.com.cn的邮
.cnunix.net: //这行表示强迫qmail对DNS的MX记录进行查询,
:mail.cnunix.com.cn:2525 //这行定义表示所有发往该机器的所有邮件都将会转发到mail
注意:smtproutes如果设置不正确或者DNS的变动会产
17. timeoutconnect
这个配置文件定义了qmail-remote在和远端SMTP服
18. timeoutremote
这个配置文件定义了qmail-remote等待远端的SMTP
19. smtpgreeting
这个配置文件定义了用户在登录SMTP服务时显示的系统欢迎信息
解决qmail DNS的问题:
qmail 1.03版本有个很龌龊的问题,就是默认情况下,qmail无法
这里我门采用更简单直接的办法修改dns.c源码,在dns.c
static union{ HEADER hdr; unsigned char buf[PACKETSZ]; }response;
编译代码前,把这里的PACKETSZ的值改为65536就可以
编译qmail 源码:
一但你安置前面的说明配置完你的配置文件,就可以对qmail进
qmail的基本结构
编译安装完qmail后,会在你的安装目录下生成下面这些目录。
alias 包含qmail别名文件
bin 包含所有qmail可执行文件
boot 包含在不同邮件环境下启动的qmail脚本
control 包含qmail所有配置控制文件
doc 包含qmail文档文件
man 包含qmail帮助文件
queue 包含qmail邮件队列目录
users 包含为qmail-lspawn创建任何qmail用
运行ps命令可以查看到qmail的相关进程:
#ps –ax | grep qmail
下面介绍几个主要的qmail程序的用途。 这些配置文件都在qmail的control目录中,
1. qmail-clean 用来从邮件队列中将那些看起来已经投送失败的未发送消息删除掉。 qmail使用多种状态标示来标记邮件,
2. qmail-inject 用来把新的消息插入到邮件队列中去。在邮件传递给qmail-
3. qmail-local 是被qmail用来将消息投送给邮件服务器上的一个本地用户。 这个程序通常是用来检测因为转发命令使用不当造成的邮件循环故障
4. qmail-lspawn 用来调度本地邮件系统上的邮件投送进程的。 是负责目标地址是为本地邮件服务器的邮件。
5. qmail-pop3 是一个pop3服务程序的qmail版本,它允许远程客户使用P
6. qmail-popup 是用在与qmail-pop3d程序的连接上的。Qmail-
7. qmail-qmtpd 用来接收来自远程客户端的qmail连接的。一但请求接收到,
8. qmail-queue 用来处理来自qmail-inject 和 qmail-smtpd程序的邮件消息。
9. qmail-remote程序是用来把邮件消息投送给远程目的邮
10. qmail-rspawn是被qmail-send程序调用,
11. qmail-send 用在当消息成功放到邮件队列中后,qmail-send 程序就被调用来处理消息。
12. qmail-smtpd 用来监听来自远程邮件服务器的网络连接请求。
13. splogger 用来向系统登陆日志程序插入项的。
安装配置实例
环境:redhat9.0, qmail-1.03, ucspi-tcp-0.88, checkpassword-0.90.
所需软件包
qmail-1.03.tar.gz (http://www.qmail.org)
ucspi-tcp-0_88_tar.gz (http://cr.yp.to/ucspi-tcp.
checkpassword-0_90_tar.gz (http://cr.yp.to/checkpwd.html
1. 卸载SendMail邮件系统
由于大多数Linux发行版本中都预装了SendMail邮件系
前最好卸载SendMail邮件服务器,使用如下命令:1
2
3
4
5#ntsysv (取消系统boot时启动SendMail) 也可以用setup程序来实现。
#mv /usr/lib/sendmail /usr/lib/sendmail.bak
#mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
#mv /usr/bin/newaliases /usr/bin/newaliases.bak
#mv /usr/bin/mailq /usr/bin/mailq.bak
2.配置qmail编译前的一些设置。
a)先在qmail的控制文件me中写入本地机器的域名1
echo magicunix.com > /var/qmail/control/me
或者1
./config-fast magicunix.com
b)建立相应的配置文件,使用如下命令:1
2
3#cd /var/qmail/alias
#touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
#chmod 644 .qmail*
c)给root用户建立个别名用户alias1
echo alias > /var/qmail/alias/.qmail-root
( 这里我把用户alias作为root 用户的别名)
d)配置qmail的主目录
这里采用qmail默认目录,所以不需要修改任何地方。
e)设置qmail系统用户组:1
2
3#cd /usr/sbin/
#./groupadd nofiles
#./groupadd qmail
f)设置qmail系统用户:1
2
3
4
5
6
7
8#cd /usr/sbin/
#./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
#./useradd -g qmail -d /var/qmail qmailq
#./useradd -g qmail -d /var/qmail qmailr
#./useradd -g qmail -d /var/qmail qmails
g)解决qmail源码的几个问题:
DNS问题:
在dns.c文件的第24行1
static union{ HEADER hdr; unsigned char buf[PACKETSZ]; }response;
把这里的PACKETSZ的值改为65536。
编译时出现errno没有定义的错误问题:
在qmail原代码里的error.h文件的头部填加一条:#
3. 安装qmail软件包
a)手工创建/var/qmail目录。1
#mkdir /var/qmail
b) 编译qmail源代码并安装,使用如下命令:1
2
3#tar zxvf qmail-1.03.tar.gz
#cd qmail-1.03
#make setup check
c) 选择邮件的存储方式:
这里采用$(HOME)/Maildir 方式1
#cp /var/qmail/boot/home /var/qmail/rc
执行完rc内的内容应该为:1
2
3
4
5#!/bin/sh
# Using splogger to send the log through syslog.
# Using qmail-local to deliver messages to ~/Mailbox by default.
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir splogger qmail
4. 建立启动qmail的shell文件start.sh,1
2#cat > start.sh
csh -cf ‘/var/qmail/rc &'
5. 添加Pop3和SMTP服务
可以使用xinetd超级服务器或TcpServer来建立相应1
2
3#tar zxvf ucspi-tcp-0_88_tar.gz
#cd ucspi-tcp-0.88
#make setup check
如果编译出现没有定义errno的错误,在原文件的error.1
2
3#tar zxvf checkpassword-0_90_tar.gz
#cd checkpassword-0.90
#make setup check
建立tcpserver规则数据库:1
2
3
4
5
6
7
8#cd /usr/local/bin/
#cat > rules.txt
192.168\. : allow, RELAYCLIENT=""
192.168.1.10: deny
192.168.2\. :deny
:deny
#
#at rules.txt | tcprules rules.cdb rules.tmp
修改上面建立的启动脚本start.sh文件,1
2
3
4#cat start.sh
csh -cf ‘/var/qmail/rc &'
tcpserver -u 502 -g 501 -c 100 -x /usr/local/bin/rules.cdb 0 smtp /var/qmail/bin/qmail-smtpd &
tcpserver -c 100 0 pop3 /var/qmail/bin/qmail-popup magicunix.com /bin/checkpassword /var/qmail/bin/qmail-pop3d ./Maildir/ &
(注意: 最后一个参数必须和/var/qmail/rc中的qmail-
修改/var/qmail/control/rcpthosts
例如:1
2
3
4
5#cat /var/qmail/control/rcpthosts
magicunix.com
hryj.com.cn
sina.com.cn
openet.com.cn
6. 启动qmail进程
a)启动qmail1
2#cd /var/qmail
#./start.sh
b)检察qmail个进程是否启动正常:1
2
3
4
5
6#ps -ef | grep qmail
qmails 29052 29051 0 Aug23 ? 00:00:00 [qmail-send]
qmaill 29055 29052 0 Aug23 ? 00:00:00 [splogger]
root 29056 29052 0 Aug23 ? 00:00:00 qmail-lspawn ./Maildir
qmailr 29057 29052 0 Aug23 ? 00:00:00 [qmail-rspawn]
qmailq 29058 29052 0 Aug23 ? 00:00:00 [qmail-clean]
c)检查smtp是否已经开起:1
2
3
4
5
6
7
8
9# telnet localhost 25
Trying 127.0.0.1...
Connected to LINUX-SERVER (127.0.0.1).
Escape character is '^]'.
220 localhost.localdomain ESMTP Sendmail 8.12.8/8.12.8; Wed, 25 Aug 2004 17:44:43 +0800
QUIT(输入QUIT可以退出)
221 2.0.0 localhost.localdomain closing connection
Connection closed by foreign host.
#
检查pop3是否已经开器1
2
3
4
5
6
7
8
9# telnet localhost 110
Trying 127.0.0.1...
Connected to LINUX-SERVER (127.0.0.1).
Escape character is '^]'.
+OK <4114.1093427217@magicunix.com<wbr />>
QUIT (输入QUIT可以退出)
+OK
Connection closed by foreign host.
#
上面情况证明一切正常。
3.测试
a)建立测试用户。
为了实现测试,我门需要建立2个测试的系统帐号。1
2
3
4
5#cd /usr/sbin/
#./useradd test1
#passwd test1 (口令为test1)
#./useradd test2
#passwd test2 (口令为test2)
下面分别给用户test1,test2分配Maildir邮箱。1
2
3
4
5
6#su test1
$/var/qmail/bin/maildirmake Maildir
$echo ./Maildir > .qmail
#su test2
$/var/qmail/bin/maildirmake Maildir
$echo ./Maildir > .qmail
为了使root用户也能收mail?这样给root的别名用户a1
2
3#su alias
$/var/qmail/bin/maildirmake Maildir
$echo ./Maildir > .qmail
为了测试远程投送,这里我们引用两个email地址:hlxia
b)测试qmail本地投送。
首先准备一个RFC822格式的测试文件:1
2
3
4
5
6
7#su test1
$cat > test_mail1
to: test2
from: test1
subject:This is a local test mail.
This is a local test mail content ...
$
现在调用qmail-inject发送mail.1
$cat test_mail1 | /var/qmail/bin/qmail-inject
现在检查mail的本地投送是否成功。(//后面的是我的注释)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39$ telnet localhost 110
Trying 127.0.0.1...
Connected to LINUX-SERVER (127.0.0.1).
Escape character is '^]'.
+OK <4519.1093427483@magicunix.com<wbr />>
user test2 //验证用户名
+OK //返回OK说明正确
pass test2 //验证用户口令
+OK
list //列出此用户的邮件列表
+OK
1 427 //此用户现在一共有3封mail
2 424
3 424
.
retr 3 //查看mail 3的内容
+OK
Return-Path:
Delivered-To: test2@magicunix.com
Received: (qmail 4462 invoked by uid 0); 25 Aug 2004 09:51:03 -0000
Date: 25 Aug 2004 09:51:03 -0000
Message-ID: <20040825095103.4461.qmail@<wbr />magicunix.com>
to: test2@magicunix.com
from: test1@magicunix.com
subject:This is local a test mail.
This is a local test mail content ...
.
dele 1 //删除mail 1
+OK
list //从新查看mail 列表,发现mail已经不存在了。
+OK
2 424
3 424
.
quit //退出连接。
+OK
Connection closed by foreign host.
c)测试qmail远程投送。
首先准备一个RFC822格式的测试文件:1
2
3
4
5
6
7#su test1
$cat > test_mail2
to: hlxia@0-100.com.cn
from: test1
subject:This is a desc test mail.
This is a desc test mail content ...
$
现在调用qmail-inject发送mail.1
$cat test_mail2 | /var/qmail/bin/qmail-inject
打开
hlxia@0-100.com.cn信箱查看是否收到test
d)测试qmail别名投送。
首先准备一个RFC822格式的测试文件:1
2
3
4
5
6
7#su test1
$cat > test_mail3
to: root
from: test1
subject:This is a alias test mail.
This is a alias test mail content ...
$
现在调用qmail-inject发送mail.1
$cat test_mail3 | /var/qmail/bin/qmail-inject
检查alias用户是否收到发给root用户的mail1
2
3
4#su alias
$cd ~
$cd Madir/new
1093427463.4465.LINUX-SERVER
说明已经收到了。也可以用telnet localhost 110来打开mail,这里就不做了,具体请参考本地投送那节。
e)测试qmail群发。
首先准备一个RFC822格式的测试文件:1
2
3
4
5
6
7#su test1
$cat > test_mail4
to: postmaster
from: test1
subject:This is a postmaster test mail.
This is a postmaster test mail content ...
$
现在调用qmail-inject发送mail.1
$cat test_mail4 | /var/qmail/bin/qmail-inject
现在检查/var/qmail/alias/.qmail-
test1
test2
alias
hlxia
有4个用户,下面分别检查这4个用户是否都收到刚才发的test
f)用foxmail测试pop3是否工作正常。
找台能连接到主机的win机器,按下列方法配置foxmail:
电子邮件地址:test2@magicunix.com
SMTP:magicunix.com
POP3:magicunix.com
然后测试连接。如果一切正常,就可以连接上了。然后收一下mai
g)测试tcpserver的规则数据库过滤smtp的功能。
简单的tcpserver规则数据库创建及使用方法一节中有详细