| 導購 | 订阅 | 在线投稿
分享
 
 
 

用Linux作郵件服務器

來源:互聯網  2008-05-31 00:05:21  評論

在Internet上,E-mail是用戶之間交往溝通的最佳方式。通過電子郵件,可以爲Linux系統開拓新的空間,增強與外界的聯系。已經證明,電子郵件是Internet上使用最多的應用程序,甚至比WWW的使用還要多。本章介紹如何爲Linux系統安裝、配置E-mail軟件。8.1 Linux E-mail軟件簡介

Linux中的E-mail軟件系統分爲兩大類:MUA(郵件用戶代理)和MTA(郵件傳送代理)。MUA的功能是爲用戶提供讀寫郵件的界面,而MTA的作用則是處理郵件的收發工作。換言之,用戶可以通過MUA寫信、讀信,利用MTA收信、發信。 最常用的電子郵件MTA系統是sendmail,它由加州大學開發,其最新版本是8.9;另一個常見的MTA程序是smail,它由Curt Noll和Ronald Karr聯合開發,也已經發布了幾個版本。 值得注意的是,與其他大型軟件包一樣,sendmail也有自己的一些缺陷。雖然引起sendmail失敗或系統崩潰的錯誤已基本上被排除,但提供root訪問權限的安全性漏洞仍然時有發現。如果配置不當,sendmail有可能爲「黑客」提供可乘之機。爲了安全起見,用戶最好定期訪問計算機緊急反應小組(CERT,www.cert.org)的網頁,加入它的郵遞列表,或者閱讀由它主持的網絡討論組(conp.security.announce)來了解由它發出的安全性通知。 電子郵件的MUA系統目前很多,大約有十幾種,其中最常見是:mail和elm。

8.2 sendmail及其配置

本節介紹如何安裝和配置sendmail程序,不過在開始深入研究這些詳細內容之前,先介紹SMTP協議以及域名系統(DNS)對E-mail在Internet上傳輸的影響。

8.2.1 SMTP

SMTP是簡單郵件傳輸協議的簡稱,是Internet上傳輸郵件的既定標准方式。sendmail的基礎協議正是SMTP。sendmail程序提供爲Linux支持SMTP連接所需的服務。 要了解sendmail所做的各種不同工作,需要掌握有關互聯網協議的一些知識。所謂協議就是硬件和軟件進行通信所遵守的標准。協議通常分爲不同的層次,高層的協議利用低層的協議作爲基礎。例如,互聯網協議(IP)在網絡之間發送和接受數據包,但不必創建諸如SMTP和其他高層協議所使用的端到端(PPP)的連接;建立在IP之上的傳輸控制協議(TCP)提供了被Telnet和SMTP程序所使用的面向連接的服務;總而言之,TCP/IP爲互聯網提供了基本的網絡服務,例如文件傳輸協議(FTP)和SMTP的高層協議,都建立在TCP/IP之上。協議分層的優點在于,執行SMTP或FTP協議的程序不必知道與傳送數據包和連接其他主機有關的任何內容,因爲它們可以使用TCP/IP提供的服務來完成。即執行高層協議的程序不必關心低層協議的具體細節。 SMTP定義了在互聯網上交換E-mail的方式,因此軟件版本和硬件環境對交換郵件的程序來說並不重要,只要這兩個程序都正確地執行SMTP協議,它們就可以交換郵件。 下面介紹一個使用的SMTP協議的例子:位于somedomain.gov的用戶li正在向位于otherdomain.com的zhang發送郵件。 $ sendmail-v zhang@otherdomain.com zhang@otherdonain.com...Connecting to otherdomain.com via top... Trying 123.45.67.1...connected 220-otherdomain.com SMTP ready at Sun,14 Nov 1999 18:56:22-0500 220 ESMTP spoken here HELO somedomain.gov 250 otherdomain.com Hello somedomain.gov [123.45.67.2],pleased to meet you MAIL From:〈li@somedomain.gov〉 250〈li@somedomain.gov...Sender ok RCPT To:〈zhang@otherdomain.com〉 250〈zhang@otherdomain.com)...Recipient ok DATA 354 Enter mail,end with"." on a line by itself . 250 SAA08680 Message accepted for delivery QUIT 221 otherdomain.com closing connection zhang@otherdomain.com...Sent S 上面的第一行是直接調用Sendmail的一種命令格式,而不是利用用戶所喜歡的郵件用戶代理MUA(例如elm或mail)來執行這一任務。這裏-v選項告訴sendmail使用冗余模式顯示SMTP對話。其余行顯示的是SMTP客戶機和服務器進行的交談。以開始的行表示的是位于somedomain.gov處的客戶機(寄件人),緊跟其後的行是位于otherdomain.com處的服務器(收件人)的答複。以220開始的第一行是最初連接之後SMTP服務器對自己進行的聲明,它給出了自己的主機名以及日期和時間;第二行用來告訴客戶機該服務器能夠理解擴充的SMTP協議(ESMTP),以便客戶能夠使用它。像220這樣的號碼是SMTP客戶機同SMTP服務器用來通信的回複代碼,跟隨回複代碼後面的文本才是真正的內容。 如果想對這一對話有更深刻的了解,可以閱讀參考文獻RFC821。以-v選項運行sendmail有助于用戶理解SMTP對話的工作方式。 像otherdomain.com這樣的名字對于用戶理解和記憶是十分方便,而計算機采用的卻是像123.45.67.1這樣的數字化的IP地址。幸運的是,域名系統(DNS)提供了主機名到IP地址的轉化以及其他的重要信息。用戶沒有必要記憶主機的IP地址。 DNS把對主機進行命名和編號的權限分配給自治管理的域,例如,一個稱爲otherdomain. com的公司可以維護自己域中主機的所有信息。當主機a.otherdomain.com想發送郵件或遠程登錄(Telnet)到主機b.otherdomain.com時,它會通過網絡向otherdomain.com的域名服務器發送一個請示,域名服務器不妨假設是主機ns.otherdomain.com。域名服務器ns.otherdomain.com將把b.otherdomain.com的IP地址(可能還有其他信息)返回給a.otherdomain.com,這樣郵件將被發送,或者Telnet將被連接。由于us.otherdomain.com對otherdomian.com域具有管理權,因此它能夠回答對otherdomain.com中的主機的任何查詢,不管這些查詢發自哪裏;另外,它還有對域中的主機進行命名的權力。 現在,如果a.otherdomain.com上的某人想給zhang@ somedomain.gov發送郵件會怎麽樣呢?雖然us.otherdomain.com沒有位于somedomain.gov域中的主機的有關信息,但是它卻知道如何找到這一信息。當城名服務器收到它不具有此域信息的某個城中的主機的查詢請示時,它便向根域名服務器(root nameserver)詢問那個域中(在本例中是somedomain.gov)具有管理權限的域名服務器的名字和IP地址。根域名服務器將把對somedomain.gov具有管理權限的域名服務器的名字和IP地址提供給us.otherdomain.com。us.otherdomain.com域名服務器將詢問它們並把回複轉發給a.otherdomain.com。 從上可知,DNS是一個包含主機名到IP地址映射的大型分布式數據庫。另外,它還包含其他信息。當利用像。sendmail這樣的程序投遞郵件時,它必須把收件人的主機名轉化爲一個IP地址。這部分DNS數據被稱爲A(地址)記錄,它是關于主機的最基本的數據。主機數據的另一部分是郵件交換器(MX)記錄,像a.otherdomain.com主機的MX記錄列出的是能夠爲它接收郵件的一個或多個主機。 也許讀者會問:MX記錄的作用是什麽?爲什麽a.otherdomain.com不簡單地接收它自己郵件並處理這一過程呢? MX記錄的作用如下: (1)通過MX,不在Internet上的主機(例如,只利用UUCP的用戶)能夠指定一個Internet主機來接收它們的郵件,從而使它們看起來就像具有Internet地址一樣。例如,假定a. otherdomain.com只是偶爾通過UUCP連接到ns.otherdomain.com。如果us.otherdomain.com爲它發布一個MX記錄,其他Internet主機就能夠向它發送郵件。當ns.otherdomain.com收到郵件時,它把郵件保存起來,直到a.otherdomain.com同它連接。MX記錄能夠使非Internet主機也可以接收來自Internet的E-mail。 (2)通過MX,使用僅有發送功能MUA客戶程序的用戶也能接受電于郵件。假設有一台充當一群PC機的文件服務器的UNIX主機pcserv.otherdomain.com。這些PC機都具有可以發送郵件但不能接收郵件的帶有內置SATP客戶程序的MUA。如果發往外地的郵件具有類似someone@pcl.otherdomain.com的回複地址,那麽接收方如何回複信件呢?通過MX記錄,問題便迎刃而解:用pcserv.otherdomain.com做爲所有PC機的MX主機,寄向它們的郵件都將正確到達。 (3)通過MX可以把用戶的電子郵件存儲起來。由于一些難以預料的原因,主機可能會長時間地離開Internet。雖然用戶的主機離開了Internet,但發往它的郵件可能在其他主機上排隊,當經過一段時間後郵件便返回給寄件人。如果用戶的主機具有在中斷時間裏爲它保存郵件的MX主機,那麽在用戶的主機重新啓用後郵件將被投遞。這些MX主機可以是站點內的(即在用戶的域中),也可以是站點外的,或者兩者都有。有條件的情況下,最好選擇站點外的MX主機。因爲某些事故通常會使用戶的整個站點與網絡斷開,在這種情況下,站點內的MX主機也就毫無用處。 (4)MX記錄能夠隱藏信息並使用戶更靈活地重新配置自己的局域網。 收郵件的主機被命名爲wang.otherdomain.com還是liang.otherdomain.com並不重要,用戶的通信者不會知道其中的差別。 當某個SMTP客戶程序向某個主機投遞郵件時,它並不只是把主機名轉化爲IP地址。客戶程序首先查找MX記錄。如果MX記錄存在,它便按照記錄中所提供的優先級對這些記錄進行排序。例如,otherdomain.com或許就具有MX記錄,這些記錄把主機mailerl.otherdomain.com、mailer2.otherdomain.com和mailer3.somedomain.gov列爲願意爲它們收郵件的主機。注意,「主機」otherdomain.com除作爲一個MX記錄外可能並不存在,即它沒有一個可用的IP地址。雖然這些主機中的任何一個都將爲otherdomain.com接受郵件,但MX的優先級確定了SMTP客戶程序應首先嘗試投遞的主機。在這裏,系統管理員實際上已經設置了一個主郵件服務器mailer1.otherdomain.com和一個站點內的備用郵件服務器mailer2.otherdomain.com,並且還與mailer3.somedomain.gov的管理員協商,把它作爲站點外的一個備用郵件服務器。管理員通過設置MX的優先級,從而使SMTP客戶程序將首先試用主郵件代收器,其次是站點內的備用郵件服務器,最後是站點外的備用郵件服務器。 當收集和排序MX記錄之後,SMTP客戶程序把這些主機的IP地址聚集起來並按照它們的MX優先級的順序向它們投遞。當郵件傳送出現問題時,應該清楚這樣一個事實:若一封信被投遞的地址是zhang@otherdomain.com,這並不能說明主機。otherdomain.com一定存在;即使這一主機存在,或許它也不是直接接收郵件的主機。 另外,很有必要了解郵件頭和信封地址之間的差別,因爲郵件路由器處理它們的方式是不同的。下面舉例說明兩者之間的差別。 假定某個用戶有一個便箋想寄給一些同事,他們分別是A公司的li和qiu以及B公司的zhang和wang吧。用戶把便箋的一個副本交給了用戶所信任的郵件收發員xie,他記錄了所有的收件人。xie是個非常精明的人,他想爲用戶的公司節省郵費,因此把便箋複印了兩份,然後把每份放進一個寫有各自公司地址的信封裏(而不是給每個收件人都發送一個副本)。在發往A公司的信封的封面上,他寫有h和qiu的名字;在發往B公司的信封的封面上,寫有zhang和wang。當xie在A公司和B公司的的同行收到這兩個信封時,他們對便箋進行了複印並把它們分別送給了li、qiu和zhang、wang,而並不查看在便箋裏面寫的地址。對于A公司和B公司的郵件收發員來說,他們所關心的只是信封地址。 上面的比喻說明了SMTP客戶程序和服務程序的工作方式。假定zhang@somedomain.gov向他的同事li@somedomain.gov和zeng@otherdomain.com發送郵件,信頭部的收件人名單如下: To:li@somedomain.gov,zeng@otherdomain.com 如果somedomain.gov的SMTP客戶程序連接到。otherdomain.com郵件發送器來投遞zeng的副本,當它准備列出收件人(信封地址)時,它該怎麽處理呢?如果像上面To:行(郵件頭地址)那樣列出兩個收件人,li將收到信件的兩個副本,因爲otherdomain.com的郵件發送器將向somedomain.gov轉發一個副本。解決這一問題的方法是:somedomain.gov的SMTP客戶程序把信件放在一個信封裏,在此信封只包含一個主機上的收件人姓名,雖然所有收件人的名單仍然在信件的頭部,但他們在信封之內,因此位于somedomain.gov和otherdomain.com處的SMTP服務程序也就看不到他們。在本例中,寄往otherdomain.com的信封將只列出zeng,寄往somedomain.gov的信封將只列出li。 別名是說明郵件頭和信封地址不同的另一個例子。假定要把郵件發送到別名爲friends的人,friends包括的人名是Xie、zhang、li和qiu。在信中,用戶寫的是To:friends,然而。sendmail將擴展這一別名並構造一個包含所有收件人的信封。根據這些名字是否是別名,是否有可能在其他主機上,最初的消息將被裝進四個不同的信封並投遞到四個不同的主機。在每個信封上將只包含一個收件人的姓名,但在信頭中包含的卻是同一個別名friends。 sendmail允許在命令行中指定收件人,假定有個名爲letter的文件,其內容如下: To:null recipient〈 〉 Subject:To show the differebce between in header and envelope addresses This is just a test for E-mail. 利用下面的命令發送這一信件: $sendmail yourlogin〈letter 即使用戶的注冊名沒有在信件的頭部,用戶(yourlogin)也將會收到這一信件。因爲用戶的地址在信封上。除非以別的方式(例如利用-t標志)說明,否則sendmail將根據命令行上指定的收件人構造信封地址,而且郵件頭地址和信封地址並不一定要相同。

