qmail基本介绍

12/3/2006来源:Qmail人气:7906

『qmail的运行程序』

qmail是一个模块化设计的邮件系统,每一个子功能都是由一个运行程序来实现的,而每个程序的属性以及运行方式由一个或多个配置文件和环境变量来控制的。在qmail安装成功和启动以后,qmail的相关进程一直在内存中驻留,qmail会不断扫描邮件队列,并且把邮件投递到正确的目的地址。
运行ps命令可以查看到qmail的相关进程:
#ps –ax | grep qmail
0:00.00 grep qmail
23282 con- I 0:00.77 qmail-send
23289 con- I 0:00.21 splogger qmail
23290 con- I 0:00.13 qmail-lspawn ./Mialdir/
23291 con- I 0:00.03 qmail-rspawn
23292 con- I 0:00.05 qmail-clean
qmail所有的运行程序都安装在/var/qmail/bin目录下。比较重要的运行程序如下:

1. qmail-smtpd
它的作用是接收远端主机投递的邮件,然后将邮件传递给qmail-queue进行处理。qmail-smtpd是通过SMTP协议和远端主机惊醒通讯的。qmail-smtpd并不是常驻内存的,他需要一个外部程序来激活,本文所做的系统是使用tcpserver来激活的。Tcpserver监视着系统的ip连接请求,如果检测到有SMTP的连接请求,tcpserver就会自动的激活qmail-smtpd,然后将IP连接的控制权交给qmail-smtpd,一旦qmail-smtpd和远端主机建立起SMTP连接后,远端主机就可以将邮件投递到本地的邮件服务器了。

2. qmail-inject
它的作用是接收本地生成并投递的邮件,并把邮件传递给qmail-queue来处理。在邮件传递给qmail-queue之前,qmail-inject先扫面邮件的邮件头,来查看邮件头是否符合RFC822标准,如果不符合它将会自动的更改和修正这个邮件的邮件头。

3. qmail-send
当一个邮件被放入邮件队列之后,qmail-send就开始对该邮件进行处理,。它会检查邮件队列中的每一个邮件的状态,对于没有投递过的和投递暂时失败的邮件,对于没有投递过和投递暂时失败的邮件,qmail-send会将目标地址是本地主机的传递给qmail-lspawn,目标地址是远端主机的传递给qmail-rspawn,对于投递永久失败的邮件,qmail-send将会把该邮件传递给qmail-clear,让这个程序永久删除这个邮件。qmail-send是一个常驻内存进程程序,如果qmail-send中止,qmail的其他进程将会自动中止。

4. qmail-clean
它的作用是从邮件队列中删除投递永久失败的邮件。qmail使用多种状态标示来标记邮件,每个邮件在每一次被处理后它的状态表示都会被改变。如果系统当机,系统重新启动以后,qmail-send仍然可以找到邮件队列中上次最后一次成功处理过的邮件的位置,并且从这里重新开始处理邮件队列。如果由于其他原因造成qmail-send不能处理的邮件队列,qmail-send会调用qmail-clean从邮件队列中删除邮件。qmail-clean也是常驻内存的进程。

5. qmail-rspawn
当qmail-send判明邮件目标地址是远端邮件服务器时,qmail-send就会将邮件交给qmail-rspawn,qmail-rspawn的作用是调度邮件的投递时间和顺序,然后激活qmail-remote来进行投递。qmail-rspawn还有一个作用是决定每一个邮件的目标邮件服务器,每次和远端邮件服务器的连接都会调用qmail-remote一次。qmail-rspawn也是常驻内存的进程。

6. qmail-lspawn
功能和qmail-rspawn类似,qmail-lspawn也是被qmail-send调度来投递邮件的,不过qmail-lspawn是负责目标地址是为本地邮件服务器的邮件。

7. qmail-remote
它的作用是通过SMTP协议将邮件投递到远端的用户。邮件是通过qmail-rspawn传递过来的,qmail-remote每次只可以同一个远端主机连接,不过在连接时qmail-remote可以投递这个远端主机上的多个接收者的邮件。投递当中的调度是由qmail-rspamwn来负责的。

8. qmail-local
它的作用是投递本地邮件服务器的邮件。这个程序通常是用来检测因为转发命令使用不当造成的邮件循环故障。

9. qmail-queue
他处理从qmail-inject和qmail-smtpd传递过来的邮件,并把这些邮件传递到邮件队列中,它会扫描每个邮件的发送者和接收者的地址,一般传递给qmail-queue的邮件的标示都是为0,如果为1时,它会认为这个邮件的发送者和接收者的地址要经过特殊格式的处理。
qmail的配置文件是由多个文件组成的,不是集中在一个文件中,每个文件控制相应部分的功能和属性,一个可执行程序可能有多个配置文件控制,所有的配置文件共同决定了qmail运行的实现和模式。这些配置文件都在qmail的control目录中,一般位于位于/var/qmail/control目录中。

