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时,它会认为这个邮件的发送者和接收者的地址要经过特殊格式的处理。