?? 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 + -