8.2.2 sendmail的安裝與配置

首先,必須獲取sendmail源代碼並進行編譯。接著,必須選擇同用戶的站點需求相接近的sendmail.cf文件並對它進行必要的修改。然後,測試sendmail和它的配置文件。最後,必須安裝sendmail、sendmail.cf以及其他輔助文件。 上面所述的是基本步驟。但根據sendmail安裝位置的不同,可能還需要修改系統登錄腳本(/etc/init.d中的一個文件),從而使sendmail在系統引導下能夠被正確地啓動。此外,如果系統沒有別名文件,還必須創建一個,別名文件通常被命名爲/usr/lib/aliases或/etc/mail/aliases(別名文件的位置將在sendmail.cf中用到,因此可以把它放在用戶想放的任何地方)。需要注意的是,可能還需要對系統的DNS數據庫進行修改。

1.獲取源代碼

RedHat 6.1配備的是sendmail-8.9.3,從www.redhat.com站點上可以得到sendmail-8.9.3的RPM版本。sendmail的這一版本可以從http://www.sendmail.org站點得到,或者通過FTP從ftp://ftp.sendmail.org得到。 注意:下載文件的確切名字依據V8 sendmail當前版本的不同而不同,當前的最新是版本8.9.3。另外,由于文件是被打包壓縮的,因此在傳輸它們之前必須爲FTP提供binary命令,即以二進制方式傳輸。還注意,應該使用自己完整的E-mail地址作爲口令,例如username@somedomain.gov。

2.解壓源、解包並編譯sendmail

在獲得了源代碼後,必須把它打開。由于它是一個被壓縮的tar映像文件,因此必須對它進行解壓,然後從tar檔案中抽取各個文件。假定文件存放在目錄/usr/local/src下面。 [root@lll src]# gzip -d sendmail-8.9.3.tar.gz [root@lll src]# tar -xvf sendmail-8.9.3.tar 執行上述操作後,將産生子目錄sendmail-8.9.3。接下來,運行cd和Is,查看這一源代碼 目錄中有哪些文件: [root@lll src]# cd sendmail-8.9.3/stc。 [root@lll src]# ls Makefile collect.c macro.c parseaddr.c srvrsmtp.c Makefiles conf.c mailp.0 pathnames.h stab.c READ_ME conf.h mailp.1 queue.c stats.c TRACEFLAGS convtime.c mailstats.h redcf.c sysexits.c alias.c daemon.c main.c recipient.c sysexits.h aliases deliver.c makesendmail safefile.c trace.c aliases.0 domain.c map.c savemail.c udb.c aliases.5 envelope.c mci.c sendmail.0 useful.h arpadate.c err.c mime.c sendmail.8 usersmtp.c cdefs.h headers.c newaliases.0 sendmail.h util.c clock.c ldap_map.h newaliases.1 sendmail.hf version.c 現在可以准備編譯sendmail了,但首先要閱讀下面的文件,這些文件包含關于用戶所下載的sendmail版本的最新消息。 FAQ RELEASE-NOTES KNOWNBUGS READ_ME 另外,還要注意doc/op子目錄中的sendmail安裝與操作指南(SIOG)。 sendmail的安裝過程非常簡單。要編譯新的sendmail版本,運行下面的命令即可。 [root@lll src]# makesendmail 在RedHat 6.x的2.2內核上,sendmail在編譯時不會出現任何警告或錯誤。如果使用光盤上的RPM軟件包文件,安裝更簡單。僅需執行下面的命令: [root@lll src]# rpm-ivh sendmail-8_9_3.rpm 在安裝新的sendmail時,一定要爲被替換的所有文件創建一個備份,特別是原來的sendmail守護程序。如果新的sendmail不能正常工作,在排除新版本的故障時,將需要恢複原來的版本。 要安裝新版本的sendmail,首先利用下面的命令停止當前運行的守護進程: [root@lll src]#/etc/rc.d/init.d/sendmail.init stop 然後把新的二進制文件拷貝到sendmail的正確位置: [root@lll src]# cp obj.Linux*/sendmail/usr/sbin/sendmail 另外,還必須把新的手冊頁文件拷貝到正確位置: [root@lll src]# cp aliases.1/usr/man/man5/aliases.5 [root@lll src]# cp mailq.0/usr/man/man1/mailq.1 [root@lll src]# cp newaliases.0/usr/man/man1/newaliases.1 [root@lll src]# cp sendmail.0/usr/man/man8/sendmail.8 現在可以利用下面的命令重新啓動新的sendmail守護進程: [root@lll src]# /etc/rc.d/init.d/sendmail/init start

3.sendmail的別名文件

sendmail依靠許多輔助文件來執行它的工作。最重要的文件是別名文件和配置文件Sendmail.cf。如果打算把sendmail作爲SMTP服務程序運行(大多數站點都這麽做),則應該安裝SMTP的幫助文件sendmail.hf。這就是關于文件sendmail.st和sendmail.hf所需說明的內容。其他輔助文件包含在sendmail的安裝和操作指南(Sendmail Internet and Operating Guide,簡稱SIOG)中。 sendmail會檢查收件人的地址是否爲別名。例如,大部分Internet站點都設有一管理員地址Webmaster,遇到問題可以向他報告。然而大多數站點並沒有這一名字的實際賬號,而是把Webmaster的郵件轉移到負責郵件管理的一個或幾個人。例如,在假設的站點somedomain.gov上,用戶zhang和li共同負責網站管理,因此別名文件會具有下面一項內容: Webmaster:zhang,li 這行代碼告訴sendmail,寄向Webmaster的郵件將被改寄到用戶名爲zhang和li處。事實上,這些名字還可以是別名,例如: Webmaster:firstgroup,secondgroup,thirdgroup firstgroup:zhang,li secondgroup:liu,deng thirdgroup:qiu,wang 在所有這些例子中,別名的名字在冒號的左邊,這些名字所代替的真實名字在冒號的右邊。sendmail將反複地分析別名直到他們被解析爲一個真正的用戶或一個遠程地址爲止。在前面的例子中,要解析別名Webrmaster,sendmail首先把它擴展爲收件人名單firstgroup、secondgroup和thirdgroup。然後進一步擴展這些別名中的每一個,從而得到最終的名單——zhang、li、liu、deng、qiu和wang。 需要指出的是,別名的右邊可以指定爲一個遠程主機,但左邊卻不能。別名zhang:zhang@otherdomain.com是合法的,而zhang@otherdomain.gov@otherdomain.com是不合法的。 別名可用于創建郵遞列表(mailing list)。在上面的例子中,別名Webmaster實際上就是一個本地郵件管理員的郵遞列表。對于大型的或是經常改動的名單,可以利用:include的別名形式指示sendmail從文件中來讀取名單的成員。如果別名文件包含行 friends::include:/home/zhang/friends.aliases 並且文件/home/zhang/friends.aliases包含 zhang li liu deng 其效果與下面的別名相同: friends:zhang,li,liu,deng 這一指令對于經常變動的郵遞列表或哪些由用戶而非郵件管理員管理的郵遞列表非常方便。如果經常要求改變郵件別名,用戶一般希望把它置于自己的控制之下。 別名文件也可被用于向某個程序發送郵件的內容。例如,許多郵遞列表的設立使用戶可以獲取所列的信息或通過向某一特定地址list-request發送信件來訂閱信息。這種信件的主體通常只包含一個單詞,比如help或subscribe等。假設zhang的郵遞列表具有名爲zhang-request的一個地址: zhang-request:|/usr/local/lib/auto-zhang-reply 上面表達式的管道號(|)通知sendmail使用程序的郵件發送器,它通常被定義爲/bin/sh。sendmail將把信息提供給/usr/local/lib/auto-zhag-reply的標准輸入,如果它存在,sendmail便考慮投遞信件。 用戶還可以創建一個使sendmail向文件發送郵件的別名。下面是別名nobody的一個例子,它在運行NFS的系統上是經常用到: nobody:/dev/null 指定文件的別名讓sendmail把它的消息追加到被指定的文件中。由于這一特殊的文件/dev/null是Linux/UNIX的「黑洞」,因此這一別名的作用其實是把郵件清除掉。

4.配置sendmail

