?? 6.html
字號:
2.如何運行sendmail<p> 一種運行sendmail的方法是,直接在命令行上附加接收者參數。例如:下面命令就是發一個郵件消息給george。<p>% /usr/lib/sendmail george<p> 你也可以同時給出多個接收者。例如,發一個郵件給george,truman和teddy:<p>% /usr/lib/sendmail george,truman,teddy<p> sendmail程序可以接受兩種不同的命令行參數。不以“-”字符開始的參數是接收者,如上面的george。而以“-”字符開始的參數則是影響sendmail運行的開發選項。所有的命令行開關選項的解釋,<p> 標記 說明<br> -b 設置運行模式<br> -v 運行于冗長模式<br> -d 運行于調試模式<p><br>2.1適宜的模式(-b)<p> sendmail程序的“-b”參數可以衍生出許多功能。例如:使sendmail顯示隊列的內容,使sendmail重建別名數據庫。本章將介紹一些比較常用到的子參數。<p> 格式 說明<br> -ba 使用ARPAnet(灰皮書書)協議<br> -bD 以守候進程模式運行,但不fork<br> -bd 以守候進程模式運行<br> -bH 清除固有的主機狀態<br> -bh 打印固有的主機狀態<br> -bi 重建別名數據庫<br> -bm 成為一個郵件發送者<br> -bp 打印郵件隊列內容<br> -bs 在標準輸入處運行SMTP<br> -bt 測試模式:僅解析地址<br> -bv 檢驗:不收集、分發<br> -bz 凍結配置文件<p> 選項可以使sendmail執行時象其它名字。每個名字可以是一個硬連接,一個符號連接,或sendmail的一份拷貝。<p>hoststat -bh 打印固有主機狀態<br>mailq -bp 顯示郵件隊列內容<br>newaliases -bi 重建別名數據庫<br>purgestat -bH 清除固有主機狀態<br>smtpd -bd 以守侯進程運行<p>2.1.1 守候進程模式 (-bd)<p> sendmail程序能夠在后臺以守侯進程模式運行,監聽來自其它機器的郵件。Sendmail當第一次以守侯進程模式運行時,程序只讀取配置文件一次,然后就一直運行,不再讀取配置文件了。也就是說,執行后將不會發現配置文件的變化。<p> 當你對配置文件sendmail.cf做了任何修改,都需要kill掉sendmail進程,然后重新啟動它。但當你kill掉這個守候進程前,必須知道如何正確地重新啟動它。這些信息是/etc/sendmail/pid或一個系統rc文件。<p> 在BSD系列的UNIX系統,守候進程通常使用以下命令啟動:<p>/usr/lib/sendmail –bd –q1h<p> 命令行開關選項“-bd”指定sendmail以守候進程方式運行?!?q”選項告訴sendmail多久去查看一次待處理郵件隊列?!?q1h”就是將其設置為1小時。<p> 在你的機器上啟動sendmail的命令,可能與我們這兒給出的是不同的。如果你管理許多不同的UNIX系統,你無須知道每一種是如何運行的。<p>2.1.1.1 kill并重啟sendmail v8.7<p> 在sendmail 8.7以后的版本中,kill并重啟sendmail變得比較簡單。一個單一的命令將會完成這一工作:<p>% kill –HUP `head –1 /etc/sendmail.pid`<p><br> 這個單一的命令與下一個小節中的兩個命令的效果完全相同。<p>2.1.1.2 kill并重啟sendmail v8.6<p> 當你要以守候進程方式啟動sendmail,你須確認沒有一個已運行的sendmail守候進程。在8.6版sendmail中,可以在/etc/sendmail.pid文件的第一行中找到進程ID號pid。你可以執行以下命令來kill掉sendmail:<p>% kill `head –1 /etc/sendmail.pid`<p> 當你kill掉當前運行的守候進程,你可以使用以下命令來重新運行sendmail:<p>% `tail –1 /etc/sendmail.pid`<p>2.1.1.3 kill并重啟老版本sendmail<p> 在老版本的sendmail中,你必須使用ps來獲得sendmail的進程ID號pid。在BSD UNIX和System V UNIX使用ps的方法不盡相同。<p> 針對BSD UNIX來說,ps命令的將得到類似以下的輸出:<p>% ps ax | grep sendmail | grep –v grep<br> 99 ? IN 0:07 /usr/lib/sendmail -bd –q1h<br>% kill 99<p> 這個輸出的最左邊的就是進程ID號。<p> 針對System V UNIX系統來說,ps命令的參數及命令輸出都不盡相同:<p><br>% ps ae | grep sendmail<br> 99 ?0:01 sendmail<br>% kill 99<p><p> 在老版本的sendmail中,你必須通過查看rc文件來獲知如何重啟sendmail。<p>2.1.1.4 如果你忘記了kill守候進程<p> 如果你在重啟sendmail時,忘了kill掉原來的進程的話,你就會看到類似以下列出的錯誤消息,每5秒顯示一次。<p>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Getrequests: cannot bind: Addredd already in use<br>Opendaemonsocket: Server SMTP socket wedged:exiting<p>2.1.2 顯示郵件隊列模式 (-bp)<p> sendmail程序能夠顯示郵件隊列的內容??梢酝ㄟ^兩種方法實現:一種是運行mailq,另一種是運行帶開關選項“-bp”的sendmail。無論你使用哪種方法,郵件隊列將會顯示出來。如果這個隊列是空的,sendmail將打印出:<p>Mail queue is empty<p> 如果有一個郵件正在等待隊列中,那么將輸出更多的消息,其中包含類似于下列的信息:<p>) Mail Queue (1 requests)<br>--Q-ID--- --Size-- ----Q-Time<br>-------------------Sender/Recipient-------------------<br>GAA29775* 702 Thu Mar 12 16:51<you@here.us.edu><br> Deferred:Host fbi.dc.gov is down<br> <george@fbi.dc.gov><p> 在此,帶開關選項“-bp”的sendmail顯示了僅有一個郵件信息在隊列中。如果有多個,那么每一個郵件都會像這樣列出來。每一個至少有兩行輸出。<p> 第一行顯示郵件和發送者的細節信息。GAA29775是這個郵件在隊列中的標記?!?”號則代表由于這個郵件正在被處理,所以已被鎖定?!?02”是郵件體的字節數。這里的時間則是郵件被放入隊列的時間。地址則顯示了發送者的名字。<p> 第二行則可能顯示出錯的原因,這個郵件就是因為暫時無法分發,所以才暫存在隊列中的。<p> 第三行則可能顯示接收者地址。<p> 如果你想更完整、清楚地了解這里的輸出,參見第23章:隊列。<p>2.1.3 重建別名庫模式 (-bi)<p> 由于sendmail有可能需要在存放上千條別名記錄的aliases文件中尋找別名,為了提高效率,可以使用dbm或db格式來存儲。使用這種數據庫格式來存儲將大大提高檢索速度。<p> 盡管sendmail可以在aliases文件改變時自動更新數據庫,但它并不總能及時完成。你可以通過運行newaliases命令或帶“-bi”開關選項的sendmail來完成,以下這兩個命令是相同的:<p>% newaliases<br>% /usr/lib/sendmail -bi<p> 稍過一會兒,將顯示出統計信息:<p>/etc/aliases: 859 aliases, longest 615 bytes, 28096 bytes total<p><br> 這一行表示數據庫已成功重建。從8.6版以后,就可以存在多個別名文件,所以每一行都是以別名文件名開始的。然后是顯示處理了的別名,最大的一項的長度,總長度, 同時有多少個出錯也會顯示出來。<p> 關于aliases文件更詳細的信息,參見第24章:別名。<p>2.1.4 校驗模式 (-bv)<p> 帶開關選項“-bv”的sendmail是一個簡單方便的檢查別名的工具。它能夠在別名中遞歸地查找,并顯示出最終的用戶名稱。<p> 假設aliases文件中有如下別名設置:<p>animals: farmanimals, wildanimals<br>bill-eats: redmeat<br>birds: farmbirds, wildbirds<br>bob-eats: seafood,whitemeat<br>farmanimals: pig, cow<br>farmbirds: chicken, turkey<br>fish: cod, tuna<br>redmeat: animals<br>seafood: fish,shellfish<br>shellfish: crab, lobster<br>ted-eats: bob-eats, bill-eats<br>whitemeat: birds<br>wildanimals: deer, boar<br>wildbirds: quail<p> 雖然你也可以通過演算得知ted-eats最終的用戶名稱,但遠不如使用sendmail來幫你完成那樣方便。使用sendmail也將更加準確,而且對于很大很復雜的aliases文件來說,更加顯得重要。<p> 另外,sendmail –bv還有一個附加的功能,那就是可以檢驗別名是否真的可分發。假設在aliases文件中包含以下一行:<p>root: fred, larry<p> 假定fred是一個擁有本地機器帳戶的系統管理員,但用戶larry已經離開,帳號已經被刪除。你可以運行sendmail –bv檢查所有的用戶是否有效:<p>% /usr/lib/sendmail –bv root<p> 這個命令將在aliases文件檢查root用戶,由于larry不存在,輸出將會如下所示:<p>larry … User unknow<br>fred … deliverable: mailer local, user fred<p>2.2冗長模式(-v)<p> 命令行開關選項“-v”,將使sendmail運行在冗長(verbose)模式下。在這個模式下,sendmail將會打印出轉發郵件的每一步的詳細說明。為了觀察運行在冗長模式下sendmail的運行情況,可以執行:<p>% /usr/lib/sendmail –v you < sendstuff<p> 郵件傳送在本地進行,輸出如下所示:<p>you … Connecting to loca…<br>you … Sent<p> 當sendmail通過TCP/IP網絡傳送郵件到其它機器,它將使用一個叫SMTP(簡單郵件傳輸協議)。為了觀察使用SMTP的情況,我們再次運行sendmail程序,但這次,我們使用一個不在本地的E-mail地址代替“you”:<p>% /usr/lib/sendmail –v you@remote.domain < sendstuff<p> 這個命令的輸出看起來類似:<p>you@remote.domain … Connecting to remote.domain via smtp …<br>220-remote.Domain Sendmail 8.6.12/8.5 ready at<br>Fri, 13 Dec 1996 06:36:12 –0800<br>220 ESMTP spoken here<br>>>> EHLO here.us.edu<br>250-remote.domain Hello here.us.edu,pleased to meet you<br>250-EXPN<br>250-SIZE<br>250 HELP<br>>>> MAIL From:<you@here.us.edu><br>250 <you@here.us.edu> … Sender ok<br>>>> RCPT To:<you@remote.domain><br>250 <you@remote.domain> … Recipient ok<br>>>> DATA<br>354 Enter mail, end with “.” on a line by itself<br>>>> .<br>250 GAA20115 Message accepted for delivery<br>you@remote.domain … Sent (GAA20115 Message accepted for delivery)<br>Closing connection to remote.domain<br>>>> QUIT<br>221 remote.domain closing connection<p> 以數字開頭的行和以字符串“<<<”開頭的行組成了SMTP的會話過程。我們馬上說談論一下它們。其它行顯示本地sendmail嘗試做的操作和成功完成的操作:<p>you@remote.domain … Connecting to remote.domain via smtp …<br>…<br>you@remote.domain … Sent (GAA20115 Message accepted for delivery)<br>Closing connection to remote.domain<p> 第一行顯示使用網絡發送信件到遠程主機remote.domain上。最后兩行顯示郵件已經發送成功。<p> 在SMTP會話中,以“<<<”開始的行顯示本地機器對遠程機器的交談。而來自遠程機器的應答行則以數字開始的行。現在我們來看一下會話過程。<p><br>220-remote.Domain Sendmail 8.6.12/8.5 ready at<br>Fri, 13 Dec 1996 06:36:12 –0800<br>220 ESMTP spoken here<p> 一旦sendmail與遠程機器連接上后,sendmail就等待遠程機器初始化會話。遠程機器說它準備好發送,詳細的主機名。如果遠程主機也運行了sendmail,也將說sendmail的名字與版本。還有就是日期與時間。<p> 第二行也以220開始,“ESMTP spoken here”的含義是遠程站點能夠使用擴展的SMTP協議。如果遠程機器跑的sendmail是8.7或以上版本,ESMTP將可能會出現在第一行。<p> 如果sendmail等待接收這個初始化信息太久,就會打印“Connection timed out”信息,并將這個郵件放入郵件隊列中。<p> 接著,本地sendmail發送EHLO(以>>>開始),傳送擴展的HELLO信息,和本地主機名:<p>>>> EHLO here.us.edu<br>250-remote.domain Hello here.us.edu,pleased to meet you<br>250-EXPN<br>250-SIZE<br>250 HELP<p> 在EHLO中的E說明本地sendmail也是使用ESMTP的。遠程主機以250開始的回執ESMTP支持的服務列表。<p> 如果本地機器發送EHLO消息時,傳送的是短主機名(如here)就可能會遇到一個問題。遠程主機無法得知這個短主機名的位置,因為它不在遠程主機的域remote.domain中。這也就是為什么sendmail一直使用完整的主機名來表示。一個完整的主機名是由主機名加上一個點,然后再加上DNS域名項。<p> 如果到現在為止,一切正常的話,本地機器將說明郵件的發件人:<p>>>> MAIL From:<you@here.us.edu><br>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -