📄 6.html
字号:
250 <you@here.us.edu> … Sender ok<p> 在此,发件人的地址是远程机器认可的。<p> 下一步,本地机器将说明收件人的名字:<p>>>> RCPT To:<you@remote.domain><br>250 <you@remote.domain> … Recipient ok<p> 如果远程主机上并无用户you的话,远程主机将返回“User unknown”错误,在此,收件人OK。注意这里的OK不一定能确保地址是完好的。只是确认了这个地址是可接受的。<p> 当信封信息发送完成后,sendmail程序将试图发送信件信息(包括信头和信体)。<p>>>> DATA<br>354 Enter mail, end with “.” on a line by itself<br>>>> .<p> DATA告诉远程主机准备好了。当远程主机指示发送信息时,本地主机照做。最后的一个点用来标记一个邮件结束。这是SMTP的规定。因为邮件消息可能包含多行,而用一个小点开始也是合法,所以sendmail将会把这些小点转换成两个再发送出去。例如,假定当我们要发送以下文件时:<p>My results matched yours at first:<br>126.71<br>125.72<br> …<br>126.79<br>But then the numbers suddenly jumped high, looking like<br>Noise saturated the line.<p>为了防止以小点开始的行照成疑义,sendmail将会在以小点开始的行,插入一个附加的小点,所以实际传输的内容如下所示:<br>My results matched yours at first:<br>126.71<br>125.72<br>.…<br>126.79<br>But then the numbers suddenly jumped high, looking like<br>Noise saturated the line.<p> 而另一方收到邮件后,再将这个附加的小点去掉,还原成原来的邮件内容。<p> 远程主机上的sendmail将显示队列管理附于的标识:<p>250 GAA20115 Message accepted for delivery<br>>>> QUIT<br>221 remote.domain closing connection<p> 本地主机上的sendmail发送QUIT,说明全部工作完成。远程主机返回应答信息确认。<p> 注意,-v参数在发送信息到远程主机上时十分有用。它能够显示出SMTP会话过程,以帮助我们了解邮件转发的过程,也有利于我们排错。<p>2.3调试模式(-d)<p> sendmail程序也能产生并输出调试信息。要使用调试模式运行sendmail的话,就需要使用-d参数。这个参数将产生比-v参数更多、更详细的信息。输入以下命令行,用自己的帐户名代替you:<p>% /usr/lib/sendmail –d you < /dev/null<p><br> 这个命令行产生很冗长的处理信息。我们在此不打算说明这些输出信息,在此,只需记住在sendmail程序在调试模式下运行会产生大量的信息。<p> 同时,也会产生大量的调试信息,你可以修改、显示这些调试信息。你可以在-d参数后加上一个数字,输出将会限制在只输出指定类的调试信息。<p> 输入以下命令用自己的帐户名代替you:<p>% /usr/lib/sendmail –d40 you < /dev/null<p> 在此,-d40是调试第40类的信息。这类的信息是关于邮件队列的。以下是一个输出实例:<p>>>>>> queueing GAA14008 (new id) queueall=1 >>>>><br>queueing 95688=you:<br>mailer 4 (local), host ‘’<br>user ‘you’, ruser ‘<null>’<br>next=0, alias 95460, uid 0, gid 0<br>flags=6008<QPRIMARY,QPINGONFAILURE,QPINGONDELAY><br>owner=(none), home=”/home/you”, fullname=”Your FullName”<br>orcpt=”(none)”, statmta=(none), rstatus=(none)<br><<<<< done queueing GAA14008 <<<<<<p> 对于一个类,还可以指定一个级别,这个级别是用来调整输出的量。一个低级别将产生较少的输出,一个高级别将产生更多、更复杂的输出。它们的格式是在-d参数之后加上:<p>category.level<p> 例如:<p>% /usr/lib/sendmail –d0.1 -bp<p><br> 参数-d0指示sendmail产生通用的调试信息。而级别1则让sendmail的输出减少到最小限度。这个值可以省略,因为.1是缺省值。参数-bp让sendmail打印出邮件队列内容。输出看起来如下所示:<p>Version 8.8.4<br>Compiled with:LOG NAMED_BIND NDBM NETINET NETUNIX NIS SCANF<br> XDEBUG<br>= = = = = = = = = = = SYSTEM IDENTITY (after readcf) = = = = = = = = = = =<br>(short domain name) $w = here<br>(canonical domain name) $j =here.us.edu<br>(subdomain name) $m =us.edu<br>(node name) $k = here<br> = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =<br>Mail queue is empty<p> 在此,开关选项“-d0.1”让sendmail打印出版本号、一些关于编译的信息,以及你的主机名。现在你提高级别看一下:<p>% /usr/lib/sendmail –d0.11 -bp<p> 这时将显示如下信息:<p>Version 8.8.4<br>Compiled with:LOG NAMED_BIND NDBM NETINET NETUNIX NIS SCANF<br>XDEBUG<br>OS Defines: HASFLOCK HASGETUSERSHELL HASINITGROUPS HASLSTAT<br> HASSETREUID HASSETSID HASSETVBUF HASUNAME IDENTPROTO<br> IP_SRCROUTE<br>Config file: /etc/sendmail.cf<br>Pid file: /etc/sendmail.pid<br>Canonical name: here.us.edu<br>UUCP nodename: here<br>a.k.a.: [123.45.67.89]<br>= = = = = = = = = = = SYSTEM IDENTITY (after readcf) = = = = = = = = = = =<br>(short domain name) $w = here<br>(canonical domain name) $j =here.us.edu<br>(subdomain name) $m =us.edu<br>(node name) $k = here<br> = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =<br>Mail queue is empty<center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I737" ID="I737"></A><center><b><font size=+2>sendmail.cf</font></b></center><br>3. sendmail.cf文件<p> 在sendmail的配置文件sendmail.cf中的文本,有的形如MODEM的噪声,有的形如Dithers的咒语一样:<p>R$+@$=w ? sendmail.cf文件<br>{$/{{.+ ? modem的噪声<br>!@#!@@! ? Dithers的咒语<br>对于生手而言,要构建象下面的配置文件,一定是一件恐怖的事情:<br>R$+@$=W $@$1@$H user@thishost -< user@hub<br>R$=W!$+$@$2@$H thishost!user -< user@hub<br>R@$=W:$+ $@@$H:$2 @thishost:something<br>R$+%$=W $@$<#$1@$2 user%thishost<p> 不过,如果回想起以前学习C语言时,你是否会对这个表达式感到恐惧呢?<p># define getc(p)(--(p) -<_cnt<=0? ((int)*(p)-<ptr++):_filbuf(p))<p> 就象任何一个新语言一样,学习sendmail.cf文件中所使用的语言需要时间和实践。在本章中,我们将介绍这个语言,不会在此只是对其作一个入门性的概述。<p>3.1概要<p> sendmail.cf文件是sendmail每次启动时要读取的配置文件。它包含了sendmail启动时必须的信息。它列出了所有重要文件的位置,指定了这些文件的缺省权限。包含了一些影响sendmail行为的选项。更重要的是,它还包含了地址重写(rewriting addresses)规则。<p> Sendmail.cf文件是按行组织的。一个配置命令行,均是由字符开头的,而且每行只有一个命令:<p>V7 ? 正确的<br> V7 ? 不正确,前面多了个空格<br>V7 Fw/etc/mxhosts ? 不正确,一行中有两个命令<br>Fw/etc/mxhosts ? 正确<p> 每一个配置命令行,是由命令加上特定参数构成的。例如,命令V的参数是一个数字,而F命令的参数则是字母w,再加上绝对路径。<p>命令 说明<p> V 定义配置文件的版本(从8.6版开始才要求)<br> M 定义一个邮件传送代理<br> D 定义一个宏<br> R 定义一个地址重写规则<br> S 声明一个规则集<br> C 定义一宏集<br> F 从一个文件与管道中定义一宏集<br> O 定义一个选项<br> H 定义一个信头<br> P 定义传送优先级<br> T 声明受托用户(在8.1版忽略,8.7版重用)<br> K 声明一个key字数据库(从8.1版开始使用)<br> E 定义一个环境变量(从8.7版开始使用)<br> L 包括扩展的负载均衡支持<p> 有一些配置命令,象V只会在sendmail.cf文件中出现一次,而有些象R命令就会多次在配置文件sendmail.cf中出现。<p> 空行、以“#”开始的行将被处理为注释行而被忽略。一个以tab开始的行,则说明是上一行的继续,如:<p># a commnet ? 注释行<br>V7<br>/Brekeley ? V7命令的继续<br>-<br>tab<p> 除了一个命令,一个空行,一个空格,一个tab,或一个#字符以外,其它情况都是错误的。如果sendmail程序发现这种情况,将打印出如下警告,并忽略此行,然后接着读取后面的配置:<p>sendmail.cf : line 15:unknown control line “v6”<p> 在这,sendmail找到了一行以v开始的行。由于小写的v不是一个有效的命令,sendmail将发出警告。而行号则指出了这个错误所在行。<p> 下面几个小节将对每一种命令进行简单的实例说明。而这些命令的作用将会在本教程中阐述。所以如果在本节中无法完全理解的话,也不必担心。因为这里所有神秘的东西,在本书结束时都将变得十分清晰明白。<p>3.2最小配置<p> 最小的配置的文件可以是空文件。你可以使用以下命令来创建这个文件:<p>% cp /dev/null client.cf<p><br> 我们会慢慢地往这个文件中添加配置。将其命名为client.cf是为了避免覆盖了系统中的sendmail.cf文件。<p> 现在,我们再运行sendmail,测试这个新配置文件的有效性:<p>% ./sendmail –Cclient.cf –bt >/dev/null<br>%<p> 命令行开关选项-C用于指定sendmail使用一个指定的配置文件。而开关选项-bt则告诉sendmail运行在rule-testing模式下。注意,sendmail读取你的空配置文件,运行,没有任何提示。同时注意当在第2章编译完后无法运行sendmail,但现在你可以了。那是因为当时你没有配置文件,而现在有一个了(尽管这个文件是空的)。<p>3.2.1 版本<p> 为了防止旧版本的sendmail因读取新版本的配置文件而破坏,在sendmail 8.1开始引入了一个V命令,这个命令的格式如下:<p>V7<p> 编辑文件client.cf,然后加上这一行。“V”必须位于行首。后面跟的版本号必须是7,才能够使所有8.8版的sendmail.cf中的新功能生效。数字7是sendmail.cf的语法,表示有7个主要的变化。<p>3.2.2 注释<p> 注释语句能够帮助其他人理解你的配置文件。同时,他们也能通过注释记起你几个月前的修改。注释语句对sendmail的执行速度影响极小,所以你无需担心这一问题。前面我们说过,以#开始的行,被sendmail认为是注释行,整行将被忽略。例如:<p># This is a comment<p> 另外,注释语句也可以在命令之后,如:<p>V7#This is another comment<p> 增加一些注释语句到你的sendmail.cf文件中,使其成为:<p># This is a comment<br>V7# This is another comment<br>Sendmail程序读取这个配置文件也将没有任何提示。<br>% ./sendmail –Cclient.cf –bt >/dev/null<br>%<p>3.3快速导览<p> 你将发现,在配置文件中的其它命令远比V命令来得复杂。这儿,我们现在对每个命令作一个快速的导览,仅够你能够对它们有一个初步的了解。<p>3.3.1 邮件传送代理<p> 通常情况下,sendmail程序不自己传送邮件,而是调用一个程序来完成。M命令就是定义一个邮件传送代理。例如,就象以前我们看到过的:<p>Mlocal, P=/bin/mail, F=lsDFMAw5:/|@rmn, S=10, R=20/40,<p> 这将告诉sendmail,本地的邮件使用/bin/mail传送。这一行中的参数将在第6章:邮件中枢与传送代理,第30章:传送代理中详细说明。<p>3.3.2 宏<p> 义一个值,然后可以在多次使用,提高sendmail.cf的可维护性。D命令用于定义宏。一个宏名可以是一个单字母或用大括号包起来的多个字符。定义一次后,就可以在其它地方使用。<p>DRmail.us.edu ? 一个单字符<br>D{REMOTE}mail.us.edu ? 用大括号包含起来的多个字符(从8.7版开始)<p> 在这,R和{REMOTE}都是宏名,值是mail.us.edu。这个值可以在任何地方用$R和${REMOTE}访问。宏将在第7章:宏中介绍,更详细的在第31章:定义宏中。<p>3.3.3 规则<p> sendmail.cf文件的核心是一系列的地址重写规则。这是非常重要的,因为地址必须符合多种标准。R命令用来定义这些规则:<p>R$- $@ $1 @ $R user -< user @ remote<p><br> 邮件地址将与最左边的规则($-)进行比较。如果与这个规则匹配,它们将根据右边的规则($@ $1 @ $R)进行重写。而在最右边的文本
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -