注意:配置文件的版本级别与sendmail的版本级别并不是一回事。V8 sendmail能够理解从版本1到5的配置文件,而版本8的配置文件并不存在。
·K操作符
sendmail使用了一些关键字数据库,例如别名数据库。假如给定了关键词Webmaster,sendmail将查找与这一关键词相关的数据,V8 sendmail把这一概念扩充为任意的数据库,包括NIS mps(Sun的网络信息服务,以前称为Yellow Pages或YP)。K操作符可用来向sendmail通知数据库的位置、类别以及访问方法。V8 sendmail支持的数据库类别有:dbm、btree、hash和NIS。当在Linux下编译时,使用的缺省类别是dbm格式。
· M操作符
前面已经介绍,邮件发送器或者是MTA或者是最终投递代理。针对每种目标,可以定义一个专门的邮件发送器。即使SMTP,MTA被内置,它也必须有一个邮件发送器定义来定制sendmail的SMTP操作。邮件发送器的定义是很重要的,因为所有收件人的地址必须在0号规则集中解析到一个邮件发送器。解析到本地邮件发送器将通过定义在其中的最终投递代理(例如/bin/mail)把信件发送给某个本地用户,解析到SMTP邮件发送器将通过定义在其中的sendmail固有的SMTP传输器把信件发送给另一个主机。下面将介绍一个定义邮件发送器的具体例子,由于sendmail需要一个本地邮件发送器,因此给出下面的例子:
Mlocal,P=/bin/mail,F=lsDFMfSn,S=10,R=20, A=mail-d$u
所有邮件发送器的定义都以M操作符和邮件发送器的名字开头(在本例中是local),其他字段在后面并且分别由逗号隔开。每个字段由字段名和它的值组成,字段名和它的值之间由等号(=)隔开,允许使用的字段在SIOG中有详细的说明。在上面本地邮件发送器的定义中,P=用来提供投递邮件的程序所处位置的路径名/bin/mail,字段F=用来为本地邮件发送器提供sendmail标志。这些标志并不是要传递给字段P=中所指定的命令,而是由sendmail用来根据它所选择的邮件发送器来修改自己的操作。例如,sendmail通常在调用邮件发送器之前放弃它的超级用户身份,但可以利用S邮件发送器标志通知sendmail为某些邮件发送器保持这一身份。
字段S=和R=用来为sendmail指定在改写寄件人和收件人地址时用到的规则集。由于可以为所定义的每个邮件发送器提供不同的R=和S=标志,因此可以针对每个邮件发送器的不同特点来改写地址。例如,如果用户的UUCP邻居运行的是一个不理解域寻址的陈旧软件,就需要专门为他的站点说明一个特殊的邮件发送器,并编写针对特殊邮件发送器的规则集,从而把地址转化为它的邮件发送器能够理解的形式。S=和R=字段还可以指定用来改写信封和邮件头地址的各种规则集,像S=21/31这种表达式将通知sendmail利用21号规则集改写寄件人的信封地址,利用31号规则集改写寄件人的邮件头地址。这一功能对于要求不同地显示信封地址和邮件头地址的邮件发送器是很有用的。
A=字段用来为被运行的程序(在本例中是/bin/mail)提供变量向量(命令行)。在这一例子中,sendmail将运行命令mail-d $ u,其中的宏$ u将被替换为被投递的用户名:
/bin/mail-d zhang
用户可以在命令提示符下把与此完全相同的命令输人到shell中。
另外,还可以使用其他邮件发送器标志来调节邮件发送器。例如,可以根据不同的邮件发送器限制信息的最大尺寸。
· S和R操作符
配置文件sendlnail.cf由一系列规则集组成。规则集用来探测错误的地址,把地址改写为远程邮件发送器能够理解的形式,以及把邮件路由到sendmail内部的某个邮件发送器。sendmail按照固有的顺序向规则集传送地址,而规则集可以不按固有顺序调用其他规则集。固有顺序与处理的邮件地址以及选择用来投递信件的邮件发送器有关。
规则集由S命令宣布,跟在它后面的是用来标识规则集的编号。sendmail将收集下面的R(规则)行,直到它发现另一个S操作符或配置文件的结尾为止。下面的例子定义了编号为11的规则集:
# Ruleset 11
S11
R $+$:$>22$ I call ruleset 22
sendmail分三种途径来处理地址:一种用来选择投递代理,一种用来处理寄件人地址,一种用于处理收件人地址。
所有邮件地址首先被传送到3号规则集进行预处理从而变为规范的形式,以便其他规则集能够容易地处理它们。不论地址多么复杂,3号规则集的任务是确定某个邮件应该被发送到的下一个主机,3号规则集将尽力在地址中查找那一主机并利用尖括号来标记它。例如,在一种最简单的情况下,一个像zhang@somedomain.gov这样的地址将变为znahg<@simedomain.gov>。接下来,0号规则集将确定用于每个收件人的正确的投递代理(邮件发送器)。例如,一封由li@othedomain.com发给zhang@somedomain.gov(一个Internet站点)和posthost!zhao(一个老式的UUCP站点)的信件需要两个不同的邮件发送器:一个用于somedomain.gov的SMTP邮件发送器,一个用于posthost的老式UUCP邮件发送器。邮件发送器的选择决定以后对寄件和收件人的地址进行处理的方式。因为提供在“S=”和“R=”邮件发送器标志中的规则集根据邮件发送器的不同而不同。
经过0号规则集的地址必须解析到一个邮件发送器。因此,当某个地址匹配lhs时,rhs将提供一个由邮件发送器、用户和主机组成的三元组。下面这行代码表示的是解析到某个邮件发送器的规则的语法:
Rlhs $ # mailer $ @host $:user some comment here...
上面的mailer是利用M命令定义的一个邮件发送器的名字,例如SMTP。host和user通常是来自lhs的位置宏。