19.18.13
14 sendmail的统计信息、测试和调试
sendmail可以收集有关它所处理消息的数量和大小的统计信息。您可以用mailstats命令显示这些数据,数据是按邮寄程序(mailer)进行组织的。sendmail的confSTATUS_FILE选项(在OSTYPE文件中)指定了应该保存统计信息的文件名称。如果指定的文件存在,则将打开记账(accounting)功能。
sendmail统计信息文件的默认位置是/etc/mail/statistics,但有些厂商把这个文件叫做sendmail.st,放在/var/log中。mailstats给出的
总计值是从创建统计信息文件以来的累计。如果希望周期的统计信息,可以用cron轮换并重新初始化此文件。
下面是一个例子:

如果所有人都可以读取邮件统计文件,那么就不必由root来运行mailstats命令。
这条命令显示了6个值:收到的消息和收到的千字节数(msgsfr、bytes_from),发送的消息和发送的千字节数(msgsto、bytes_to),拒收的消息数(msgsrej),以及丢弃的消息数(msgsdis)。第一列的数字标识出邮寄程序(mailer),最后一列列出了邮寄程序的名字。T开头的行是所有的消息和字节数,C开头的行是连接数。这些值中包括了本地和中继转发的邮件。
19.18.143.1
测试和调试
基于m4的配置要经过某种程度上的预先测试。如果要用它们,可能并不需要进行底层的调试。有一样东西是调试标志不能测试的,那就是您的设计方案。在研究本章时,我们在所检查的好几个配置文件和设计中发现了错误。这些错误小到调用某项功能时没带上必要的宏(例如,使用masquerade_envelope时没有用MASQUERADE_AS打开伪装),大到sendmail配置和防火墙的设计之间发生全面冲突,而防火墙控制着是否允许邮件进入以及进入的条件有哪些。
您不能设计一个在真空中的邮件系统。邮件系统必须与DNS MX记录和防火墙策略同步(或者至少不会相冲突)。
sendmail提供了世界上已知最丰富的调试辅助程序集之一,它的调试标志不是简单的布尔值或整数,而是二维量x.y,其中x选定主题,而y选定要显示的信息量。值为0表示不调试,为127表示如果您打印输出的话,会造成纸张的浪费。主题的范围是0~99,目前定义了大约80个。
sendmail软件发布中的文件sendmail/TRACEFLAGS列出了正在使用的值和使用它们的文件和函数。所有对调试的支持都处在原始配置文件的层次上。在许多情况下,把调试输出和sendmail源代码一起看看是会有帮助的。
如果调用sendmail时带上一个-dx.y标志,调试输出将送到屏幕(标准错误输出)。表19.18.18显示了几个重要的x值和一些y的建议值。如果您打开了作为守护进程(-bd)运行的sendmail的调试功能,那么就要小心了,因为调试输出可能最终会卡住SMTP对话,在sendmail和远程主机进行通信时造成奇怪的故障。
表19.18.1820 调试主题
|
主 题 |
含义和建议 |
|
0 |
显示编译标志和系统身份(请试试y = 1 或者 10) |
|
8 |
显示DNS名字解析(试试 y=8) |
续表
|
主 题 |
含义和建议 |
|
11 |
跟踪邮件的投递(显示邮寄程序的调用) |
|
12 |
显示本地到远程的名字转换过程 |
|
17 |
列出MX主机 |
|
21 |
跟踪重写规则(要了解详情,可以使用 y=2或者y=12) |
|
27 |
显示别名和转发机制(试试 y= 4) |
|
44 |
显示如果发生故障,尝试打开文件的次数(y=4) |
|
60 |
显示数据库映射的查找 |
Gene Kim和Rob Kolstad写过一个叫checksendmail的Perl脚本,它用地址测试模式调用sendmail,在包含由您提供的测试地址的文件上运行。它将结果与期望值相比较。这个脚本让您能够根据站点上典型地址的测试集,对新版的配置文件进行测试,确保自己不会在无意间破坏以往一直工作正常的任何地方。
19.18.134.2
嗦的投递
许多在命令行上调用sendmail的用户代理程序都能接受一个-v标志,它传递给了sendmail,让sendmail显示出投递消息所采取的步骤。下面的例子使用了mail命令。粗体字是从键盘向用户代理输入的内容,其余的内容是sendmail的啰嗦输出。



