LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 724|回复: 0

sendmail.cf文件

[复制链接]
发表于 2003-7-28 17:19:39 | 显示全部楼层 |阅读模式
http://www.linuxaid.com.cn/articles/9/4/947521218.shtml



在sendmail的配置文件sendmail.cf中的文本,有的形如MODEM的噪声,有的形如Dithers的咒语一样:


R$+@$=w         sendmail.cf文件
{$/{{.+            modem的噪声
!@#!@@!     Dithers的咒语
对于生手而言,要构建象下面的配置文件,一定是一件恐怖的事情:
R$+@$=W   $@$1@$H user@thishost -< user@hub
R$=W!$+$@$2@$H   thishost!user -< user@hub
R@$=W+  $@@$H2   @thishost:something
R$+%$=W   $@$<#$1@$2   user%thishost



  不过,如果回想起以前学习C语言时,你是否会对这个表达式感到恐惧呢?

# define getc(p)(--(p) -<_cnt<=0? ((int)*(p)-<ptr++):_filbuf(p))


  就象任何一个新语言一样,学习sendmail.cf文件中所使用的语言需要时间和实践。在本章中,我们将介绍这个语言,不会在此只是对其作一个入门性的概述。

5.1概要

  sendmail.cf文件是sendmail每次启动时要读取的配置文件。它包含了sendmail启动时必须的信息。它列出了所有重要文件的位置,指定了这些文件的缺省权限。包含了一些影响sendmail行为的选项。更重要的是,它还包含了地址重写(rewriting addresses)规则。

  Sendmail.cf文件是按行组织的。一个配置命令行,均是由字符开头的,而且每行只有一个命令:


V7 &#61612; 正确的
V7 &#61612; 不正确,前面多了个空格
V7 Fw/etc/mxhosts &#61612; 不正确,一行中有两个命令
Fw/etc/mxhosts &#61612; 正确



  每一个配置命令行,是由命令加上特定参数构成的。例如,命令V的参数是一个数字,而F命令的参数则是字母w,再加上绝对路径。在表5-1中完整地列出了所有配置命令:

命令 说明


V定义配置文件的版本(从8.6版开始才要求)
M 定义一个邮件传送代理
D 定义一个宏
R 定义一个地址重写规则
S 声明一个规则集
C 定义一宏集
F 从一个文件与管道中定义一宏集
O 定义一个选项
H 定义一个信头
P 定义传送优先级
T 声明受托用户(在8.1版忽略,8.7版重用)
K 声明一个key字数据库(从8.1版开始使用)
E 定义一个环境变量(从8.7版开始使用)
L 包括扩展的负载均衡支持



  表5-1sendmail.cf文件中的配置命令一览表

  有一些配置命令,象V只会在sendmail.cf文件中出现一次,而有些象R命令就会多次在配置文件sendmail.cf中出现。

  空行、以“#”开始的行将被处理为注释行而被忽略。一个以tab开始的行,则说明是上一行的继续,如:


# a commnet &#61612; 注释行
V7
/Brekeley &#61612; V7命令的继续
&#61613;
tab



  除了一个命令,一个空行,一个空格,一个tab,或一个#字符以外,其它情况都是错误的。如果sendmail程序发现这种情况,将打印出如下警告,并忽略此行,然后接着读取后面的配置:

sendmail.cf : line 15:unknown control line “v6”


  在这,sendmail找到了一行以v开始的行。由于小写的v不是一个有效的命令,sendmail将发出警告。而行号则指出了这个错误所在行。

  下面几个小节将对每一种命令进行简单的实例说明。而这些命令的作用将会在本教程中阐述。所以如果在本节中无法完全理解的话,也不必担心。因为这里所有神秘的东西,在本书结束时都将变得十分清晰明白。

5.2最小配置

  最小的配置的文件可以是空文件。你可以使用以下命令来创建这个文件:

% cp /dev/null  client.cf


  我们会慢慢地往这个文件中添加配置。将其命名为client.cf是为了避免覆盖了系统中的sendmail.cf文件。

  现在,我们再运行sendmail,测试这个新配置文件的有效性:


% ./sendmail –Cclient.cf –bt >/dev/null
%



  命令行开关选项-C用于指定sendmail使用一个指定的配置文件。而开关选项-bt则告诉sendmail运行在rule-testing模式下。注意,sendmail读取你的空配置文件,运行,没有任何提示。同时注意当在第2章编译完后无法运行sendmail,但现在你可以了。那是因为当时你没有配置文件,而现在有一个了(尽管这个文件是空的)。

5.2.1 版本

  为了防止旧版本的sendmail因读取新版本的配置文件而破坏,在sendmail 8.1开始引入了一个V命令,这个命令的格式如下:

V7


  编辑文件client.cf,然后加上这一行。“V”必须位于行首。后面跟的版本号必须是7,才能够使所有8.8版的sendmail.cf中的新功能生效。数字7是sendmail.cf的语法,表示有7个主要的变化,更详细的请参考27.5小节。

5.2.2 注释

  注释语句能够帮助其他人理解你的配置文件。同时,他们也能通过注释记起你几个月前的修改。注释语句对sendmail的执行速度影响极小,所以你无需担心这一问题。前面我们说过,以#开始的行,被sendmail认为是注释行,整行将被忽略。例如:

# This is a comment


  另外,注释语句也可以在命令之后,如:

V7#This is another comment


  增加一些注释语句到你的sendmail.cf文件中,使其成为:


# This is a comment
V7# This is another comment
Sendmail程序读取这个配置文件也将没有任何提示。
% ./sendmail –Cclient.cf –bt >/dev/null
%



5.3快速导览

  你将发现,在配置文件中的其它命令远比V命令来得复杂。这儿,我们现在对每个命令作一个快速的导览,仅够你能够对它们有一个初步的了解。

5.3.1 邮件传送代理

  通常情况下,sendmail程序不自己传送邮件,而是调用一个程序来完成。M命令就是定义一个邮件传送代理。例如,就象以前我们看到过的:

Mlocal,  P=/bin/mail, F=lsDFMAw5:/|@rmn, S=10, R=20/40,


  这将告诉sendmail,本地的邮件使用/bin/mail传送。这一行中的参数将在第6章:邮件中枢与传送代理,第30章:传送代理中详细说明。

5.3.2 宏

  义一个值,然后可以在多次使用,提高sendmail.cf的可维护性。D命令用于定义宏。一个宏名可以是一个单字母或用大括号包起来的多个字符。定义一次后,就可以在其它地方使用。


DRmail.us.edu  &#61612; 一个单字符
D{REMOTE}mail.us.edu   &#61612; 用大括号包含起来的多个字符(从8.7版开始)



  在这,R和{REMOTE}都是宏名,值是mail.us.edu。这个值可以在任何地方用$R和${REMOTE}访问。宏将在第7章:宏中介绍,更详细的在第31章:定义宏中。

5.3.3 规则

  sendmail.cf文件的核心是一系列的地址重写规则。这是非常重要的,因为地址必须符合多种标准。R命令用来定义这些规则:

R$-   $@ $1 @ $R   user -< user @ remote


  邮件地址将与最左边的规则($-)进行比较。如果与这个规则匹配,它们将根据右边的规则($@ $1 @ $R)进行重写。而在最右边的文本则是注释(注意,这里不需要使用#号)。

  如果使用多字符的宏名,并用#号标出注释的话,将使语句减少一些神秘:


R$- # If a plain user name
$@ $1 @ ${REMOTE}  # append “@” remote host



  更详细的说明,可以阅读第8章:地址和规则,以及第28章:规则。

5.3.4 规则集(Rule Sets)

  由于地址重写可能需要好几步,规则可以组织成为规则集,用S命令开始规则集:

  S3该命令定义规则集3,从sendmail 8.7版开始,规则集也可以使用字符来命令,如:

SHubset


  该命令定义Hubset规则集,这种方式的命名,sendmail将会自己对其编号。

  所有的跟在S命令后的R命令(规则)组成规则集。一个规则集结束于定义另一个规则集的S命令。关于规则集的信息,你可以参考第8章和第29章。

5.3.5宏集(Class Macros)

  用D命令定义的宏只能有一个值,但这通常是不够的。我们经常需要定义一个拥有多个值的宏,然后就像数组一样来组织这些值。C命令定义一个宏集。一个宏集就像一个数组一样,能够有多个项。宏集的名字是一个单字母,从8.7版开始,也可以用大括号包含多个字符作为名字,例如:


CW  localhost  fontserver &#61612; 一个单字符作为名字—W
C{MY_NAMES}  localhost  fontserver  &#61612; 多个字符作名字---{MY_NAMES}



  在这里,每一个宏集都包含两个值:localhost和fontserver。我们可以通过表达式$=W和$={MY_NAMES}来访问这些宏集。有关于宏集的更多信息,可以参考第12章和第32章。

5.3.6 文件宏集(File Class Macros)

  为了管理更加容易,我们常将比较长的信息或经常变化的信息存放到一个文件中去。命令F可以定义一个文件宏集。这个宏集的值是这个文件的内容,如:


FW/etc/mynames
F{MY_NAMES}/etc/mynames



  在此,文件宏集W和{MY_NAMES}将从文件/etcmynames中获得它们的值。

  文件宏集也可以从一个程序的输出中得值。它定义为:


FM|/bin/shownames
F{MY_NAMES}|/bin/shownames



  在此,sendmail将运行程序/bin/shownames,这个程序的输出将成为文件宏集的值,更详细的内容请参见第32章。

5.3.7 选项

  选项将告诉sendmail程序许多有用的和必要的事情。它们指定key文件的位置,设置超时时间,以及定义sendmail在出错时如何处理。它可以调整sendmail,以使它符合你特定的需要。

  命令O用来设置这些选项。以下就是一个例子:


OQ/var/spool/mqueue
O QueueDirectory=/var/spool/mqueue



  在此,Q选项定义邮件队列文件为/var/spool/mqueue。关于选项更详细的信息请看第13章和第34章。

5.3.8 信头

  邮件消息由两个部分组成:一个是信头部分,另一个是在空行后的主体部分。主体部分可以包括任何内容。而信头部分,则需要严格按照标准。H命令用来指定信头的格式:

Hreceived:$?sfrom $s $.by Sj ($v/$Z) $?r with $r$. Id $I$?u for $u$.; $b


  这个特定的H命令告诉sendmail收到后,必须在每一封信的信头加上这一行。关于信头更详细的内容请看第14章和第35章。

5.3.9 优先级

  并不是所有的邮件具有相同的优先级。邮件列表的信应该在只有一个收件人的信的后面发送。P命令用于设定邮件的优先级。这个优先级用于邮件队列处理时决定邮件的顺序。

Pjuck=-100


  这个P命令告诉sendmail,信头中用juck的信最后处理。关于这个命令的更详细内容,参见第14章和第35章。

5.3.10 受托用户

  为了使某些软件(如UUCP)能够正确地生效,就必须能够告诉sendmail邮件是谁发来的。这要求软件与From:中指出的用户运行在不同的uid上。T命令列出这些用户的受托用户。所有包含在信头的其他用户将收到一个警告。

Troot daemon uucp


  这个T命令指出有三个用户是受托用户。它们是root(UNIX系统中的上帝),daemon(sendmail通常以伪用户daemon身份运行),以及uucp。更详细的信息参见第14章和第22章。

5.3.11 key数据库

  一些认证信息,例如UUCP主机列表等,最好在sendmail.cf外维护。外部的数据库(叫作keyed数据库)提供了更快的访问速度。Key数据库在8.6版中引入了几种格式,如:

Kuucp hash /etc/mail/uucphosts


  这个K命令声明一个key数据库叫uucp,类型是hash,文件为/etc/mail/uucphost。关于key数据库的更多信息,请看第33章。

5.3.12 环境变量

  sendmail程序的安全是十分重要的。一种破坏的的方法是运行时伪造一些环境变量。为了阻止它,8.0版的sendmail将在启动时去除所有的环境变量。然后根据预先设置的值进行设置。设置环境变量使用E命令。

EPOSTGRESHOME=/home/postgres


  在此,环境变量POSTGRESHOME被赋予值/home/postgres。这个程序使用postgres数据库访问信息。关于更多的信息,请参见第22章。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表