sendmail是通過sendmail.cf文件來配置的。這個文件通常在目錄/etc下面(有些系統是在/etc/lib目錄下)。sendmail.cf文件使用的語法與其他配置文件不同,而且比較複雜。 配置文件的每一行都以一個單一的命令字符開頭,這一字符用來說明這一行的功能和語法。以#開始的行是注釋行;空行被忽略;以空格或制表符開始的行是上一行的續行,不過通常應該盡量避免續行。 下面介紹命令字符及它們的功能。 (1)# 注釋符,以#開始的行是注釋行。例如: # This file is a sample for sendmail.cf (2)D 使用格式爲:DX string。其功能是把宏X定義爲字符串string,例如: DM mail.somedomain.gov (3)C 使用格式爲:CX word1、word2。其功能是把類X定義爲wor1、word2。例如: Cw localhost my_host (4)F 使用格式爲:FX/file。其功能是把類X定義爲從文件中讀取的值。例如: Fw/etc/hosts (5)H 使用格式爲:H?mailerflag?name:template。其功能是定義郵件頭。例如: H?F?From:\ $ q (6)O 使用格式爲:OX option arguments。其功能是設置選X,例如: OL8# sets the log level to 8 (7)P 使用格式爲:Pclass=n。其功能是根據郵件的類來設置郵件投遞的優先級。例如: Pjunk=100 (8)V 使用格式爲:Vn。其功能是把配置文件的版本級別通知給V8 sendmail。例如: V3 (9)K 使用格式爲:Kname class arguments。其功能是定義一個關鍵字文件(數據庫映像)。例如: Kuucphosts dbm/etc/uuphosts (10)M 使用格式爲:Mname,f1=v1,...。其功能是定義一個郵件發送器。例如: Mpop,P=/bin/sh,F=lsD,A=sh-c $ u (11)S 使用格式爲:Sun。其功能是開始一個新的規則集。例如: S22 (12)R 使用格式爲:Rlhs rhs comment。其功能是定義一個匹配/改寫規則。例如: R $ + $>jg call ruleset jg 上面簡要地列出操作符的類型,現在對它們進行詳細介紹。 · D操作符 宏類似于shell變量,當爲一個宏定義了值後,可以在配置文件的後面對它進行引用,宏將會被它的值所取代。例如,一個配置文件可能有多個行包含假設的郵件中心mailer.somedomain.gov,爲了避免一次次地輸入這一名字,可以像下面這樣爲它定義一個宏R(代表中繼郵件發送器): DRmailer.somedomain.gov 當sendmail在sendmail.cf中遇到$ R時,sendmail將把它替換爲字符串mailer.somedomain.gov。 宏的名字通常是一個單字符。sendmail定義有許多宏,這些宏不應該被再次定義,否則將會出現一些問題。sendmail使用小寫字母來定義自己的宏;大寫字母可以被自由地使用。 · C和F操作符 類與宏類似,但是在改寫規則中用于不同目的。與宏一樣,類的名字也是一個單字符,小寫字母由sendmail使用,大寫字母用于由用戶定義的類。一個類包含有一個或多個單詞。例如,可以像下面這樣定義一個包含本地域中所有主機的類H: CH host1 host2 host3 爲了方便起見,大型的類可以續行定義。下面對類H的定義與前面定義的結果相同: CH host1 CH host2 CH host3 另外,還可以通過從某個文件中讀取它的單詞來定義一個類: CF/usr/usr/localhosts 如果/usr/localhosts文件包含host1、host2和host3,並且是每行包含一個,那麽這一定義與前面的兩個定義等價。 使用宏和類最主要的優點是它們可以集中配置文件中信息。在上面的例子中,如果決定把郵件中心由mailer.somedomain.gov改變爲mail1.somedomain.gov,只需要改變宏$ R的定義就可以了,配置文件僅需作很少的改動。否則名字mailer.somedomain.gov散布在文件的各處,那麽可能會在某些位置忘記對它們進行修改。另外,集中的重要信息,可以在單獨的一個位置詳細地對它進行注釋。由于配置文件一般比較難于理解,因此如果很長一段時間之後對自己所做的某種修改感到迷惑時,在配置文件中添加詳細的注釋是很有幫助的。 · H操作符 一般情況下,不需要對V8 sendmail的配置文件所提供的郵件頭進行修改,因爲它們已經遵從了公認的標准。下面是一些郵件頭的示例: H? D? Date:$ a H? F? Resent-From:$ q H? F? From:$ q H? x? Full-Nnme:$ x 可以看出,在郵件頭的定義中可以使用宏。當插入到某封信中時,這些宏將被擴充,由它相應的值取代。例如,在上面的例子中,用于郵件頭定義Full-Name:中的宏$ x將被取代爲寄件人的全名。在郵件頭的定義中,可選的?mailerflag?結構用來通知sendmail只有在被選擇的郵件發送器具有這一郵件發送器標志時才插入郵件頭。 假如在用戶的本地郵件發送器的定義中具有一個標志Q,並且sendmail選擇了這一郵件發送器來投遞某一信件,如果配置文件包含一個像下面這樣的郵件頭定義,那麽sendmail將把這一郵件頭插入到通過本地郵件發送器被傳遞的信件中,並利用相應的值來取代宏$ F: H? Q? It-is-a-wonderful-day:$ F 爲什麽要使用?mailerflag這一特性呢?這是因爲不同的協議可能會需要不同的郵件頭。另外,由于它們也需要不同的郵件發送器,因此可以通過在郵件發送器定義中定義相應的郵件發送器標志並使用郵件頭定義中的?mailerflag?結構,來通知sendmail是否要插入相應的郵件頭。 ·0操作符 sendmail具有許多選項,這些選項用來改變sendmail的操作或者用來通知所使用的文件的位置。大部分選項既可以通過命令行提供,也可以在配置文件中給出。例如,用戶既可以在命令行也可以在配置文件中指定別名文件的位置;要是在命令行上指定別名文件,可以使用-o選項: $ sendmail-oA/etc/aliases[other arguments...] 要是在配置文件指定別名文件,可在配置文件中添加如下一行代碼: OA/etc/aliases 這兩種方法是等價的。但由于像別名文件的位置這種選項很少改變,因此人們通常在配置文件sendmail.cf中設置它們。V8 sendmail的所有選項在SIOG中有詳細的說明。 ·P操作符 用戶可以在郵件中包含用來指示郵件的相對重要性的標題,sendmail可以根據這些標題來確定信件的優先級。假設爲V8 sendmail提供的優先級如下: Pemergent=100 Pimportant=0 Pnormal=-30 如果用戶在他們的信息中含有標題Drecedence:normal,那麽sendmail爲這些郵件提供的優先級要低于利用標題Precedence:importangt的郵件。 ·V操作符 隨著V8 sendmail的發展,許多Linux愛好者不斷地爲它添加新的特性。 V操作符能夠使V8 sendmail知道在配置文件中它可以找到哪些特性。老版本的sendmail不能夠識別這一命令。在SIOG中,對配置文件的版本級別有詳細的說明。 注意:配置文件的版本級別與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。接下來,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的位置宏。 當sendmail在0號規則集中選擇了一個郵件發送器後,它將通過1號規則集(通常是空的)來處理寄件人的地址,然後把它們發送到由這個郵件發送器中的S=標志所提供的規則集。 類似地,sendmail將把收件人的地址發送到2號規則集(通常也是空的)中進行處理,然後再把它們發送到郵件發送器的標志R=所提供的規則集。 最後,sendmail將在4號規則集中對所有地址進行後處理。4號規則集將把在3號規則集中插入的尖括號刪除。 爲什麽不同的郵件發送器具有不同的S=和R=標志呢?考慮前面向zhang@somedomain.gov和posthost!zhao發送信件的例子。如果li@othedomain.com發送郵件,它必須針對每個收件人以不同的形式出現。對于zhang,它應該是一個域地址li@otherdomain.com;對于zhao,由于otherdomain.com希望老式的UUCP地址(假設它具有一個連向posthost的UUCP鏈接並且otherdomain.com的UUCP主機名是posthost),因此返回地址應該是otherdomain!li。zhang的地址也必須爲posthost的UUCP郵件發送器進行改寫,並且zhang的副本必須包括他的郵件發送器可以處理的posthost的地址。 當sendmail把一個地址傳遞給某個規則集後,規則集中的每一個規則行將逐行地對它進行處理。如果某個規則行的lhs與地址相匹配,地址將被Ihs改寫;如果它不匹配,sendmail將繼續到下一個規則,直到達到規則集的末尾爲止。在規則集的最後,sendmail將把被改寫的地址返回給調用規則集的規則集或是固有執行順序的下一個規則集。 如果某個地址與lhs相匹配並且被rhs改寫,這一規則將再次被調用——一個隱式循環。 如前面介紹,每一個改寫規則都由R命令引人並且具有三個字段——左端(lhs或匹配端)、右端(rhs或改寫端)以及可選的注釋,各個字段之間必須由制表符隔開: Rlhs rhs coment sendmail將把地址和規則的lhs解析成標記,然後再逐個標記地把地址和lhs進行比較。宏$o包含sendmail用來把地址分隔成標記的字符,它通常具有如下的定義: #address delimiter characters Do.:%@!^/[] $o中的所有字符,既是標記分隔符,又是標記。sendmail獲取像xie@rainbow.org這樣的地址,然後根據宏o中的字符把它分解成多個標記,就像下面這樣: 「xie」「@」「rainbow」「.」「org」 sendmail也把改寫規則lhs分解爲標記,從而使它們可以同輸人的地址一個個地相比較,以確定是否匹配。例如,lhs $ -@rainbow.org分解後的內容如下: $-」「@」「rainbow」「.」「org」 其中「$-」是一個模式匹配操作符,類似于shell通配符,它用來匹配任何單一的標記符。現在可以把兩組標記放在一起來揭示sendmail如何確定一個地址是否與規則的lhs相匹配。 「xie」「@」「rainbow」「.」「org」 「$」「@」「rainbow」「.」「org」 在此例中,由于來自地址的每個標記都匹配一個常量字符串(例如rainbow)或一個模式匹配操作符($-),因此地址和lhs相匹配並且sendmail將使用rhs來改寫這一地址。接下來,考查一個改變$o值的效果。sendmail把地址xie@rainbow.org分解爲五個標記;然而,如果@字符不在$o中,這一地址將完全不同地被分解爲三個標記: 「xie@rainbow」「.」「org」 由此看來,改變$o將對sendmail的地址解析産生極大的影響。因此除非用戶對自己所做的事情非常有把握,否則應該保持它的原狀。 · 規則的左端(lhs) lhs是sendmail用來與輸入地址進行對比的模式,lhs既可以包含普通的文本,又可以包含任何模式匹配操作符。 lhs的模式匹配操作符主要包括:$-(匹配一個標記)、$+(匹配一個或多個標記)、$ *(匹配零個或多個標記)、$@(匹配空的輸入,用來調用錯誤郵件發送器)。 在lhs中,還可以利用下列宏和類的匹配操作符:$ X(匹配宏X的值)、$=C(匹配類C中的任何一個詞)、$~C(匹配不屬于類C的任何一個標記)。 模式匹配操作符以及宏和類的匹配操作符是十分必要的,因爲大多數規則必須匹配許多不同的輸入地址。例如,某個規則可能需要匹配所有以somedomain.gov結尾、以一個或多個其他任何內容開頭的地址。 · 規則的右端(rhs) rhs是改寫規則,其作用是通知sendmail如何來改寫一個與lhs相匹配的地址。lhs可以包含文本、宏及對匹配內容在lhs中的位置把它匹配的內容賦值給一個數字宏$ n。例如,假設地址zhang@hostl.somedomain.gov被傳遞給下面的規則: R $+@$+$:$1<@ $ 2>foucus on domain 在此例中,由于zhang與$+(一個或多個任何內容的標記)相匹配,因此sendmail將字符串zhang賦值給$ l;地址中的@與lhs中的@相匹配,但常量字符串不被賦值給位置宏;字符串hostl.somedomain.gov中的標記與第二個$十相匹配,因此它被賦值給了$ 2。這樣被改寫後的地址是$ l<@$ 2>,也就是zhang。 現在考查下面的這條規則: R $ * $:$ 1add local domain 當在rhs改寫一個地址後,sendmail將把改寫過的地址再與當前規則的lhs相對比。在本例中,由于$*可以與0個或多個任何內容的標記相匹配,因此無論rhs如何改寫地址,它將始終與$ *相匹配,因此這一匹配規則將無限制地循環下去。爲了避免sendmail在這條規則上進人死循環,引用了$:,它用來通知sendmail只對這一規則使用一次。 當希望一個規則集立即終止並把地址返回給調用這一規則集的規則集或sendmail固有順序中的下一個規則集時,可以在規則的rhs之前添加$@,它將使sendmail在rhs改寫地址之後立即退出這一規則集。 一個規則集可以通過在rhs前面添加$>向另一個規則集傳遞地址,考查下面這一條規則: R $ * $:$>22 $ 1 call ruleset 22 rhs的$ *匹配零個或多個標記,因此sendmail將不斷地執行rhs,但由于在rhs前具有$:,所以這一規則只被使用一次。在這一規則中,$>22 $ 1 將以 $ 1 爲輸入地址調用22號規則集。由于$ 1匹配的內容正是lhs中的內容,因此這一條規則只是把當前的輸入地址原封不動地傳遞給22號規則集。22號規則集返回的任何內容都將傳遞給這一規則集中的下一條規則。

8.2.3 測試sendmail

在安裝一個新的或經過修改的sendmail.cf之前,必須對它進行徹底的測試,因爲即使是很小的、看起來不會造成危害的修改也可能會導致嚴重的後果。 測試的第一步是創建一些地址,這些地址應該是用戶的站點需要用到的有效地址。例如,在沒有UUCP連接Internet站點somedomain.gov處,下面的地址有效。 zhang zhang@host1.somedomain.gov znang@somedomain.gov 即使somdomain.gov具有一個UUCP連接,也應該測試這些地址。其他一些需要考慮的地址包括各種別名(例如,Webmaster,include:列表,用來向文件郵寄的別名,用來向程序郵寄的別名)、非本地地址、源路由地址等等。 當創建好測試地址的列表後,可以使用-C和-bt選項來查看將要發生的情況。這些地址至少應該被傳遞3號規則集和0號規則集,從而確定它們是否能夠被路由到正確的郵件發送器。完成這一任務的比較簡單的方法是,創建一個包含被調用的規則集以及測試地址的文件,然後對它執行sendmail。例如,如果文件sdml.test包含下面的行: 3,0 zhang 3,0 zhang@hostl.somedomain.gov 3,0 zhang@somedomain.gov 那麽,可以通過輸入下面的命令來測試配置文件test.cf: $ sendmail-Ctest.cf-bt rewrite:ruleset 3 input: zhang rewrite: ruleset 3 retruns:zhang [etc.] 還可以對一個或多個地址執行改寫過程進行全面測試。例如,如果某個地址被解析到SMTP郵件發送器。並且這個郵件發送器指定R=21,那麽可以通過使用3,2,21,4等來測試收件人地址的改寫是否正確。 如果到目前爲止sendmail.cf的工作正常,那麽可以准備發送一些真正的信件。執行如下命令: $ sendmail-v-oQ/tmp-Ctest.cf recipient</dev/null 這裏的一v選項使得sendmall以冗余方式顯示信息,從而使用戶可以看到所發生的事情。看到的內容或者像zhang…Sen這樣的簡單信息或者是一個完整的SMTP對話框。-oQ/tmp用來通知sendmail使用/tmp作爲它的隊列目錄。使用這一選項很必要。因爲當利用-C選項運行時,sendmail將放棄它的超級用戶權限,並且不能把隊列文件寫到正常的郵件隊列目錄中。由于這裏使用了-C和-oQ選項,因此sendmail在信件中也將包含如下的警告標題,從而向收件人提醒一些僞造的郵件: X-Authentieation-Warning:somedomain.gov:Processed from queue/tmp X-Authentication-Warning:somdomain.gov:Processed by zhang with-C srvr.cf sendmail也將在信件中插入標題Apparemt;u-tp:zhang,這是因爲雖然在命令上指定了收件人,但信件中卻沒有任何內容。在本例中,由于信件來自空文件/dev/null,因此沒有可用的To:標題。如果以超級用戶的身份執行測試任務,那麽就可以不使用-oQ選項,sendmail便不會插人警告標題。通過創建像下面的文件並利用它作爲輸入來代替/dev/null,可以避免「Apparently-to:」標題的插入。 To:recipient test 收件人是用戶自己,以便檢查郵件頭的正確性。在一些特殊的情況下,返回地址行必須爲SMTP包含一個FQDN。因此像From:zhang@somedomain這樣的標題是不正確的,因爲它不包含名字的域名部分,但像From:zhang@somedomain.gov這樣的標題是正確的。