anchor上的sendmail连接上了toadranch.com上的sendmail。两台机器都使用ESMTP协议来协商交换消息。
19.18.134.3
用SMTP通信
在调试邮件系统时可以直接使用SMTP。为了发起一次SMTP会话,可以telnet至TCP端口25或者使用Sendmail-bs命令。默认情况下,这是sendmail在守护进程模式(-bd)下运行时进行监听的端口,它以邮件提交代理身份运行时使用端口587。表19.18.1921显示了最重要的SMTP命令。
表19.18.1921 SMTP命令
|
命 令 |
函 数 |
|
HELO hostname |
如果采用SMTP通信,标识正在连接的主机 |
|
EHLO hostname |
如果采用ESMTP通信,标识正在连接的主机 |
|
MAIL From: revpath |
发起一次邮件事务(信封发件人) |
|
RCPT To: fwdpatha |
标识信封收件人 |
|
VRFY address |
验证地址是否有效(可投递) |
|
EXPN address |
显示别名和.forward映射的展开结果 |
|
DATA |
开始消息的主体b |
|
QUIT |
结束交换并关闭连接 |
|
RSET |
重置连接状态 |
|
HELP |
打印SMTP命令的汇总信息 |
a.一则消息可以用多条RCPT命令。
b.您可以在消息主体内的一行上输入一个点(.)来结束消息主体。
SMTP整个语言只有14条命令,所以它非常容易学习和使用。它不区分大小写。SMTP的规范可以在RFC2821中找到。(也可参见RFC1123)。RFC
1869、1870、1891和1985把SMTP扩展为ESMTP。这两种协议的下一代版本在RFC
2821和RFC2822里;在新的RFC被当作标准正式采用的时候,早先的RFC也就作废了。
包括sendmail在内的大多数传输代理都支持SMTP和ESMTP,smap是现如今唯一的例外。遗憾的是,许多提供主动过滤机制的防火墙设备并不支持ESMTP。
支持ESMTP协议的进程将以EHLO命令而不是HELO发起通信。如果另一端的进程听懂了并答复OK,那么双方便协商它们能支持的扩展,最后达到进行交流所需的最小公分母。如果返回的是一条错误消息,那么支持ESMTP协议的进程就后退到SMTP。
18.14.4 队列监视
您可以使用mailq命令(等价于sendmail -bp命令)查看队列内消息的状态。消息在被投递时,或者已经尝试过投递但没有成功的时候,它们就被排入“队列”。
mailq打印出当时/var/spool/mqueue下文件的汇总信息,这些信息普通人就可以直接阅读。它的输出对于判断一则消息为什么被拖延非常有帮助。如果信息显示出正在形成积压邮件的现象,那么您就可以监视sendmail尝试消除卡壳的状态。
注意,sendmail在8.12及以后的版本上,有两个默认的队列:一个用于端口25上接收到的消息,另一个用于在端口587上接收到的消息(客户机提交队列)。您可以调用mailq-Ac以看到客户机队列。
下面是mailq的一种典型输出。这个例子显示出有3条消息在等候投递:

如果您认为自己比sendmail还了解情况,或者您只是想要sendmail尝试立即重新投递排队的消息,那么可以运行命令sendmail -q迫使队列开始运行。如果您使用sendmail -q -v命令,那么sendmail会一次一次地显示每次投递的情况,这往往能够帮助进行调试工作。如果让sendmail自己自行处理的话,它会每隔一段时间(一般是30分钟)重新尝试一次投递。
19.18.134.4
5 日志机制
sendmail使用syslog(系统日志)来记录错误和状态消息,它所采用的系统日志设备是“mail”,级别可以从“debug”到“crit”,这些消息都以字符串“sendmail”作标记。可以用命令行的选项-L覆盖这个日志字符串“sendmail”,如果您正在调试sendmail的一个副本,而其他副本正在完成正常的邮件处理事务时,采取这个办法就很方便了。有关系统日志的更多信息请参见第101章。
在命令行或配置文件中指定confLOG_LEVEL选项,就能决定sendmail用作日志阈值的严重性级别。日志级别的值越高,表示严重性级别越低,也使得被记录的信息越多。
回想一下,系统日志中记录某个级别的消息,将要报告给该级别以及所有高于它的级别。/etc/syslog.conf文件决定了每则消息最终的目的地。
回想一下,系统日志中记录某个级别的消息,将要报告给该级别以及所有高于它的级别。/etc/syslog.conf文件决定了每则消息最终的目的地。在Red Hat和Fedora系统上,sendmail的日志默认记录在/var/log/maillog里。对于SuSESUSE来说,这个日志文件是/var/log/mail,而对于Debian和Ubuntu而言,它是/var/log/mail.log。如果Linux的标准化工作能够整顿这些随机而且显然没有意义的差异,那么我们脚本的可移植性不就会更好吗?
表19.18.202给出了sendmail日志级别和syslog(系统日志)严重性级别之间大致的对照关系。
表19.18.202 sendmail日志级别和syslog日志级别的对照
|
L |
级 别 |
L |
级 别 |
|
0 |
不作日志 |
4 |
notice |
|
1 |
alert或者crit |
5~11 |
info |
|
2 |
crit |
>=12 |
debug |
|
3 |
err或者warning |
一个更好的程序是mreport,它是由Jason Armstrong编写的。
它可以用来汇总由sendmail写下来的日志文件。只要运行make,然后再运行make install立即就能编好它。下面是从一个Red Hat系统上取得的mreport输出结果的样本:


如果您的邮件日志文件只能由root读取(它们应该如此),您必须使用sudo或者成为root来运行mreport。mreport的标志和选项都在它的手册页中有文档说明。在本例中的-f标志表示根据发件人归并和分类;类似的,-t标志则表示根据收件人进行分类。-i参数是输入文件,-o是输出文件。
如果打算定期运行mreport,那么应该告诉您的用户。他们可能会觉得让系统管理员用这样一种好工具来浏览邮件日志是对他们隐私的一种侵犯。