『qmail的配置文件』


1. badmailfrom
这个配置文件是控制邮件系统拒绝接收的邮件地址和邮件域,主要是为了防止垃圾邮件。如果一个邮件地址或者邮件域被列入到这个文件中,系统就会拒绝接收这个邮件地址发来的邮件,或者拒绝邮件域下所有邮件地址发来的邮件。不过这个配置文件只是一般的垃圾邮件防范手段,对于比较全面的垃圾邮件过滤技术还要靠第三方软件来实现。该文件的格式如下:
11@11.com //拒绝这个地址发来的邮件
22@2w.com
@33.com //拒绝这个邮件域下的所有帐号发来的邮件
@44.com

2. boucefrom
bouceform是定义当邮件投递失败时系统返回给发送者一个包含失败信息的邮件时的发送者。如果不存在这个文件,默认的发送者是MAILER-DAEMON。比如本文的
echo postmaster > /var/qmail/control/bouncefrom
就是定义投递者为postmaster,这样所有投递失败的返回邮件的发送者就成了postmaster。

3. concurrencylocal
这个文件定义了qmail可以同时投递的本地邮件的个数。这个参数的缺省值是10,也就是说系统允许同时有10个邮件在本地投递。concurrencylocal这个参数的最大值是由编译时的conf-spawn参数来决定的,缺省值是120,最大值是255。

4. concurrencyremote
这个参数定义了qmail可以同时投递的远端邮件的个数,这个参数的缺省值是20。这个参数的最大值也是由conf-spawn来决定的。

5. defaultdomain
它主要用于邮件用户在投递给同一邮件服务器的邮件用户时的邮件投递处理,比如邮件服务器cnunix.com.cn用户user发送邮件给另一个邮件用户user1@cnunix,这实qmail-inject会将defaultdomain中定义的邮件域名加入到这个邮件的目标地址中,qmail会自动认为这个邮件的目标地址是user1@cnunix.com.cn,并按照这个地址进行投递。当这个文件不存在的时候,qmail会从配置文件me中读取这个参数。如果系统变量QMAILDEFAULTDOMAIN已经设置,defaultdomain定义的参数将被忽略。

6. defaulthost
它和defaultdomain类似,当邮件系统接收到没有目标主机名的邮件时,这个设置文件定义了系统往这个邮件中加入的目标主机名名称。在缺省情况下,qmail-inject会将defaulthost中定义的名称加入到没有定义投递邮件地址的邮件的目标主机名中,如果defaulthost不存在,加入的目标主机名将时字符串“defaulthost”,defaulthost主要用于邮件用户在投递给同一邮件服务器的邮件进行投递处理。如果系统变量QMAILDEFAULTHOST已经设置,defaulthost定义的参数将被忽略。

7. databyes
它定义了qmail-smtpd所允许接收的邮件的最大字节数。这个参数的缺省值为0,表示对接收邮件的字节数没有限制。如果要限制最大的接收为10M,操作如下:
echo 10485760 > /var/qmail/control/databytes
这是任何大于10M的邮件都会被拒绝。这个参数最好设置上,以避免恶意的对你服务器发送大量的超大邮件,产生邮件服务器负荷过大,甚至系统崩溃的危险。

8. doublebouncehost
这个配置文件定义了出现“双重反弹”的时候,系统转发的邮件的主机名称。“双重反弹”就是当系统因为投递失败将邮件返回给发送者时,发送者又将此邮件返回,这个时候qmail将会把这个邮件转发到另一个邮件地址,一般这个地址就是管理员的地址。doublebouncehost就是定义这个转发的邮件地址的主机名部分,而这个邮件地址的用户名部分是由doublebouceto来定义的,因此这两个配置文件一般都是结合起来使用的。当doublebouncehost不存在的时候,系统将会从配置文件me中读取这个参数

9. doublebounceto
这个参说是结合blebouncehost来使用的,当这个参数不存在的时候,系统缺省值是postmaster用户。

10. helohost
这个配置文件定义了当程序qmail-remote和远程邮件系统建立连接时所使用的主机名。如果这个配置文件不存在,系统将会从配置文件me中读取这个参数值,如果me不存在,qmail-remote将不能正常运行工作。

11. locals
这个配置文件是定义本地邮件域的,在qmail-send处理邮件投递时,将会使用locals定义的值和邮件的目标地址进行比较,如果相同,系统就会将这个邮件投递到本地交给qmail-lspawn来处理。如果一个邮件的目标主机名在locals找不到,系统将会把这个邮件投递到远端邮件服务器系统,即使这个邮件的目标地址可能是本地邮件系统的。如果locals不存在,系统将会从配置文件me中读取这个参数,如果me不存在,qmail-send将不能正常运行。