8.3 sendmail的工作方式

sendmail應用廣泛而且靈活,它有多種工作方式,能充當多種角色。sendmail可以作爲郵件路由器、SMTP客戶程序和SMTP服務程序。不過,它不執行最終的郵件投遞。 sendmail的主要角色是充當一個郵件路由器。即通過它獲取信件、檢查收件人地址並確定發送信件的最好路徑。sendmail是如何來執行這一任務呢? sendmail可以確定它自己的一些信息,例如當前的時間和它運行所在的主機名,但它的大部分智能是由用戶(「郵件管理員」)通過配置文件sendmail.cf的形式來提供的。這個配置文件確切地告訴sendmail如何來處理各類郵件,它非常靈活和強大,並且乍看起來似乎難于理解。 但是,正像上面介紹的那樣,V8 sendmail具有一套模塊化的配置文件構造塊,大多數站點都能夠利用這些模塊輕易地構造出配置文件,並且還包括許多示例。 像前面提到的那樣,sendmail可以作爲一個MTA運行,因爲它理解SMTP協議(V8 sendmail還理解ESMTP)。由于SMTP是一個面向連接的協議,因此客戶程序和服務程序(也稱爲發送器和接收器)總是存在。SMTP客戶程序可以向SMTP服務程序投遞信件,SMTP服務程序將不斷地監聽計算機的SMTP端口。sendmail可以是一個SMTP客戶程序,也可以是一個SMTP服務程序。當sendmail被MUA運行時,它成爲一個SMTP客戶程序,並把客戶端SMTP通知給SMTP服務程序(不必是另一個sendmail程序);當系統引導並且sendmail以守護進程模式啓動時,它不停地運行,爲新發來的郵件監聽著SMTP端口,這時sendmail就是一個服務程序了。 sendmail所不做的一件事情是郵件的最終投遞。sendmail把這一任務留給了其他程序。sendmail是一個大型的、複雜的、利用超級用戶權限運行的程序,因此需要有一些方法來解決安全性的問題,有關安全性的問題在sendmail的過去已經發生過許多次。郵件投遞的額外複雜性是sendmail有待解決的最後一個問題。

8.4 配置Elm和Pine

配置好sendmall郵件系統後,就可以發送和接受郵件了。但是僅僅能夠收發郵件還不夠,還需要顯示郵件、管理郵箱的程序,因此還必須配置MUA程序。在Linux/UNIX中有很多這樣的MUA程序,其中影響最大、應用最廣的是Elm和Pine。在Linux的各個版本都包含了這兩個郵件程序。下面介紹如何對它們進行正確的配置。

8.4.1 配置 Elm Elm代表Electronic Mail,它的功能非常強大並且提供很好的幫助系統。在多數情況下,只要sendmail郵件系統能夠正常運行,就可以運行Elm程序。 Elm的配置文件是/usr/lib/elm/elm,對于一般用戶來說,僅需修改此文件中與機器名和域名有關的選項。代碼清單8.l給出的elm.rc文件經過了刪節,僅保留了一般用戶要作修改的部分。

代碼清單 8.1 elm.rc配置文件 # Local hostname hostname=mymailer # # Domain name_ hostdomain=.sw.edu.cn # # Fully qualitifed domain name hostfullname=mymailer.sw.edu.cn # 從上面的例子可以看出,配置語句的格式是:「變量=值」,看起來比較直觀。值得注意的是,城名前面必須加上一個圓點,否則會導致機器名出錯。 缺省情況下,Elm程序使用ASCⅡ字符集,當它遇到不能識別的字符時,就調用系統進程metamail來顯示代碼。當進程metamail運行時,將減慢郵件程序Elm的運行速度。爲了使Elm程序可以處理Linux系統使用的標准字符集,要在文件/usr/lib/elm/elm.rc中加人下面的語句: displaycharset=iso-8859-l 另外,因爲Elm程序不能正確處理ISO-8859-l字符集中的有些特殊字符,所以要在文件elm.rc中加入下面兩行: charset=iso-8859-l textencoding=8bit 缺省情況下,系統將一個字節中最後一位去掉以産生7位的字符。第二行命令把系統設置成可以處理8位字符。 Elm程序的配置信息被保存在文件/usr/lib/elm/elm.rc中和用戶主目錄的.elm/elm.rc文件中。這兩個文件是Elm程序運行時自動産生的,用戶不必直接去編輯這兩個文件。 8.4.2 配置Pine Pine也是一個常用的郵件程序。和Elm一樣,Pine程序也通過一個配置文件來控制郵件程序的訪問和操作。Pine程序的配置可以引用系統變量的值,也可以由用戶定義。 Pine程序可以通過修改文件.pinerc來配置。這個配置文件比較龐大。但一般用戶僅需關心該文件的三部分:(l)系統名和用戶標志的配置;(2)郵箱的配置;(3)Pine程序屬性的配置。 下面的代碼清單8.2節選了配置文件關于系統名和用戶標志的配置部分。其中設置爲空的項表示使用系統的缺省值。如果需要用戶定制,可以在等號右邊填寫。配置的第一項是 personal-name= 一般用登錄名(賬號名)即可,當然也可以填寫其他名字。其他配置如smtp-server、nntp-server、user-domain、inbox-path都可以用系統缺省值。在配置之前,認真地閱讀開頭的注釋部分是很有必要的。

代碼清單8.2 .pinerc中系統名和用戶標志的配置部分

# Updated by Pine(tm) 4.10,copyright 1989-1999 University of Washington.

# Pine configuration file-custornize as needed.

# This file sets the configuration iptions used by Pine and PC-Pine.If you

# are using Pine on a Unix systern,there may be a systern-wide configuration

# file whick sets the defaults for these variables.There are comments in

# this file to explain each variable, but if you have questions about

# specific settings see the section on configuration options in the Pine

# notes.On Unix,run pine-conf to see how system defaults have been set.

# For variables that accept multiple values,list elements are separated

# by commas. A line beginning with a space or tab is considered to be a

# continuation of the previous line. For a variable to be unset its value

# must be blank. To set a variable to the empty string its value should

# be」」.You can override systern defaults by setting a variable to the

# empty string. Switch variables are set to either "yes" or "no",and

# default to "no".

# Lines beginning with "#"are comments,and ignored by Pine.

# 配置用戶名,一般可以用戶登錄名(即用戶賬號)。

personal-name=your_login_name

# 設置用戶的域名.

user-domain=

# 設置發信SMTP服務器,缺省情況下使用sendmail.

smtp-server=sendmail

# 設置郵遞新聞的NNTP服務器。

rmtp-server=

# 設置(本地或遠程)INBOX的路徑。本地INBOX的路徑通常是/usr/spool/mail/$ USER.

inbox-path=

下面的代碼清單8.3是文件. pinerc中關于郵箱的配置部分。如果需要改變郵箱的操作時,可以在這裏修改。

代碼清單 8.3 .pinerc 中關于郵箱的配置部分

# 除INBOX以外,設置其他的用于接收郵件的目錄(文件夾)列表。例如,{host2}inbox,

# {host3}inbox等等。

# Syntax:optnl-lal,{optnl-imap-host-name}folder-path

incoming-folders=

# 設置用于保存郵件的目錄(文件夾)列表。缺省情況下,使用列表中的第一個目錄。

例# 如,Main {host1}mail/[],Desktop mail/[]等等。

# Syntax:optnl-label{optnl-imap-hostname}optnl-directory-path[]

folder-collections=

# List,only needed if nntp-server not set,or news is on a different host

# than used for NNTP posting.Examples:News * []or News *{host3/nntp}[]

# Syntax:optnl-lable*{news-host/protoclo}[]

news-collections=

# List of folder pairs; the first indicates a folder to archive,and the

# SeC0nd indicates the folder read mp in the first should

# be moved to.

incoming-archive-folders=

# List of context and folder pairs,delimited by a space,to be offered for

# pruning each month.For example:{host1}mail/[]mumble

pruned-tolders=

# 設置保存已發送郵件消息的目錄(文件夾)。例如old-mail、{host2}sent-mail或""。

# Default:sent-mail(Unix)or SENTMAIL.MTX(PC)in default folder collection.

default-fcc=

# 設置保存郵件消息的目錄(文件夾)。例如,saved-messages或{host2}saved-mail或""。

# Default:saved-messages(Unix) or SAVEMAIL (PC)in default folder collection.

default-saved-msg-folder=

# 設置保存過期郵件消息的目錄(文件夾)。例如pm(使用保存郵件目錄(文件夾)列表中

# 的第一個目錄)或{host4}pm(使用host4的主目錄)等等。

#Default:postponed-msgs(Unix)or POSIPOND.MTX(PC)in default folder collection.

postponed-folder=

# 指定保存已讀郵件的目錄(文件夾)。

read-message-folder =

# 規定存放信件表格的目錄(文件夾)。

form-letter-folder =

# 指定簽名文件的路徑。缺省值是~/.signature。

signature-file =

# 設置用戶全局/共享郵件地址簿的文件名和路徑。

# Default: none

# Syntax: optnl -label path-name

global-address-book =

# 設置用戶私人郵件地址簿的文件名和路徑。

# 缺省值:~/. addressbook(Unix)或/ PINE/ ADDRBOOK(PC)

# Syntax: optnl-label path-name

address-boo k=

在配置文件.pinerc的最後部分是關于Pine程序屬性的設置。通過閱讀代碼清單8.4注釋,容易明白每個配置項的含義。

代碼清單8.4 .pinerc中Pine屬性的設置部分

# 設置Pine的特性列表,例如:feature-list=select-without-confirm,

# signature-at-bottom等等。

# Default condition for all of the features is no-.

feature-list =

# Pine executes these keys upon startup(e.g.to view msg 13:i,j,1,3,CR,v)

initial-keystroke-list =

# Only show these headers(by default) when composing messages

default-composer-hdrs =

# Add these customized headers(and possible default values)when composing

customized-hdrs =

# When viewing messages, include this list of headers

viewer-hdrs =

# Determines default folder name for Saves...

# Choices:default-folder,by-sender,by-from,by-recipient,last-folder-used.

# Default:"default-folder",i.e."saved-messages"(Unix)or"SAVEMAIL"(PC).

saved-msg-name-rule=

# Detemines default name for Fcc...

# Choices:default-fcc,by-recipient,last-fcc-used.

# Default:"default-fcc"(see also"default-fcc="variable.)

fcc-name-rule=

# Sets presentation order of messages in Index. Choices:

# subject,from,arrival,date,size.Default:"arrival".

sort-key=

# Sets presentation order of address book entries.Choices:dont-sort,

# fullname-with-lists-last,fullname,nickname-with-lists-last,nickname

# Default:"fullname-with-lists-last".

addrbook-sort-rule=

# Sets presentation order of folder list entries.Choices:

#

# Default:"alpha-with-directories-last".

folder-sort-rule=

# Sets the default folder and collection lffered at the Goto Command's prompt.

goto-default-rule=

# Sets message which cursor begins on.Choices:first-unseen,first-recent,

# first,last.Default:"first-unseen".

incoming-startup-rule=

# Reflects capabilities of the display you have.Default:US-ASCII.

# Typical alternatives include ISO-8859-x(x is a number between 1 and 9).

character-set=

# Specifies the program invoked by^_in the Composer,

# or the"enable-alternate-editor-implicitly"feature.

editor=

# Specifies the program invoked by ^T in the Composer.

speller=

# Specifies the column of the screen where the composer should wrap.

composer-wrap-column=

# SPecifies the string to insert when replying to a message.

reply-indent-string=

# Specifies the introduction to insert when replying to message.

reply-lisdin=

# Specifies the string to use when sending a message with no to or cc.

empty-header-message=

# Program to view images(e.g. GIF or TIFF attachments).

Image-viewer=

# If"user-domain"not set,strips hostname in FROM address.(Unix only)

use-only-domain-name=

# Your default printer selection

printer=

# List of special Print commands

personal-print-command=

# Which category default print command is in

personal-print-category=

# Set by Pine;controls beginning-of-month sent-mail pruning.

last-time-prune-questioned=99.11

# Set by Pine;controls display of"new version"message.

last-version-used=4.10

# This names the path to an alternative program,and any necessary arguments,

# to be used in posting mail messages.Example:

# /usr.lib/sendmail -oem -t -oi

# or,

