现在考查下面的这条规则:
R $ * $:$ 1<@ $ j>add local domain
当在rhs改写一个地址后,sendmail将把改写过的地址再与当前规则的lhs相对比。在本例中,由于$*可以与0个或多个任何内容的标记相匹配,因此无论rhs如何改写地址,它将始终与$ *相匹配,因此这一匹配规则将无限制地循环下去。为了避免sendmail在这条规则上进人死循环,引用了$:,它用来通知sendmail只对这一规则使用一次。
当希望一个规则集立即终止并把地址返回给调用这一规则集的规则集或sendmail固有顺序中的下一个规则集时,可以在规则的rhs之前添加$@,它将使sendmail在rhs改写地址之后立即退出这一规则集。
一个规则集可以通过在rhs前面添加$>向另一个规则集传递地址,考查下面这一条规则:
R $ * $:$>22 $ 1 call ruleset 22
rhs的$ *匹配零个或多个标记,因此sendmail将不断地执行rhs,但由于在rhs前具有$:,所以这一规则只被使用一次。在这一规则中,$>22 $ 1 将以 $ 1 为输入地址调用22号规则集。由于$ 1匹配的内容正是lhs中的内容,因此这一条规则只是把当前的输入地址原封不动地传递给22号规则集。22号规则集返回的任何内容都将传递给这一规则集中的下一条规则。
8.2.3 测试sendmail
在安装一个新的或经过修改的sendmail.cf之前,必须对它进行彻底的测试,因为即使是很小的、看起来不会造成危害的修改也可能会导致严重的后果。
测试的第一步是创建一些地址,这些地址应该是用户的站点需要用到的有效地址。例如,在没有UUCP连接Internet站点somedomain.gov处,下面的地址有效。
zhang
zhang@host1.somedomain.gov
znang@somedomain.gov
即使somdomain.gov具有一个UUCP连接,也应该测试这些地址。其他一些需要考虑的地址包括各种别名(例如,Webmaster,include:列表,用来向文件邮寄的别名,用来向程序邮寄的别名)、非本地地址、源路由地址等等。
当创建好测试地址的列表后,可以使用-C和-bt选项来查看将要发生的情况。这些地址至少应该被传递3号规则集和0号规则集,从而确定它们是否能够被路由到正确的邮件发送器。完成这一任务的比较简单的方法是,创建一个包含被调用的规则集以及测试地址的文件,然后对它执行sendmail。例如,如果文件sdml.test包含下面的行:
3,0 zhang
3,0 zhang@hostl.somedomain.gov
3,0 zhang@somedomain.gov
那么,可以通过输入下面的命令来测试配置文件test.cf:
$ sendmail-Ctest.cf-bt< sdml.test
rewrite:ruleset 3 input: zhang
rewrite: ruleset 3 retruns:zhang
[etc.]
还可以对一个或多个地址执行改写过程进行全面测试。例如,如果某个地址被解析到SMTP邮件发送器。并且这个邮件发送器指定R=21,那么可以通过使用3,2,21,4等来测试收件人地址的改写是否正确。
如果到目前为止sendmail.cf的工作正常,那么可以准备发送一些真正的信件。执行如下命令:
$ sendmail-v-oQ/tmp-Ctest.cf recipient</dev/null
这里的一v选项使得sendmall以冗余方式显示信息,从而使用户可以看到所发生的事情。看到的内容或者像zhang…Sen这样的简单信息或者是一个完整的SMTP对话框。-oQ/tmp用来通知sendmail使用/tmp作为它的队列目录。使用这一选项很必要。因为当利用-C选项运行时,sendmail将放弃它的超级用户权限,并且不能把队列文件写到正常的邮件队列目录中。由于这里使用了-C和-oQ选项,因此sendmail在信件中也将包含如下的警告标题,从而向收件人提醒一些伪造的邮件:
X-Authentieation-Warning:somedomain.gov:Processed from queue/tmp
X-Authentication-Warning:somdomain.gov:Processed by zhang with-C srvr.cf
sendmail也将在信件中插入标题Apparemt;u-tp:zhang,这是因为虽然在命令上指定了收件人,但信件中却没有任何内容。在本例中,由于信件来自空文件/dev/null,因此没有可用的To:标题。如果以超级用户的身份执行测试任务,那么就可以不使用-oQ选项,sendmail便不会插人警告标题。通过创建像下面的文件并利用它作为输入来代替/dev/null,可以避免“Apparently-to:”标题的插入。
To:recipient
test
收件人是用户自己,以便检查邮件头的正确性。在一些特殊的情况下,返回地址行必须为SMTP包含一个FQDN。因此像From:zhang@somedomain这样的标题是不正确的,因为它不包含名字的域名部分,但像From:zhang@somedomain.gov这样的标题是正确的。
3 sendmail的工作方式
sendmail应用广泛而且灵活,它有多种工作方式,能充当多种角色。sendmail可以作为邮件路由器、SMTP客户程序和SMTP服务程序。不过,它不执行最终的邮件投递。