本文出自《网管员世界》2004年第2期 |经验技巧|栏目一般来说,邮件服务器接收到客户端提交过来的邮件,会立即进行发送。但是,当出现故障,比如线路中断或目的域不可到达时,邮件服务器就会将该邮件转入邮件队列(Message Deferred Queue),等待一个时间段,然后再尝试发送。另外,由于SMTP协议的问题,接收邮件时,邮件服务器不会去验证邮件发送方的地址,有些病毒邮件、广告群发邮件等垃圾邮件经常会使用伪造的或根本就不存在的邮件地址进行发送,而且,为了达到群发的目的,邮件的接收地址大部分都是成批地编造出来的。对这样的邮件,邮件服务器既发送不出去,也无法退回发送人,极容易造成死循环。大量的邮件囤积在服务器的邮件队列中,会极大的消耗系统的资源,严重时,甚至会造成SMTP进程死掉,系统响应非常迟缓。因此,作为邮件系统的管理员,需要经常去查看服务器的邮件队列,及时了解邮件系统的运行状况,并根据情况,处理队列中的邮件。
查看邮件队列
在Netscape Messaging Server4.15中,可以通过Netscape Console控制台去查看队列,方法是:启动Netscape Console,进入Messaging Server控制台,选择“Configuration”下的“Services”/“SMTP”/“Message Queue”,如图1所示。从控制台中,我们可以看到邮件目的域,即接收方域,还有待发往该域的邮件数量。另外,还有一个更为实用的方法—mailq,可以查看邮件的队列。在使用之前,用户必须使用邮件服务器程序属主的身份登录系统。
→图1# mailq -v
Summary of Queued Messages Destined for the Internet (via SMTP)
Messages Destination Host Queue Directory
-------- --------- --------
1 163.com $queue
HGR7EQ00.M7V 754/11450 [Wed, 20 Aug 2003 08:16:02 +0800] ab@abc.cn 1:cd@163.com
1 bolt.com $queue
HJT98W01.E7K 410/3348 [Wed, 20 Aug 2003 18:31:44 +0800] 1:audrey.leeqk@bolt.com
…………
由上可见,mailq可以查看到更丰富详细的信息,取上述第一条来讲,这表明对163.com的目的域,有一个邮件待发,发件人的地址是ab@abc.com,收件人的地址是cd@163.com,发件时间是“Wed, 20 Aug 2003 08:16:02 +0800”,而“754/11450”则分别表示该邮件的邮件头和邮件体(Header-Size/Body-Size)的大小,邮件目前在$queue目录下。
想进一步的了解该邮件的情况,可以进入$queue目录查看。
以往Netscape Messaging Server将目的域名作为目录名直接放在$queue/deferred/SMTP-Deliver目录下,Netscape Messaging Server 4.0以后,我们需要用Hash算法来定位该目的域队列:
# hashdir 163.com
14/44/
# ls $queue/deferred/SMTP-Deliver/14/44/
163.com
这样,我们就可以进入该队列,查看关于这个邮件更详细的信息。这些信息对邮件管理员都是非常有用的。根据它,管理员可以查找定位邮件、追踪邮件、了解邮件进入队列和排队时间,并据此决定相应的处理队列措施。
处理邮件队列
进入邮件队列的邮件,管理员可以采取的处理措施有三种(如图2):
→图21. Bounce,返回发件人。
2. Requeue,提交进入Active Queue,即立即发送。
3. Delete,删除邮件。
在使用mailq查看到的队列信息中,我们看到:
HKIVAV01.DK1 400/4418 [Wed, 20 Aug 2003 14:28:19 +0800] 1:quxf@tom.com
HJW4GJ01.18Q 400/4418 [Wed, 20 Aug 2003 14:28:57 +0800] 1: quxf@tom.com
…………
可见,发往tom.com的邮件有400封,信件的接收地址都是quxf@tom.com。用上面介绍的办法查看该邮件,发现都是系统(postmaster)因无法投递该信件而退回发件人的信息。待回退的原信内容是一封营销广告性质的邮件,接收人则是按一定规则成批编造出来的。这些邮件就形成了前面所说的死信。在$queue/messages目录下,可以看到大量大小相同的文件:
-rw-rw---- 1 mailsrv sys 4817 Aug 20 14:27 HKIVAA01.6JU
-rw-rw---- 1 mailsrv sys 4817 Aug 20 14:27 HKIVAE01.EJQ
-rw-rw---- 1 mailsrv sys 4817 Aug 20 14:27 HKIVAF01.6JW
…………
用top命令看到,CPU已经被占满:
CPU states: 0.0% idle, 78.8% user, 8.3% kernel, 12.9% iowait, 0.0% swap
……
PID USERNAME THR PR NCE SIZE RES STATE TIME FLTS CPU COMMAND
6493 mailsrv 33 54 -2 1.2G 89.6M run 10:44 1 68.32% smtpd
此时服务器的运行性能可想而知是怎样的糟糕了。客户端到服务器SMTP、POP等连接统统超时,根本无法连接到服务器。SMTP进程极大的消耗着系统资源,最终的结果是:SMTP 进程死掉。因此,一旦发现类似的邮件,管理员应立即采用“Delete”措施予以删除。用mailq查看到的队列信息中,我们还可以看到:
HJW4BV01.685 404/4089 [Wed, 20 Aug 2003 07:38:19 +0800] 1:guest@guaqw.com
HJW4GJ01.18Q 404/8962 [Wed, 20 Aug 2003 07:41:07 +0800] 1: guest@guaqw.com ……
这些到guaqw.com域的邮件也是类似的死信。从上面可以看出,这类信件的特征是:
发往该域的邮件数量比较大,发件地址一般都是空“”,邮件的邮件头/邮件体(Header-Size/Body-Size)的大小相似。另外,在查看队列时,管理员经常会发现,有很多目的域明显是不存在的,或者是用户笔误写错了的,比如hotmai.com、publik.bta.net.cn等。这些目的域是根本不可能到达,因此,就没有必要留在队列中,耗费邮件服务器的资源。对这样的队列,管理员可采取的措施就是:返回给发件人(Bounce)或者直接删除(Delete)。另外,有些邮件在队列中的时间比较长,目的域也不是很明显的情况下,管理员可以检查域名情况,判断是否也是同样的问题。这样就能为邮件服务器减少很多不必要的发送尝试。还有一些情况,比如有些比较重要的邮件,可能因为网络或线路的原因,没能立即发送出去,进入了邮件队列。按照常规,邮件必须等待过系统设置好的时间段后,才能再进入Active Queue尝试发送。这时候,管理员就可以采取“Requeue”措施,尽快发送,使该邮件不用再等待。
调整邮件队列参数
Netscape Messaging Server4.15中,可以调整关于邮件队列的参数为:
1)邮件队列的处理时间间隔(Process Interval)
2)邮件队列最长的排队时间(Maximum Queue Time)
→图4启动Netscape Console,进入Messaging Server控制台,选择“Configuration”下的“Services”/“SMTP”/“Message Queue”/“Configuration”,如图3所示。“Message queue process interval”就是邮件进入队列后,在每次发送尝试间需要等待的时间;“Maximum message queue time”是邮件能在队列中存在的时间上限,超过这个时间,邮件服务器将放弃发送该邮件。这些参数,管理员可自行调整。