# /usr/local/bin/sendit.sh

# The latter a script found in Pine distribution's contrib/util directory.

# NOTE:The program MUST read the message to be posted on standard input,

# AND operate in the style of sendmail's"-t"option.

sendmail-path=

在Internet上,E-mail是用戶之間交往溝通的最佳方式。通過電子郵件,可以爲Linux系統開拓新的空間,增強與外界的聯系。已經證明,電子郵件是Internet上使用最多的應用程序,甚至比WWW的使用還要多。本章介紹如何爲Linux系統安裝、配置E-mail軟件。  8.1 Linux E-mail軟件簡介 Linux中的E-mail軟件系統分爲兩大類:MUA(郵件用戶代理)和MTA(郵件傳送代理)。MUA的功能是爲用戶提供讀寫郵件的界面,而MTA的作用則是處理郵件的收發工作。換言之,用戶可以通過MUA寫信、讀信,利用MTA收信、發信。 最常用的電子郵件MTA系統是sendmail,它由加州大學開發,其最新版本是8.9;另一個常見的MTA程序是smail,它由Curt Noll和Ronald Karr聯合開發,也已經發布了幾個版本。 值得注意的是,與其他大型軟件包一樣,sendmail也有自己的一些缺陷。雖然引起sendmail失敗或系統崩潰的錯誤已基本上被排除,但提供root訪問權限的安全性漏洞仍然時有發現。如果配置不當,sendmail有可能爲「黑客」提供可乘之機。爲了安全起見,用戶最好定期訪問計算機緊急反應小組(CERT,www.cert.org)的網頁,加入它的郵遞列表,或者閱讀由它主持的網絡討論組(conp.security.announce)來了解由它發出的安全性通知。 電子郵件的MUA系統目前很多,大約有十幾種,其中最常見是:mail和elm。 8.2 sendmail及其配置   本節介紹如何安裝和配置sendmail程序,不過在開始深入研究這些詳細內容之前,先介紹SMTP協議以及域名系統(DNS)對E-mail在Internet上傳輸的影響。   8.2.1 SMTP SMTP是簡單郵件傳輸協議的簡稱,是Internet上傳輸郵件的既定標准方式。sendmail的基礎協議正是SMTP。sendmail程序提供爲Linux支持SMTP連接所需的服務。 要了解sendmail所做的各種不同工作,需要掌握有關互聯網協議的一些知識。所謂協議就是硬件和軟件進行通信所遵守的標准。協議通常分爲不同的層次,高層的協議利用低層的協議作爲基礎。例如,互聯網協議(IP)在網絡之間發送和接受數據包,但不必創建諸如SMTP和其他高層協議所使用的端到端(PPP)的連接;建立在IP之上的傳輸控制協議(TCP)提供了被Telnet和SMTP程序所使用的面向連接的服務;總而言之,TCP/IP爲互聯網提供了基本的網絡服務,例如文件傳輸協議(FTP)和SMTP的高層協議,都建立在TCP/IP之上。協議分層的優點在于,執行SMTP或FTP協議的程序不必知道與傳送數據包和連接其他主機有關的任何內容,因爲它們可以使用TCP/IP提供的服務來完成。即執行高層協議的程序不必關心低層協議的具體細節。 SMTP定義了在互聯網上交換E-mail的方式,因此軟件版本和硬件環境對交換郵件的程序來說並不重要,只要這兩個程序都正確地執行SMTP協議,它們就可以交換郵件。 下面介紹一個使用的SMTP協議的例子:位于somedomain.gov的用戶li正在向位于otherdomain.com的zhang發送郵件。 $ sendmail-v zhang@otherdomain.com zhang@otherdonain.com...Connecting to otherdomain.com via top... Trying 123.45.67.1...connected 220-otherdomain.com SMTP ready at Sun,14 Nov 1999 18:56:22-0500 220 ESMTP spoken here HELO somedomain.gov 250 otherdomain.com Hello somedomain.gov [123.45.67.2],pleased to meet you MAIL From:〈li@somedomain.gov〉 250〈li@somedomain.gov...Sender ok RCPT To:〈zhang@otherdomain.com〉 250〈zhang@otherdomain.com)...Recipient ok DATA 354 Enter mail,end with"." on a line by itself . 250 SAA08680 Message accepted for delivery QUIT 221 otherdomain.com closing connection zhang@otherdomain.com...Sent S 上面的第一行是直接調用Sendmail的一種命令格式,而不是利用用戶所喜歡的郵件用戶代理MUA(例如elm或mail)來執行這一任務。這裏-v選項告訴sendmail使用冗余模式顯示SMTP對話。其余行顯示的是SMTP客戶機和服務器進行的交談。以開始的行表示的是位于somedomain.gov處的客戶機(寄件人),緊跟其後的行是位于otherdomain.com處的服務器(收件人)的答複。以220開始的第一行是最初連接之後SMTP服務器對自己進行的聲明,它給出了自己的主機名以及日期和時間;第二行用來告訴客戶機該服務器能夠理解擴充的SMTP協議(ESMTP),以便客戶能夠使用它。像220這樣的號碼是SMTP客戶機同SMTP服務器用來通信的回複代碼,跟隨回複代碼後面的文本才是真正的內容。 如果想對這一對話有更深刻的了解,可以閱讀參考文獻RFC821。以-v選項運行sendmail有助于用戶理解SMTP對話的工作方式。 像otherdomain.com這樣的名字對于用戶理解和記憶是十分方便,而計算機采用的卻是像123.45.67.1這樣的數字化的IP地址。幸運的是,域名系統(DNS)提供了主機名到IP地址的轉化以及其他的重要信息。用戶沒有必要記憶主機的IP地址。 DNS把對主機進行命名和編號的權限分配給自治管理的域,例如,一個稱爲otherdomain. com的公司可以維護自己域中主機的所有信息。當主機a.otherdomain.com想發送郵件或遠程登錄(Telnet)到主機b.otherdomain.com時,它會通過網絡向otherdomain.com的域名服務器發送一個請示,域名服務器不妨假設是主機ns.otherdomain.com。域名服務器ns.otherdomain.com將把b.otherdomain.com的IP地址(可能還有其他信息)返回給a.otherdomain.com,這樣郵件將被發送,或者Telnet將被連接。由于us.otherdomain.com對otherdomian.com域具有管理權,因此它能夠回答對otherdomain.com中的主機的任何查詢,不管這些查詢發自哪裏;另外,它還有對域中的主機進行命名的權力。 現在,如果a.otherdomain.com上的某人想給zhang@ somedomain.gov發送郵件會怎麽樣呢?雖然us.otherdomain.com沒有位于somedomain.gov域中的主機的有關信息,但是它卻知道如何找到這一信息。當城名服務器收到它不具有此域信息的某個城中的主機的查詢請示時,它便向根域名服務器(root nameserver)詢問那個域中(在本例中是somedomain.gov)具有管理權限的域名服務器的名字和IP地址。根域名服務器將把對somedomain.gov具有管理權限的域名服務器的名字和IP地址提供給us.otherdomain.com。us.otherdomain.com域名服務器將詢問它們並把回複轉發給a.otherdomain.com。 從上可知,DNS是一個包含主機名到IP地址映射的大型分布式數據庫。另外,它還包含其他信息。當利用像。sendmail這樣的程序投遞郵件時,它必須把收件人的主機名轉化爲一個IP地址。這部分DNS數據被稱爲A(地址)記錄,它是關于主機的最基本的數據。主機數據的另一部分是郵件交換器(MX)記錄,像a.otherdomain.com主機的MX記錄列出的是能夠爲它接收郵件的一個或多個主機。 也許讀者會問:MX記錄的作用是什麽?爲什麽a.otherdomain.com不簡單地接收它自己郵件並處理這一過程呢? MX記錄的作用如下: (1)通過MX,不在Internet上的主機(例如,只利用UUCP的用戶)能夠指定一個Internet主機來接收它們的郵件,從而使它們看起來就像具有Internet地址一樣。例如,假定a. otherdomain.com只是偶爾通過UUCP連接到ns.otherdomain.com。如果us.otherdomain.com爲它發布一個MX記錄,其他Internet主機就能夠向它發送郵件。當ns.otherdomain.com收到郵件時,它把郵件保存起來,直到a.otherdomain.com同它連接。MX記錄能夠使非Internet主機也可以接收來自Internet的E-mail。 (2)通過MX,使用僅有發送功能MUA客戶程序的用戶也能接受電于郵件。假設有一台充當一群PC機的文件服務器的UNIX主機pcserv.otherdomain.com。這些PC機都具有可以發送郵件但不能接收郵件的帶有內置SATP客戶程序的MUA。如果發往外地的郵件具有類似someone@pcl.otherdomain.com的回複地址,那麽接收方如何回複信件呢?通過MX記錄,問題便迎刃而解:用pcserv.otherdomain.com做爲所有PC機的MX主機,寄向它們的郵件都將正確到達。 (3)通過MX可以把用戶的電子郵件存儲起來。由于一些難以預料的原因,主機可能會長時間地離開Internet。雖然用戶的主機離開了Internet,但發往它的郵件可能在其他主機上排隊,當經過一段時間後郵件便返回給寄件人。如果用戶的主機具有在中斷時間裏爲它保存郵件的MX主機,那麽在用戶的主機重新啓用後郵件將被投遞。這些MX主機可以是站點內的(即在用戶的域中),也可以是站點外的,或者兩者都有。有條件的情況下,最好選擇站點外的MX主機。因爲某些事故通常會使用戶的整個站點與網絡斷開,在這種情況下,站點內的MX主機也就毫無用處。 (4)MX記錄能夠隱藏信息並使用戶更靈活地重新配置自己的局域網。   收郵件的主機被命名爲wang.otherdomain.com還是liang.otherdomain.com並不重要,用戶的通信者不會知道其中的差別。 當某個SMTP客戶程序向某個主機投遞郵件時,它並不只是把主機名轉化爲IP地址。客戶程序首先查找MX記錄。如果MX記錄存在,它便按照記錄中所提供的優先級對這些記錄進行排序。例如,otherdomain.com或許就具有MX記錄,這些記錄把主機mailerl.otherdomain.com、mailer2.otherdomain.com和mailer3.somedomain.gov列爲願意爲它們收郵件的主機。注意,「主機」otherdomain.com除作爲一個MX記錄外可能並不存在,即它沒有一個可用的IP地址。雖然這些主機中的任何一個都將爲otherdomain.com接受郵件,但MX的優先級確定了SMTP客戶程序應首先嘗試投遞的主機。在這裏,系統管理員實際上已經設置了一個主郵件服務器mailer1.otherdomain.com和一個站點內的備用郵件服務器mailer2.otherdomain.com,並且還與mailer3.somedomain.gov的管理員協商,把它作爲站點外的一個備用郵件服務器。管理員通過設置MX的優先級,從而使SMTP客戶程序將首先試用主郵件代收器,其次是站點內的備用郵件服務器,最後是站點外的備用郵件服務器。 當收集和排序MX記錄之後,SMTP客戶程序把這些主機的IP地址聚集起來並按照它們的MX優先級的順序向它們投遞。當郵件傳送出現問題時,應該清楚這樣一個事實:若一封信被投遞的地址是zhang@otherdomain.com,這並不能說明主機。otherdomain.com一定存在;即使這一主機存在,或許它也不是直接接收郵件的主機。 另外,很有必要了解郵件頭和信封地址之間的差別,因爲郵件路由器處理它們的方式是不同的。下面舉例說明兩者之間的差別。 假定某個用戶有一個便箋想寄給一些同事,他們分別是A公司的li和qiu以及B公司的zhang和wang吧。用戶把便箋的一個副本交給了用戶所信任的郵件收發員xie,他記錄了所有的收件人。xie是個非常精明的人,他想爲用戶的公司節省郵費,因此把便箋複印了兩份,然後把每份放進一個寫有各自公司地址的信封裏(而不是給每個收件人都發送一個副本)。在發往A公司的信封的封面上,他寫有h和qiu的名字;在發往B公司的信封的封面上,寫有zhang和wang。當xie在A公司和B公司的的同行收到這兩個信封時,他們對便箋進行了複印並把它們分別送給了li、qiu和zhang、wang,而並不查看在便箋裏面寫的地址。對于A公司和B公司的郵件收發員來說,他們所關心的只是信封地址。 上面的比喻說明了SMTP客戶程序和服務程序的工作方式。假定zhang@somedomain.gov向他的同事li@somedomain.gov和zeng@otherdomain.com發送郵件,信頭部的收件人名單如下: To:li@somedomain.gov,zeng@otherdomain.com 如果somedomain.gov的SMTP客戶程序連接到。otherdomain.com郵件發送器來投遞zeng的副本,當它准備列出收件人(信封地址)時,它該怎麽處理呢?如果像上面To:行(郵件頭地址)那樣列出兩個收件人,li將收到信件的兩個副本,因爲otherdomain.com的郵件發送器將向somedomain.gov轉發一個副本。解決這一問題的方法是:somedomain.gov的SMTP客戶程序把信件放在一個信封裏,在此信封只包含一個主機上的收件人姓名,雖然所有收件人的名單仍然在信件的頭部,但他們在信封之內,因此位于somedomain.gov和otherdomain.com處的SMTP服務程序也就看不到他們。在本例中,寄往otherdomain.com的信封將只列出zeng,寄往somedomain.gov的信封將只列出li。 別名是說明郵件頭和信封地址不同的另一個例子。假定要把郵件發送到別名爲friends的人,friends包括的人名是Xie、zhang、li和qiu。在信中,用戶寫的是To:friends,然而。sendmail將擴展這一別名並構造一個包含所有收件人的信封。根據這些名字是否是別名,是否有可能在其他主機上,最初的消息將被裝進四個不同的信封並投遞到四個不同的主機。在每個信封上將只包含一個收件人的姓名,但在信頭中包含的卻是同一個別名friends。 sendmail允許在命令行中指定收件人,假定有個名爲letter的文件,其內容如下: To:null recipient〈 〉 Subject:To show the differebce between in header and envelope addresses This is just a test for E-mail. 利用下面的命令發送這一信件: $sendmail yourlogin〈letter 即使用戶的注冊名沒有在信件的頭部,用戶(yourlogin)也將會收到這一信件。因爲用戶的地址在信封上。除非以別的方式(例如利用-t標志)說明,否則sendmail將根據命令行上指定的收件人構造信封地址,而且郵件頭地址和信封地址並不一定要相同。 8.2.2 sendmail的安裝與配置 首先,必須獲取sendmail源代碼並進行編譯。接著,必須選擇同用戶的站點需求相接近的sendmail.cf文件並對它進行必要的修改。然後,測試sendmail和它的配置文件。最後,必須安裝sendmail、sendmail.cf以及其他輔助文件。 上面所述的是基本步驟。但根據sendmail安裝位置的不同,可能還需要修改系統登錄腳本(/etc/init.d中的一個文件),從而使sendmail在系統引導下能夠被正確地啓動。此外,如果系統沒有別名文件,還必須創建一個,別名文件通常被命名爲/usr/lib/aliases或/etc/mail/aliases(別名文件的位置將在sendmail.cf中用到,因此可以把它放在用戶想放的任何地方)。需要注意的是,可能還需要對系統的DNS數據庫進行修改。 1.獲取源代碼 RedHat 6.1配備的是sendmail-8.9.3,從www.redhat.com站點上可以得到sendmail-8.9.3的RPM版本。sendmail的這一版本可以從http://www.sendmail.org站點得到,或者通過FTP從ftp://ftp.sendmail.org得到。 注意:下載文件的確切名字依據V8 sendmail當前版本的不同而不同,當前的最新是版本8.9.3。另外,由于文件是被打包壓縮的,因此在傳輸它們之前必須爲FTP提供binary命令,即以二進制方式傳輸。還注意,應該使用自己完整的E-mail地址作爲口令,例如username@somedomain.gov。 2.解壓源、解包並編譯sendmail 在獲得了源代碼後,必須把它打開。由于它是一個被壓縮的tar映像文件,因此必須對它進行解壓,然後從tar檔案中抽取各個文件。假定文件存放在目錄/usr/local/src下面。 [root@lll src]# gzip -d sendmail-8.9.3.tar.gz [root@lll src]# tar -xvf sendmail-8.9.3.tar 執行上述操作後,將産生子目錄sendmail-8.9.3。接下來,運行cd和Is,查看這一源代碼 目錄中有哪些文件: [root@lll src]# cd sendmail-8.9.3/stc。 [root@lll src]# ls Makefile collect.c macro.c parseaddr.c srvrsmtp.c Makefiles conf.c mailp.0 pathnames.h stab.c READ_ME conf.h mailp.1 queue.c stats.c TRACEFLAGS convtime.c mailstats.h redcf.c sysexits.c alias.c daemon.c main.c recipient.c sysexits.h aliases deliver.c makesendmail safefile.c trace.c aliases.0 domain.c map.c savemail.c udb.c aliases.5 envelope.c mci.c sendmail.0 useful.h arpadate.c err.c mime.c sendmail.8 usersmtp.c cdefs.h headers.c newaliases.0 sendmail.h util.c clock.c ldap_map.h newaliases.1 sendmail.hf version.c 現在可以准備編譯sendmail了,但首先要閱讀下面的文件,這些文件包含關于用戶所下載的sendmail版本的最新消息。 FAQ RELEASE-NOTES KNOWNBUGS READ_ME 另外,還要注意doc/op子目錄中的sendmail安裝與操作指南(SIOG)。 sendmail的安裝過程非常簡單。要編譯新的sendmail版本,運行下面的命令即可。 [root@lll src]# makesendmail 在RedHat 6.x的2.2內核上,sendmail在編譯時不會出現任何警告或錯誤。如果使用光盤上的RPM軟件包文件,安裝更簡單。僅需執行下面的命令: [root@lll src]# rpm-ivh sendmail-8_9_3.rpm 在安裝新的sendmail時,一定要爲被替換的所有文件創建一個備份,特別是原來的sendmail守護程序。如果新的sendmail不能正常工作,在排除新版本的故障時,將需要恢複原來的版本。 要安裝新版本的sendmail,首先利用下面的命令停止當前運行的守護進程: [root@lll src]#/etc/rc.d/init.d/sendmail.init stop 然後把新的二進制文件拷貝到sendmail的正確位置: [root@lll src]# cp obj.Linux*/sendmail/usr/sbin/sendmail 另外,還必須把新的手冊頁文件拷貝到正確位置: [root@lll src]# cp aliases.1/usr/man/man5/aliases.5 [root@lll src]# cp mailq.0/usr/man/man1/mailq.1 [root@lll src]# cp newaliases.0/usr/man/man1/newaliases.1 [root@lll src]# cp sendmail.0/usr/man/man8/sendmail.8 現在可以利用下面的命令重新啓動新的sendmail守護進程: [root@lll src]# /etc/rc.d/init.d/sendmail/init start 3.sendmail的別名文件 sendmail依靠許多輔助文件來執行它的工作。最重要的文件是別名文件和配置文件Sendmail.cf。如果打算把sendmail作爲SMTP服務程序運行(大多數站點都這麽做),則應該安裝SMTP的幫助文件sendmail.hf。這就是關于文件sendmail.st和sendmail.hf所需說明的內容。其他輔助文件包含在sendmail的安裝和操作指南(Sendmail Internet and Operating Guide,簡稱SIOG)中。 sendmail會檢查收件人的地址是否爲別名。例如,大部分Internet站點都設有一管理員地址Webmaster,遇到問題可以向他報告。然而大多數站點並沒有這一名字的實際賬號,而是把Webmaster的郵件轉移到負責郵件管理的一個或幾個人。例如,在假設的站點somedomain.gov上,用戶zhang和li共同負責網站管理,因此別名文件會具有下面一項內容: Webmaster:zhang,li 這行代碼告訴sendmail,寄向Webmaster的郵件將被改寄到用戶名爲zhang和li處。事實上,這些名字還可以是別名,例如: Webmaster:firstgroup,secondgroup,thirdgroup firstgroup:zhang,li secondgroup:liu,deng thirdgroup:qiu,wang 在所有這些例子中,別名的名字在冒號的左邊,這些名字所代替的真實名字在冒號的右邊。sendmail將反複地分析別名直到他們被解析爲一個真正的用戶或一個遠程地址爲止。在前面的例子中,要解析別名Webrmaster,sendmail首先把它擴展爲收件人名單firstgroup、secondgroup和thirdgroup。然後進一步擴展這些別名中的每一個,從而得到最終的名單——zhang、li、liu、deng、qiu和wang。 需要指出的是,別名的右邊可以指定爲一個遠程主機,但左邊卻不能。別名zhang:zhang@otherdomain.com是合法的,而zhang@otherdomain.gov@otherdomain.com是不合法的。 別名可用于創建郵遞列表(mailing list)。在上面的例子中,別名Webmaster實際上就是一個本地郵件管理員的郵遞列表。對于大型的或是經常改動的名單,可以利用:include的別名形式指示sendmail從文件中來讀取名單的成員。如果別名文件包含行 friends::include:/home/zhang/friends.aliases 並且文件/home/zhang/friends.aliases包含 zhang li liu deng 其效果與下面的別名相同: friends:zhang,li,liu,deng 這一指令對于經常變動的郵遞列表或哪些由用戶而非郵件管理員管理的郵遞列表非常方便。如果經常要求改變郵件別名,用戶一般希望把它置于自己的控制之下。 別名文件也可被用于向某個程序發送郵件的內容。例如,許多郵遞列表的設立使用戶可以獲取所列的信息或通過向某一特定地址list-request發送信件來訂閱信息。這種信件的主體通常只包含一個單詞,比如help或subscribe等。假設zhang的郵遞列表具有名爲zhang-request的一個地址: zhang-request:|/usr/local/lib/auto-zhang-reply 上面表達式的管道號(|)通知sendmail使用程序的郵件發送器,它通常被定義爲/bin/sh。sendmail將把信息提供給/usr/local/lib/auto-zhag-reply的標准輸入,如果它存在,sendmail便考慮投遞信件。 用戶還可以創建一個使sendmail向文件發送郵件的別名。下面是別名nobody的一個例子,它在運行NFS的系統上是經常用到: nobody:/dev/null   指定文件的別名讓sendmail把它的消息追加到被指定的文件中。由于這一特殊的文件/dev/null是Linux/UNIX的「黑洞」,因此這一別名的作用其實是把郵件清除掉。 4.配置sendmail sendmail是通過sendmail.cf文件來配置的。這個文件通常在目錄/etc下面(有些系統是在/etc/lib目錄下)。sendmail.cf文件使用的語法與其他配置文件不同,而且比較複雜。 配置文件的每一行都以一個單一的命令字符開頭,這一字符用來說明這一行的功能和語法。以#開始的行是注釋行;空行被忽略;以空格或制表符開始的行是上一行的續行,不過通常應該盡量避免續行。 下面介紹命令字符及它們的功能。 (1)# 注釋符,以#開始的行是注釋行。例如: # This file is a sample for sendmail.cf (2)D 使用格式爲:DX string。其功能是把宏X定義爲字符串string,例如: DM mail.somedomain.gov (3)C 使用格式爲:CX word1、word2。其功能是把類X定義爲wor1、word2。例如: Cw localhost my_host (4)F 使用格式爲:FX/file。其功能是把類X定義爲從文件中讀取的值。例如: Fw/etc/hosts (5)H 使用格式爲:H?mailerflag?name:template。其功能是定義郵件頭。例如: H?F?From:\ $ q (6)O 使用格式爲:OX option arguments。其功能是設置選X,例如: OL8# sets the log level to 8 (7)P 使用格式爲:Pclass=n。其功能是根據郵件的類來設置郵件投遞的優先級。例如: Pjunk=100 (8)V 使用格式爲:Vn。其功能是把配置文件的版本級別通知給V8 sendmail。例如: V3 (9)K 使用格式爲:Kname class arguments。其功能是定義一個關鍵字文件(數據庫映像)。例如: Kuucphosts dbm/etc/uuphosts (10)M 使用格式爲:Mname,f1=v1,...。其功能是定義一個郵件發送器。例如: Mpop,P=/bin/sh,F=lsD,A=sh-c $ u (11)S 使用格式爲:Sun。其功能是開始一個新的規則集。例如: S22 (12)R 使用格式爲:Rlhs rhs comment。其功能是定義一個匹配/改寫規則。例如: R $ + $>jg call ruleset jg 上面簡要地列出操作符的類型,現在對它們進行詳細介紹。 · D操作符 宏類似于shell變量,當爲一個宏定義了值後,可以在配置文件的後面對它進行引用,宏將會被它的值所取代。例如,一個配置文件可能有多個行包含假設的郵件中心mailer.somedomain.gov,爲了避免一次次地輸入這一名字,可以像下面這樣爲它定義一個宏R(代表中繼郵件發送器): DRmailer.somedomain.gov 當sendmail在sendmail.cf中遇到$ R時,sendmail將把它替換爲字符串mailer.somedomain.gov。 宏的名字通常是一個單字符。sendmail定義有許多宏,這些宏不應該被再次定義,否則將會出現一些問題。sendmail使用小寫字母來定義自己的宏;大寫字母可以被自由地使用。 · C和F操作符 類與宏類似,但是在改寫規則中用于不同目的。與宏一樣,類的名字也是一個單字符,小寫字母由sendmail使用,大寫字母用于由用戶定義的類。一個類包含有一個或多個單詞。例如,可以像下面這樣定義一個包含本地域中所有主機的類H: CH host1 host2 host3 爲了方便起見,大型的類可以續行定義。下面對類H的定義與前面定義的結果相同: CH host1 CH host2 CH host3 另外,還可以通過從某個文件中讀取它的單詞來定義一個類: CF/usr/usr/localhosts 如果/usr/localhosts文件包含host1、host2和host3,並且是每行包含一個,那麽這一定義與前面的兩個定義等價。 使用宏和類最主要的優點是它們可以集中配置文件中信息。在上面的例子中,如果決定把郵件中心由mailer.somedomain.gov改變爲mail1.somedomain.gov,只需要改變宏$ R的定義就可以了,配置文件僅需作很少的改動。否則名字mailer.somedomain.gov散布在文件的各處,那麽可能會在某些位置忘記對它們進行修改。另外,集中的重要信息,可以在單獨的一個位置詳細地對它進行注釋。由于配置文件一般比較難于理解,因此如果很長一段時間之後對自己所做的某種修改感到迷惑時,在配置文件中添加詳細的注釋是很有幫助的。 · H操作符 一般情況下,不需要對V8 sendmail的配置文件所提供的郵件頭進行修改,因爲它們已經遵從了公認的標准。下面是一些郵件頭的示例: H? D? Date:$ a H? F? Resent-From:$ q H? F? From:$ q H? x? Full-Nnme:$ x 可以看出,在郵件頭的定義中可以使用宏。當插入到某封信中時,這些宏將被擴充,由它相應的值取代。例如,在上面的例子中,用于郵件頭定義Full-Name:中的宏$ x將被取代爲寄件人的全名。在郵件頭的定義中,可選的?mailerflag?結構用來通知sendmail只有在被選擇的郵件發送器具有這一郵件發送器標志時才插入郵件頭。 假如在用戶的本地郵件發送器的定義中具有一個標志Q,並且sendmail選擇了這一郵件發送器來投遞某一信件,如果配置文件包含一個像下面這樣的郵件頭定義,那麽sendmail將把這一郵件頭插入到通過本地郵件發送器被傳遞的信件中,並利用相應的值來取代宏$ F: H? Q? It-is-a-wonderful-day:$ F 爲什麽要使用?mailerflag這一特性呢?這是因爲不同的協議可能會需要不同的郵件頭。另外,由于它們也需要不同的郵件發送器,因此可以通過在郵件發送器定義中定義相應的郵件發送器標志並使用郵件頭定義中的?mailerflag?結構,來通知sendmail是否要插入相應的郵件頭。 ·0操作符 sendmail具有許多選項,這些選項用來改變sendmail的操作或者用來通知所使用的文件的位置。大部分選項既可以通過命令行提供,也可以在配置文件中給出。例如,用戶既可以在命令行也可以在配置文件中指定別名文件的位置;要是在命令行上指定別名文件,可以使用-o選項: $ sendmail-oA/etc/aliases[other arguments...] 要是在配置文件指定別名文件,可在配置文件中添加如下一行代碼: OA/etc/aliases 這兩種方法是等價的。但由于像別名文件的位置這種選項很少改變,因此人們通常在配置文件sendmail.cf中設置它們。V8 sendmail的所有選項在SIOG中有詳細的說明。 ·P操作符 用戶可以在郵件中包含用來指示郵件的相對重要性的標題,sendmail可以根據這些標題來確定信件的優先級。假設爲V8 sendmail提供的優先級如下: Pemergent=100 Pimportant=0 Pnormal=-30 如果用戶在他們的信息中含有標題Drecedence:normal,那麽sendmail爲這些郵件提供的優先級要低于利用標題Precedence:importangt的郵件。 ·V操作符 隨著V8 sendmail的發展,許多Linux愛好者不斷地爲它添加新的特性。 V操作符能夠使V8 sendmail知道在配置文件中它可以找到哪些特性。老版本的sendmail不能夠識別這一命令。在SIOG中,對配置文件的版本級別有詳細的說明。 注意:配置文件的版本級別與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。接下來,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的位置宏。 當sendmail在0號規則集中選擇了一個郵件發送器後,它將通過1號規則集(通常是空的)來處理寄件人的地址,然後把它們發送到由這個郵件發送器中的S=標志所提供的規則集。 類似地,sendmail將把收件人的地址發送到2號規則集(通常也是空的)中進行處理,然後再把它們發送到郵件發送器的標志R=所提供的規則集。 最後,sendmail將在4號規則集中對所有地址進行後處理。4號規則集將把在3號規則集中插入的尖括號刪除。 爲什麽不同的郵件發送器具有不同的S=和R=標志呢?考慮前面向zhang@somedomain.gov和posthost!zhao發送信件的例子。如果li@othedomain.com發送郵件,它必須針對每個收件人以不同的形式出現。對于zhang,它應該是一個域地址li@otherdomain.com;對于zhao,由于otherdomain.com希望老式的UUCP地址(假設它具有一個連向posthost的UUCP鏈接並且otherdomain.com的UUCP主機名是posthost),因此返回地址應該是otherdomain!li。zhang的地址也必須爲posthost的UUCP郵件發送器進行改寫,並且zhang的副本必須包括他的郵件發送器可以處理的posthost的地址。 當sendmail把一個地址傳遞給某個規則集後,規則集中的每一個規則行將逐行地對它進行處理。如果某個規則行的lhs與地址相匹配,地址將被Ihs改寫;如果它不匹配,sendmail將繼續到下一個規則,直到達到規則集的末尾爲止。在規則集的最後,sendmail將把被改寫的地址返回給調用規則集的規則集或是固有執行順序的下一個規則集。 如果某個地址與lhs相匹配並且被rhs改寫,這一規則將再次被調用——一個隱式循環。 如前面介紹,每一個改寫規則都由R命令引人並且具有三個字段——左端(lhs或匹配端)、右端(rhs或改寫端)以及可選的注釋,各個字段之間必須由制表符隔開: Rlhs rhs coment sendmail將把地址和規則的lhs解析成標記,然後再逐個標記地把地址和lhs進行比較。宏$o包含sendmail用來把地址分隔成標記的字符,它通常具有如下的定義: #address delimiter characters Do.:%@!^/[] $o中的所有字符,既是標記分隔符,又是標記。sendmail獲取像xie@rainbow.org這樣的地址,然後根據宏o中的字符把它分解成多個標記,就像下面這樣: 「xie」「@」「rainbow」「.」「org」 sendmail也把改寫規則lhs分解爲標記,從而使它們可以同輸人的地址一個個地相比較,以確定是否匹配。例如,lhs $ -@rainbow.org分解後的內容如下: $-」「@」「rainbow」「.」「org」 其中「$-」是一個模式匹配操作符,類似于shell通配符,它用來匹配任何單一的標記符。現在可以把兩組標記放在一起來揭示sendmail如何確定一個地址是否與規則的lhs相匹配。 「xie」「@」「rainbow」「.」「org」 「$」「@」「rainbow」「.」「org」 在此例中,由于來自地址的每個標記都匹配一個常量字符串(例如rainbow)或一個模式匹配操作符($-),因此地址和lhs相匹配並且sendmail將使用rhs來改寫這一地址。接下來,考查一個改變$o值的效果。sendmail把地址xie@rainbow.org分解爲五個標記;然而,如果@字符不在$o中,這一地址將完全不同地被分解爲三個標記: 「xie@rainbow」「.」「org」 由此看來,改變$o將對sendmail的地址解析産生極大的影響。因此除非用戶對自己所做的事情非常有把握,否則應該保持它的原狀。 · 規則的左端(lhs) lhs是sendmail用來與輸入地址進行對比的模式,lhs既可以包含普通的文本,又可以包含任何模式匹配操作符。 lhs的模式匹配操作符主要包括:$-(匹配一個標記)、$+(匹配一個或多個標記)、$ *(匹配零個或多個標記)、$@(匹配空的輸入,用來調用錯誤郵件發送器)。 在lhs中,還可以利用下列宏和類的匹配操作符:$ X(匹配宏X的值)、$=C(匹配類C中的任何一個詞)、$~C(匹配不屬于類C的任何一個標記)。 模式匹配操作符以及宏和類的匹配操作符是十分必要的,因爲大多數規則必須匹配許多不同的輸入地址。例如,某個規則可能需要匹配所有以somedomain.gov結尾、以一個或多個其他任何內容開頭的地址。 · 規則的右端(rhs) rhs是改寫規則,其作用是通知sendmail如何來改寫一個與lhs相匹配的地址。lhs可以包含文本、宏及對匹配內容在lhs中的位置把它匹配的內容賦值給一個數字宏$ n。例如,假設地址zhang@hostl.somedomain.gov被傳遞給下面的規則: R $+@$+$:$1<@ $ 2>foucus on domain 在此例中,由于zhang與$+(一個或多個任何內容的標記)相匹配,因此sendmail將字符串zhang賦值給$ l;地址中的@與lhs中的@相匹配,但常量字符串不被賦值給位置宏;字符串hostl.somedomain.gov中的標記與第二個$十相匹配,因此它被賦值給了$ 2。這樣被改寫後的地址是$ l<@$ 2>,也就是zhang。 現在考查下面的這條規則: R $ * $:$ 1add local domain 當在rhs改寫一個地址後,sendmail將把改寫過的地址再與當前規則的lhs相對比。在本例中,由于$*可以與0個或多個任何內容的標記相匹配,因此無論rhs如何改寫地址,它將始終與$ *相匹配,因此這一匹配規則將無限制地循環下去。爲了避免sendmail在這條規則上進人死循環,引用了$:,它用來通知sendmail只對這一規則使用一次。 當希望一個規則集立即終止並把地址返回給調用這一規則集的規則集或sendmail固有順序中的下一個規則集時,可以在規則的rhs之前添加$@,它將使sendmail在rhs改寫地址之後立即退出這一規則集。 一個規則集可以通過在rhs前面添加$>向另一個規則集傳遞地址,考查下面這一條規則: R $ * $:$>22 $ 1 call ruleset 22 rhs的$ *匹配零個或多個標記,因此sendmail將不斷地執行rhs,但由于在rhs前具有$:,所以這一規則只被使用一次。在這一規則中,$>22 $ 1 將以 $ 1 爲輸入地址調用22號規則集。由于$ 1匹配的內容正是lhs中的內容,因此這一條規則只是把當前的輸入地址原封不動地傳遞給22號規則集。22號規則集返回的任何內容都將傳遞給這一規則集中的下一條規則。 8.2.3 測試sendmail 在安裝一個新的或經過修改的sendmail.cf之前,必須對它進行徹底的測試,因爲即使是很小的、看起來不會造成危害的修改也可能會導致嚴重的後果。 測試的第一步是創建一些地址,這些地址應該是用戶的站點需要用到的有效地址。例如,在沒有UUCP連接Internet站點somedomain.gov處,下面的地址有效。 zhang zhang@host1.somedomain.gov znang@somedomain.gov 即使somdomain.gov具有一個UUCP連接,也應該測試這些地址。其他一些需要考慮的地址包括各種別名(例如,Webmaster,include:列表,用來向文件郵寄的別名,用來向程序郵寄的別名)、非本地地址、源路由地址等等。 當創建好測試地址的列表後,可以使用-C和-bt選項來查看將要發生的情況。這些地址至少應該被傳遞3號規則集和0號規則集,從而確定它們是否能夠被路由到正確的郵件發送器。完成這一任務的比較簡單的方法是,創建一個包含被調用的規則集以及測試地址的文件,然後對它執行sendmail。例如,如果文件sdml.test包含下面的行: 3,0 zhang 3,0 zhang@hostl.somedomain.gov 3,0 zhang@somedomain.gov 那麽,可以通過輸入下面的命令來測試配置文件test.cf: $ sendmail-Ctest.cf-bt rewrite:ruleset 3 input: zhang rewrite: ruleset 3 retruns:zhang [etc.] 還可以對一個或多個地址執行改寫過程進行全面測試。例如,如果某個地址被解析到SMTP郵件發送器。並且這個郵件發送器指定R=21,那麽可以通過使用3,2,21,4等來測試收件人地址的改寫是否正確。 如果到目前爲止sendmail.cf的工作正常,那麽可以准備發送一些真正的信件。執行如下命令: $ sendmail-v-oQ/tmp-Ctest.cf recipient</dev/null 這裏的一v選項使得sendmall以冗余方式顯示信息,從而使用戶可以看到所發生的事情。看到的內容或者像zhang…Sen這樣的簡單信息或者是一個完整的SMTP對話框。-oQ/tmp用來通知sendmail使用/tmp作爲它的隊列目錄。使用這一選項很必要。因爲當利用-C選項運行時,sendmail將放棄它的超級用戶權限,並且不能把隊列文件寫到正常的郵件隊列目錄中。由于這裏使用了-C和-oQ選項,因此sendmail在信件中也將包含如下的警告標題,從而向收件人提醒一些僞造的郵件: X-Authentieation-Warning:somedomain.gov:Processed from queue/tmp X-Authentication-Warning:somdomain.gov:Processed by zhang with-C srvr.cf sendmail也將在信件中插入標題Apparemt;u-tp:zhang,這是因爲雖然在命令上指定了收件人,但信件中卻沒有任何內容。在本例中,由于信件來自空文件/dev/null,因此沒有可用的To:標題。如果以超級用戶的身份執行測試任務,那麽就可以不使用-oQ選項,sendmail便不會插人警告標題。通過創建像下面的文件並利用它作爲輸入來代替/dev/null,可以避免「Apparently-to:」標題的插入。 To:recipient test 收件人是用戶自己,以便檢查郵件頭的正確性。在一些特殊的情況下,返回地址行必須爲SMTP包含一個FQDN。因此像From:zhang@somedomain這樣的標題是不正確的,因爲它不包含名字的域名部分,但像From:zhang@somedomain.gov這樣的標題是正確的。 8.3 sendmail的工作方式 sendmail應用廣泛而且靈活,它有多種工作方式,能充當多種角色。sendmail可以作爲郵件路由器、SMTP客戶程序和SMTP服務程序。不過,它不執行最終的郵件投遞。 sendmail的主要角色是充當一個郵件路由器。即通過它獲取信件、檢查收件人地址並確定發送信件的最好路徑。sendmail是如何來執行這一任務呢? sendmail可以確定它自己的一些信息,例如當前的時間和它運行所在的主機名,但它的大部分智能是由用戶(「郵件管理員」)通過配置文件sendmail.cf的形式來提供的。這個配置文件確切地告訴sendmail如何來處理各類郵件,它非常靈活和強大,並且乍看起來似乎難于理解。 但是,正像上面介紹的那樣,V8 sendmail具有一套模塊化的配置文件構造塊,大多數站點都能夠利用這些模塊輕易地構造出配置文件,並且還包括許多示例。 像前面提到的那樣,sendmail可以作爲一個MTA運行,因爲它理解SMTP協議(V8 sendmail還理解ESMTP)。由于SMTP是一個面向連接的協議,因此客戶程序和服務程序(也稱爲發送器和接收器)總是存在。SMTP客戶程序可以向SMTP服務程序投遞信件,SMTP服務程序將不斷地監聽計算機的SMTP端口。sendmail可以是一個SMTP客戶程序,也可以是一個SMTP服務程序。當sendmail被MUA運行時,它成爲一個SMTP客戶程序,並把客戶端SMTP通知給SMTP服務程序(不必是另一個sendmail程序);當系統引導並且sendmail以守護進程模式啓動時,它不停地運行,爲新發來的郵件監聽著SMTP端口,這時sendmail就是一個服務程序了。 sendmail所不做的一件事情是郵件的最終投遞。sendmail把這一任務留給了其他程序。sendmail是一個大型的、複雜的、利用超級用戶權限運行的程序,因此需要有一些方法來解決安全性的問題,有關安全性的問題在sendmail的過去已經發生過許多次。郵件投遞的額外複雜性是sendmail有待解決的最後一個問題。 8.4 配置Elm和Pine 配置好sendmall郵件系統後,就可以發送和接受郵件了。但是僅僅能夠收發郵件還不夠,還需要顯示郵件、管理郵箱的程序,因此還必須配置MUA程序。在Linux/UNIX中有很多這樣的MUA程序,其中影響最大、應用最廣的是Elm和Pine。在Linux的各個版本都包含了這兩個郵件程序。下面介紹如何對它們進行正確的配置。 8.4.1 配置 Elm Elm代表Electronic Mail,它的功能非常強大並且提供很好的幫助系統。在多數情況下,只要sendmail郵件系統能夠正常運行,就可以運行Elm程序。 Elm的配置文件是/usr/lib/elm/elm,對于一般用戶來說,僅需修改此文件中與機器名和域名有關的選項。代碼清單8.l給出的elm.rc文件經過了刪節,僅保留了一般用戶要作修改的部分。 代碼清單 8.1 elm.rc配置文件 # Local hostname hostname=mymailer # # Domain name_ hostdomain=.sw.edu.cn # # Fully qualitifed domain name hostfullname=mymailer.sw.edu.cn # 從上面的例子可以看出,配置語句的格式是:「變量=值」,看起來比較直觀。值得注意的是,城名前面必須加上一個圓點,否則會導致機器名出錯。 缺省情況下,Elm程序使用ASCⅡ字符集,當它遇到不能識別的字符時,就調用系統進程metamail來顯示代碼。當進程metamail運行時,將減慢郵件程序Elm的運行速度。爲了使Elm程序可以處理Linux系統使用的標准字符集,要在文件/usr/lib/elm/elm.rc中加人下面的語句: displaycharset=iso-8859-l 另外,因爲Elm程序不能正確處理ISO-8859-l字符集中的有些特殊字符,所以要在文件elm.rc中加入下面兩行: charset=iso-8859-l textencoding=8bit 缺省情況下,系統將一個字節中最後一位去掉以産生7位的字符。第二行命令把系統設置成可以處理8位字符。 Elm程序的配置信息被保存在文件/usr/lib/elm/elm.rc中和用戶主目錄的.elm/elm.rc文件中。這兩個文件是Elm程序運行時自動産生的,用戶不必直接去編輯這兩個文件。 8.4.2 配置Pine Pine也是一個常用的郵件程序。和Elm一樣,Pine程序也通過一個配置文件來控制郵件程序的訪問和操作。Pine程序的配置可以引用系統變量的值,也可以由用戶定義。 Pine程序可以通過修改文件.pinerc來配置。這個配置文件比較龐大。但一般用戶僅需關心該文件的三部分:(l)系統名和用戶標志的配置;(2)郵箱的配置;(3)Pine程序屬性的配置。 下面的代碼清單8.2節選了配置文件關于系統名和用戶標志的配置部分。其中設置爲空的項表示使用系統的缺省值。如果需要用戶定制,可以在等號右邊填寫。配置的第一項是 personal-name= 一般用登錄名(賬號名)即可,當然也可以填寫其他名字。其他配置如smtp-server、nntp-server、user-domain、inbox-path都可以用系統缺省值。在配置之前,認真地閱讀開頭的注釋部分是很有必要的。 代碼清單8.2 .pinerc中系統名和用戶標志的配置部分 # Updated by Pine(tm) 4.10,copyright 1989-1999 University of Washington. # # Pine configuration file-custornize as needed. # # This file sets the configuration iptions used by Pine and PC-Pine.If you # are using Pine on a Unix systern,there may be a systern-wide configuration # file whick sets the defaults for these variables.There are comments in # this file to explain each variable, but if you have questions about # specific settings see the section on configuration options in the Pine # notes.On Unix,run pine-conf to see how system defaults have been set. # For variables that accept multiple values,list elements are separated # by commas. A line beginning with a space or tab is considered to be a # continuation of the previous line. For a variable to be unset its value # must be blank. To set a variable to the empty string its value should # be」」.You can override systern defaults by setting a variable to the # empty string. Switch variables are set to either "yes" or "no",and # default to "no". # Lines beginning with "#"are comments,and ignored by Pine. # 配置用戶名,一般可以用戶登錄名(即用戶賬號)。 personal-name=your_login_name # 設置用戶的域名. user-domain= # 設置發信SMTP服務器,缺省情況下使用sendmail. smtp-server=sendmail # 設置郵遞新聞的NNTP服務器。 rmtp-server= # 設置(本地或遠程)INBOX的路徑。本地INBOX的路徑通常是/usr/spool/mail/$ USER. inbox-path= 下面的代碼清單8.3是文件. pinerc中關于郵箱的配置部分。如果需要改變郵箱的操作時,可以在這裏修改。 代碼清單 8.3 .pinerc 中關于郵箱的配置部分 # 除INBOX以外,設置其他的用于接收郵件的目錄(文件夾)列表。例如,{host2}inbox, # {host3}inbox等等。 # Syntax:optnl-lal,{optnl-imap-host-name}folder-path incoming-folders= # 設置用于保存郵件的目錄(文件夾)列表。缺省情況下,使用列表中的第一個目錄。 例# 如,Main {host1}mail/[],Desktop mail/[]等等。 # Syntax:optnl-label{optnl-imap-hostname}optnl-directory-path[] folder-collections= # List,only needed if nntp-server not set,or news is on a different host # than used for NNTP posting.Examples:News * []or News *{host3/nntp}[] # Syntax:optnl-lable*{news-host/protoclo}[] news-collections= # List of folder pairs; the first indicates a folder to archive,and the # SeC0nd indicates the folder read mp in the first should # be moved to. incoming-archive-folders= # List of context and folder pairs,delimited by a space,to be offered for # pruning each month.For example:{host1}mail/[]mumble pruned-tolders= # 設置保存已發送郵件消息的目錄(文件夾)。例如old-mail、{host2}sent-mail或""。 # Default:sent-mail(Unix)or SENTMAIL.MTX(PC)in default folder collection. default-fcc= # 設置保存郵件消息的目錄(文件夾)。例如,saved-messages或{host2}saved-mail或""。 # Default:saved-messages(Unix) or SAVEMAIL (PC)in default folder collection. default-saved-msg-folder= # 設置保存過期郵件消息的目錄(文件夾)。例如pm(使用保存郵件目錄(文件夾)列表中 # 的第一個目錄)或{host4}pm(使用host4的主目錄)等等。 #Default:postponed-msgs(Unix)or POSIPOND.MTX(PC)in default folder collection. postponed-folder= # 指定保存已讀郵件的目錄(文件夾)。 read-message-folder = # 規定存放信件表格的目錄(文件夾)。 form-letter-folder = # 指定簽名文件的路徑。缺省值是~/.signature。 signature-file = # 設置用戶全局/共享郵件地址簿的文件名和路徑。 # Default: none # Syntax: optnl -label path-name global-address-book = # 設置用戶私人郵件地址簿的文件名和路徑。 # 缺省值:~/. addressbook(Unix)或/ PINE/ ADDRBOOK(PC) # Syntax: optnl-label path-name address-boo k= 在配置文件.pinerc的最後部分是關于Pine程序屬性的設置。通過閱讀代碼清單8.4注釋,容易明白每個配置項的含義。 代碼清單8.4 .pinerc中Pine屬性的設置部分 # 設置Pine的特性列表,例如:feature-list=select-without-confirm, # signature-at-bottom等等。 # Default condition for all of the features is no-. feature-list = # Pine executes these keys upon startup(e.g.to view msg 13:i,j,1,3,CR,v) initial-keystroke-list = # Only show these headers(by default) when composing messages default-composer-hdrs = # Add these customized headers(and possible default values)when composing customized-hdrs = # When viewing messages, include this list of headers viewer-hdrs = # Determines default folder name for Saves... # Choices:default-folder,by-sender,by-from,by-recipient,last-folder-used. # Default:"default-folder",i.e."saved-messages"(Unix)or"SAVEMAIL"(PC). saved-msg-name-rule= # Detemines default name for Fcc... # Choices:default-fcc,by-recipient,last-fcc-used. # Default:"default-fcc"(see also"default-fcc="variable.) fcc-name-rule= # Sets presentation order of messages in Index. Choices: # subject,from,arrival,date,size.Default:"arrival". sort-key= # Sets presentation order of address book entries.Choices:dont-sort, # fullname-with-lists-last,fullname,nickname-with-lists-last,nickname # Default:"fullname-with-lists-last". addrbook-sort-rule= # Sets presentation order of folder list entries.Choices: # # Default:"alpha-with-directories-last". folder-sort-rule= # Sets the default folder and collection lffered at the Goto Command's prompt. goto-default-rule= # Sets message which cursor begins on.Choices:first-unseen,first-recent, # first,last.Default:"first-unseen". incoming-startup-rule= # Reflects capabilities of the display you have.Default:US-ASCII. # Typical alternatives include ISO-8859-x(x is a number between 1 and 9). character-set= # Specifies the program invoked by^_in the Composer, # or the"enable-alternate-editor-implicitly"feature. editor= # Specifies the program invoked by ^T in the Composer. speller= # Specifies the column of the screen where the composer should wrap. composer-wrap-column= # SPecifies the string to insert when replying to a message. reply-indent-string= # Specifies the introduction to insert when replying to message. reply-lisdin= # Specifies the string to use when sending a message with no to or cc. empty-header-message= # Program to view images(e.g. GIF or TIFF attachments). Image-viewer= # If"user-domain"not set,strips hostname in FROM address.(Unix only) use-only-domain-name= # Your default printer selection printer= # List of special Print commands personal-print-command= # Which category default print command is in personal-print-category= # Set by Pine;controls beginning-of-month sent-mail pruning. last-time-prune-questioned=99.11 # Set by Pine;controls display of"new version"message. last-version-used=4.10 # This names the path to an alternative program,and any necessary arguments, # to be used in posting mail messages.Example: # /usr.lib/sendmail -oem -t -oi # or, # /usr/local/bin/sendit.sh # The latter a script found in Pine distribution's contrib/util directory. # NOTE:The program MUST read the message to be posted on standard input, # AND operate in the style of sendmail's"-t"option. sendmail-path=
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有