12. me
这个配置文件是qmail系统十分重要的一个文件,如果这个文件不存在,qmail系统将无法运行。me是用来定义本地邮件服务器的主机名的,上面已经介绍到了,有多个配置文件是和me有关联的,如果那些配置文件不存在系统默认会从me中读取参数值的。me这个配置文件一般都是在qmail系统安装时使用configure-fast来创建的,在上面qmail系统安装的时候已经使用过了这个参数。

13. queuelifetime
这个配置文件是定义一个邮件在邮件队列中存活的时间,缺省值为7天(604800s),这个期限掉了以后qmail-send将会进行最后一次的投递尝试,如果投递失败,该邮件将会从邮件队列中删除。

14. rcphosts
这个配置文件也是qmail一个十分重要的文件,这个文件是定义系统允许转发邮件的邮件域,如果这个文件不存在或者为空,你的系统将会接收Internet上所有的域的邮件转发,即你的系统是Open relay。配置文件rcpthosts最多可以支持50个主机名和域名,如果超个这个数字,就需要保存到他的扩充配置文件morercphosts中,然后使用qmail的命令程序qmail-newmrh(在本系统中,该文件在/var/qmail/bin目录下)来生成二进制的morercpthosts.cdb文件,这样qmail-smtpd才可以从这个二进制文件中读取信息。

15. virtualdomains
这也是qmail的一个非常重要的配置文件,它定义了qmail的虚拟邮件域,qmail结合vpopmail的虚拟域管理功能可以定义多个虚拟邮件域。

16. smtPRoutes
这个配置文件是定义qmail邮件系统的静态SMTP路由表信息的,他的格式应该是:
HOST: targetHOST //HOST可以是主机名或者域名。这行所表示的是意思是将所有目标是HOST的邮件转发到targetHOST邮件服务器中,这个是最常规的表示方式。
下面给一些例子和一些特殊的表示方法:
cnunix.com.cn:cnunix.com //这行表示的意思是将所有发往cnunix.com.cn的邮件全部转发到cnunix.com这个邮件服务器。qmail不会在cnunix.com.cn邮件服务器中投递时查询DNS中的MX记录,直接投递到cnunix.com邮件服务器中,加快了投递的速度。
.cnunix.net: //这行表示强迫qmail对DNS的MX记录进行查询,因为没有定义转发的主机名,qmail将在DNS中查询任何以.cnunix.net结尾的邮件服务器
:mail.cnunix.com.cn:2525 //这行定义表示所有发往该机器的所有邮件都将会转发到mail.cnunix.com.cn这个邮件服务器,并且转发到对方的2525端口,这个方式一般都是做邮件网关时用的到的。

注意:smtproutes如果设置不正确或者DNS的变动会产生邮件的循环投递。

17. timeoutconnect
这个配置文件定义了qmail-remote在和远端SMTP服务器在SMTP连接断开以前接受一个新的连接等待的最大时间(单位为秒s),默认值为一分钟(60s)。如果你的网络连接速率比较低,就需要相应的调整这个参数到一个适合的值。

18. timeoutremote
这个配置文件定义了qmail-remote等待远端的SMTP服务器相应时等待的最大时间,默认值为20分钟(1200s),如果到达这个最大值没有相应,qmail才和对方断开连接并且把失败的记录写到qmail的日志中。

19. smtpgreeting
这个配置文件定义了用户在登录SMTP服务时显示的系统欢迎信息。修改这个信息可以掩盖一些你的系统的本身的信息,可以相对的迷惑一下登录者。:)


『qmail邮件投递工作基本原理』

qmail-inject负责接收本地邮件用户投递的邮件,qmail-smtpd负责接收远端邮件用户投递的邮件,交给程序qmail-queue处理后放入邮件队列,qmail-send会依次检查邮件队列中的状态,如果邮件的状态时投递永久失败,qmail-send会调用qmail-clean将邮件从邮件队列中删除,如果邮件状态是没有投递过或者是暂时失败,qmail-send会把投递到本地邮件服务器的邮件传递给qmail-lspawn,把投递到远程邮件服务器的邮件传递给qmail-rspawn,qmail-lspawn会调度邮件投递的序列和时间,然后让qmail-local将邮件投递到本地邮件用户的邮箱中,qmail-rspawn也会调度邮件的投递序号和时间,然后调用qmail-remote将邮件投递到远端用户的邮箱中。


后记:

这几天本来想做一个qmail结合vpopmail虚拟域管理、openldap用户信息存储认证信息、日志统计等mail服务器,然后写一份详细的安装和软件的基本原理的文档。但是由于种种原因没有成功,至于什么时候能做好我自己也不是很清楚,嘻嘻。先将我这篇没有完成的文档的qmail基本介绍部分贴出来,供大家对qmail有一个基本的认识作参考,同时有什么错误的地方也忘指出来,到时候误导各位我就有愧了。

,