Sendmail第九章 规则集09. 规则集0 规则集0是用来为一个专门的接收地址选择邮件分发代理。在图9-1中显示了规则集0与其它规则集之间的关系。
图9-1 规则集0 对于邮件消息的每一个接收者都将调用一次规则集0。对于每一个地址规则集0将做三次决定。这三次分别处理:邮件分发代理的符号名,邮件地址中的用户名,邮件地址中的主机名。我们在本章以及后的关于规则集的章节中都会展开说明。 9.1 引入规则集0 记得我们曾经在第6章“邮件中枢与分发代理”,设计过一个client.cf文件,使得sendmail将所有的邮件都转发给了邮件中枢来处理。当时我们在client.cf文件中做了以下声明:
在这种情况下,我们就无需设计任何重写接收者地址的规则,我们只需简单地将信发给邮件中枢就可以了。 以下就是一个规则集的实例:
第一行(S0)说明规则集0定义开始。你已经在上一章中看到过这样的LHS,$+是一个通配符,它能够与任何一个地址匹配,当然如果是空地址就无法匹配了。 9.2 RHS的三个部分 规则集0的任务是负责将每一个地址解析成为三个部分:分发代理的符号名,主机的名字,在那台主机上的用户名。(如图9-2)所示。
图9-2 规则集0的工作 大家应该还能记得“规则”就象是一个条件语句,如果LHS与工作区的内容匹配,那么sendmail就会执行RHS中的内容。 在规则“R$+ $#hub $@${REMOTE} $:$1”中,RHS将解析这三个部分:
一些转换的通配符的含义如下表所示: 表9-1 规则集0转换符
9.2.1 分发代理($#) 第一个部分是分发代理的名字,在$#后面跟着的就是分发代理名。在RHS中$#符号告诉sendmail后面跟着的就是分发代理的用户名。 我们在client.cf文件中定义了符号名hub:
当RHS拷贝到工作区时,首先将$#符号拷贝到工作区,然后拷贝分发代理的符号名,并且将它进行标记化。由于hub中并没有任何分隔符,所以最终拷贝到工作区的内容就是:
9.2.2 主机名($@) 第二个部分就是主机名。转换符$@告诉Sendmail,后面的内容就是邮件将要发送到的主机。如果在RHS中遇到类似“${name}”的表示式,则意味着我们使用了宏。在这个例子中,我们使用了${REMOTE},这个宏在client.cf文件中有以下定义
这样,最终
被拷贝到工作区后,就成为了:
9.2.3 用户名($:) 第三个部分就是用户名,RHS中的转换符$:意味后面跟着的是邮件接收者的用户名。它告诉sendmail后面跟的是用户名。在我们的例子中,使用的是$1。 那么这个$1是什么呢?请看下图:
也就是说在第一个“.”之前的部分就是$1,而之后的就是$2。 9.3 测试规则集0 为了使大家能够观察到实际的运行结果,我们花一些时间来做一些测试。首先我们在你的client.cf文件中加入规则集0:
现在,我们以规则测试模式运行sendmail,然后输入地址boss@acme:
|