本文是 Unix/Linux 系統(tǒng)管理自動(dòng)化系列中的一篇,主要講述郵件系統(tǒng)的配置,以及如何利用 Perl 腳本來實(shí)現(xiàn)電子郵件的自動(dòng)發(fā)送。本文內(nèi)容包括郵件傳輸代理 (MTA) 在 AIX 和 LINUX 系統(tǒng)中的具體配置,如何通過 sendmail 發(fā)送郵件,以及如何接收局域網(wǎng)內(nèi)的用戶郵件。 在 UNIX/Linux 系統(tǒng)的自動(dòng)化管理中,利用腳本自動(dòng)發(fā)送郵件的功能對系統(tǒng)監(jiān)控的工作來說是非常重要的。系統(tǒng)管理人員可以利用 cron 或者 RMC 來創(chuàng)建監(jiān)控腳本,一旦觸發(fā)條件被滿足,操作系統(tǒng)就會(huì)自動(dòng)創(chuàng)建電子郵件,將相關(guān)的狀態(tài)信息發(fā)送到指定的郵箱。通過電子郵件系統(tǒng),系統(tǒng)管理人員就能夠及時(shí)得獲取被管理系統(tǒng)的狀態(tài),進(jìn)而采取相應(yīng)的措施。這種方式可以顯著地節(jié)省系統(tǒng)管理人員的工作強(qiáng)度,并能夠提高系統(tǒng)的可維護(hù)性。 Unix/Linux 郵件系統(tǒng)組成簡介 在傳統(tǒng)的 UNIX 和 Linux 系統(tǒng)中,電子郵件系統(tǒng)的主要組成部分包括郵件用戶代理 (MUA -- mail user agent)、郵件傳輸代理(MTA -- mail transfer agent)、郵件提交代理 (MSA -- mail submission agent)、郵件投遞代理 (MDA -- mail delivery agent) 和郵件訪問代理 (MAA -- mail access agent)。在日常工作中,系統(tǒng)管理人員經(jīng)常接觸的主要有郵件用戶代理 (MUA) 和郵件傳輸代理 (MTA)。在 AIX 系統(tǒng)中,一個(gè)典型的郵件系統(tǒng)如圖 1 所示。 圖 1. 郵件系統(tǒng)示意圖 ![]() 郵件用戶代理(MUA)是一個(gè)用來讀寫 mail 的程序,實(shí)際上就是郵件系統(tǒng)的客戶端程序。它提供了閱讀,發(fā)送和接受電子郵件的用戶接口。最常用的郵件用戶代理有 mutt,mail,elm,pine,它們都是隨基本系統(tǒng)安裝的 簡單郵件應(yīng)用程序。 郵件傳輸代理(MTA)是一個(gè)在兩個(gè)主機(jī)之間或者本地同一主機(jī)內(nèi)傳送郵件的程序,它負(fù)責(zé)郵件的存儲(chǔ)和轉(zhuǎn)發(fā),并決定傳送郵件到目的地的路線。 UNIX/Linux 系統(tǒng)的標(biāo)準(zhǔn) MTA 是 sendmail,其他的 MTA 還有 qmail, exim 和微軟的 Exchange。MTA 會(huì)監(jiān)視用戶代理的請求,根據(jù)電子郵件的目標(biāo)地址找出對應(yīng)的郵件服務(wù)器,在服務(wù)器之間傳輸郵件并將接收到的郵件進(jìn)行緩沖。 郵件投遞代理(MDA)通常被 MTA 用來投遞郵件到接收者的郵箱中。它能夠從 MTA 接收郵件,并根據(jù)指定的規(guī)則來進(jìn)行本地投遞;它可以把郵件投遞到本地用戶、郵件列表、文件或者應(yīng)用程序。UNIX/Linux 系統(tǒng)中常用的 MDA 包括 maildrop、procmail、postfix 和 delivermail 等。Postfix 用一個(gè)或多個(gè) MDA 來遞送郵件 , procmail 是另外一個(gè)有名的 MDA. 郵件提交代理(MSA)負(fù)責(zé)消息發(fā)送之前的所有必須完成的準(zhǔn)備工作和錯(cuò)誤檢測。MSA 就如同在 MUA 和 MTA 之間的一個(gè)頭腦清醒的檢測人員,它會(huì)對所有的主機(jī)名和從 MUA 得到的信息頭等信息進(jìn)行檢測。 MAA 郵件訪問代理(MAA)將用戶連接到郵件系統(tǒng),并通過 POP 或 IMAP 協(xié)議來收取郵件。UNIX/Linux 系統(tǒng)中,常用的 MAA 有 UW-IMAP、Cyrus-IMAP、COURIER-IMAP 等;當(dāng)郵件向目的地址進(jìn)行傳輸時(shí),一旦源地址和目的地址都不是本地系統(tǒng),那么本地系統(tǒng)就會(huì)作為郵件的中繼。 對于大多數(shù)郵件用戶來說,利用郵件客戶端來接收、查看和發(fā)送電子郵件是最常用的功能。接收和查看郵件比較簡單,但是電子郵件的發(fā)送則相對復(fù)雜。在下面的章節(jié)里面,本文將根據(jù)不同的操作系統(tǒng)來具體介紹如何配置郵件服務(wù)器。 發(fā)送郵件代理配置及自動(dòng)化發(fā)送 Linux 的 sendmail 配置 配置文件 在 Linux 系統(tǒng)中,Sendmail 包括如下配置文件:
我們將會(huì) 在下面的章節(jié)中詳細(xì)介紹這些配置文件。 /etc/sendmail.cf /etc/sendmail.cf 是 sendmail 的主配置文件。該文件存儲(chǔ)了正在運(yùn)行的 mailer 程序的類型信息,定義了重寫郵件地址的規(guī)則和 sendmail 命令的操作環(huán)境。因?yàn)?sendmail.cf 的語法比較復(fù)雜,我們一般不建議手動(dòng)修改該配置文件。安裝了 sendmail 的 UNIX/Linux 系統(tǒng)都會(huì)帶有 sendmail.cf,而且該配置文件在大多數(shù)情況下都不需要修改就可以使用。如果用戶確實(shí)需要修改 sendmail.cf 配置文件 , 一般建議用戶基于 sendmail.mc 宏文件,利用 m4 程序來生成新的 sendmail.cf 文件。 在 RedHat Linux 系統(tǒng)中,sendmail.mc 宏文件位于 /etc/mail/ 目錄。 而 SuSE Linux 系統(tǒng)并沒有 sendmail.mc 文件,相應(yīng)的,它提供了 /etc/mail/linux.mc ( 或者 /etc/mail/linux.nullclient.mc) 替代 sendmail.mc。/etc/mail/linux.mc 是 SuSEconfig 使用 /etc/rc.config 和 /etc/rc.config.d/sendmail.rc.config (SuSE <= 7.3) 或者 /etc/sysconfig/sendmail (SuSE >= 8.0)的參數(shù)而生成的宏文件。SuSEconfig 執(zhí)行 /sbin/conf.d/SuSEconfig.sendmail 腳本來構(gòu)建 .mc 文件,并執(zhí)行 m4 來生成 sendmail.cf 配置文件。用戶可以依照清單 1 所示的 SuSEconfig.sendmail 命令來生成配置文件。 清單 1. 使用 SuSEconfig.sendmail 命令生成配置文件
復(fù)制代碼 在 sendmail.mc 配置文件中經(jīng)常出現(xiàn)如下的 m4 命令: define: 用于定義配置文件中變量的值 divert: 用于定向 m4 進(jìn)程的輸出。 divert 被設(shè)置為 -1 時(shí) , 取消輸出。如果 divert(-1) 在一個(gè)文本塊的前面出現(xiàn),這段文本將不會(huì)再 sendmail.cf 中出現(xiàn) . divert 被設(shè)置為 0 時(shí)來定向數(shù)據(jù)流的輸出,如 sendmail.cf, VERSIONID: 配置文件定義版本控制信息。 dnl: 注釋掉后面的所有字符。 dnl 出現(xiàn)在行尾,表示將清除掉不想要的空白行;dnl 出現(xiàn)在行首,表示這一行將被當(dāng)成注釋。 DOMAIN: 選擇傳輸郵件的域。 FEATURE: 識別配置文件中一個(gè)特性 (Feature)。 MAILER: 識別包含在 sendmail.cf 一套郵件傳輸方法。 OSTYPE: 定義宏所使用的操作系統(tǒng),它允許 m4 程序增加同相關(guān)操作系統(tǒng)相關(guān)的文件。 undefine: 清除配置文件中的變量值。 需要注意的是,m4 宏處理器生成的 sendmail.cf 文件必須放在 /etc/ 目錄 , 而非 /etc/mail。具體的操作如清單 2 所示。 清單 2.m4 命令生成配置文件 sendmail.cf
復(fù)制代碼 在用戶修改完成 sendmail.cf 配置文件以后,最后一步操作是重新啟動(dòng) sendmail 服務(wù),具體的操作如清單 3 所示: 清單 3. 重啟 sendmail 服務(wù)
復(fù)制代碼 access 數(shù)據(jù)庫是由 sendmail V8.9 版本引入的特性, 并在 V8.10 重得到很好的發(fā)展。它提供了一個(gè)單一集中管理的訪問規(guī)則數(shù)據(jù)庫;它可以基于發(fā)信者的姓名、地址或者 IP 來判斷是否接受 (OK)、轉(zhuǎn)發(fā)(RELAY)、拒絕 (REJECT) 或者取消 (DISCARD)。sendmail 會(huì)在接收郵件時(shí)進(jìn)行規(guī)則判斷,默認(rèn)情況下只接受本機(jī)發(fā)送的郵件。 對本地設(shè)置來說,/etc/mail/access 和 access.db 并不是必需的;只有在建立中央郵件集中服務(wù)器來處理所有郵件的時(shí)候才需要這兩個(gè)文件。 access 數(shù)據(jù)庫的配置主要有三個(gè)步驟,具體操作如下所示。
/etc/mail/aliases 和 aliases.db aliases 是 sendmail 郵件系統(tǒng)的別名數(shù)據(jù)庫。它可以定義郵遞列表,在機(jī)器之間轉(zhuǎn)發(fā)郵件,或者允許用多個(gè)名字指定一個(gè)用戶。因?yàn)?Aliases 別名處理的規(guī)則是遞歸的,所以一個(gè)別名指向的目的地也可以是別名。對于每個(gè)信封,sendmail 都會(huì)在別名文件中查找本地用戶的收件人名稱。由于 Sendmail 的可能要在 aliases 文件中搜索數(shù)以千計(jì)的收件人名稱,所以一個(gè)以 DB 數(shù)據(jù)庫格式存儲(chǔ)的 aliases 文件副本被創(chuàng)建,并用來提高查詢的速度。 同樣,這兩個(gè)配置文件也不是必需的。如果 sendmail 是使用中央服務(wù)器的郵件處理中心處理所有郵件的話,安裝在鄰居服務(wù)器或客戶機(jī)的 aliases 和 aliases.db 文件就不需要了。 aliases 數(shù)據(jù)庫的配置主要有三個(gè)步驟,如下所示。 1.修改 /etc/mail/aliases。修改后的內(nèi)容如清單 6 所示。 清單 6. 修改后的 aliases 文件
復(fù)制代碼 2.根據(jù) /etc/mail/ aliases 來創(chuàng)建數(shù)據(jù)庫映射文件 aliases.db,該命令如清單 7 所示。 清單 7. 創(chuàng)建數(shù)據(jù)庫映射文件 aliases.db
復(fù)制代碼 3.重啟 sendmail,讀取 aliases.db,具體的命令如清單 3 所示。
復(fù)制代碼 其他配置文件 除了上文中介紹的配置文件以外,sendmail 還使用了其他的一些配置文件,本節(jié)將逐一介紹這些配置文件。 /etc/mail/local-host-names 設(shè)置服務(wù)器提供服務(wù)的域名,即本地主機(jī)名的主機(jī)名列表。該文件被修改后,sendmail 必須重新啟動(dòng)來更新設(shè)置; /etc/mail/virtusertable 和 virtusertable.db virtusertable 數(shù)據(jù)庫用于映射虛擬域到新的地址。這個(gè)特性可以使網(wǎng)絡(luò)上的虛擬域郵件被投遞到本地系統(tǒng)、遠(yuǎn)程系統(tǒng)或者單一用戶地址。/etc/mail /virtusertable 被修改以后,我們可以使用 makemap 命令來生成 /etc/mail/virtusertable.db。同樣,該文件被修改后,sendmail 必須重新啟動(dòng)來更新設(shè)置。 /etc/mail/domaintable 和 domaintable.db domaintable 數(shù)據(jù)庫用于映射舊域名到新域名。這個(gè)特性使得網(wǎng)絡(luò)上多個(gè)域名可以由舊域名重寫到新域名中。/etc/mail/domaintable 文件被修改后,我們可以利用 makemap 命令來生成 /etc/mail/domaintable.db。同樣,該文件被修改后,sendmail 必須重新啟動(dòng)來更新設(shè)置。 /etc/mail/mailertable 和 mailertable.db mailertable 數(shù)據(jù)庫通過一種特殊的郵寄程序,把尋址到特定主機(jī)(或域)的郵件重定向到替代的目的地。這個(gè)特性使得網(wǎng)絡(luò)上的郵件可以通過特殊的投遞代理被投遞到一個(gè)新的本地域名或遠(yuǎn)程域名。/etc/mail/mailertable 被修改后,我們可以利用 makemap 命令生成 /etc/mail/mailertable.db。同樣,該文件被修改后,sendmail 必須重新啟動(dòng)來更新設(shè)置。 ~/.forward 普通用戶可以通過主目錄下的 .forward 文件來實(shí)現(xiàn)郵件的別名和轉(zhuǎn)發(fā)等功能。 驗(yàn)證 sendmail 服務(wù) 我們可以通過 telnet 程序來訪問 localhost 的 25 端口,從而可以驗(yàn)證 sendmail 服務(wù)是否正常啟動(dòng)。如果能夠登陸成功,則說明 sendmail 服務(wù)已經(jīng)成功啟動(dòng)。具體的驗(yàn)證過程如清單 8 所示。 清單 8. 驗(yàn)證 sendmail 服務(wù)
復(fù)制代碼 自動(dòng)發(fā)送郵件的腳本實(shí)現(xiàn) 在 SLES11 系統(tǒng)中,sendmail-8.13.6-9.15 已經(jīng)被默認(rèn)安裝,清單 9 所示的 Perl 腳本可以實(shí)現(xiàn)從本地主機(jī)自動(dòng)發(fā)送郵件到遠(yuǎn)程郵箱的功能,發(fā)送的郵件將包含發(fā)送者的 mail 地址、接收者的 mail 地址、郵件主題、郵件的內(nèi)容以及兩個(gè)附件。 清單 9. 自動(dòng)發(fā)送郵件的 Perl 腳本
復(fù)制代碼 AIX 的 sendmail 配置 AIX 的 mail 系統(tǒng)中最重要的三個(gè)組成部分是用戶接口 (the user interface)、消息路由程序 (the message routing program) 和消息投遞程序 (the message delivery program) 或 mailer。AIX 系統(tǒng)中的 mail 程序就是所謂的用戶接口 (the user interface),它對應(yīng)上文提到的郵件用戶代理 MUA;sendmail 程序就是所謂的消息路由程序 (the message routing program),它對應(yīng)前面所說的郵件傳輸代理 MTA。在傳遞郵件的時(shí)后,如有必要,sendmail 命令將與遠(yuǎn)程系統(tǒng)建立 TCP/IP 連接 , 然后使用 SMTP 傳遞郵件到遠(yuǎn)程系統(tǒng)。 AIX 郵件系統(tǒng)的工作原理和配置,和 Linux 基本都相同,特殊的地方有以下幾點(diǎn)。 1. 生成配置文件的腳本的位置 /usr/samples/tcpip/sendmail/cf/aixsample.mc 被用來生成 sendmail 相應(yīng)的配置文件。 2. sendmail daemon 啟動(dòng)和關(guān)閉的方式 啟動(dòng) sendmail: startsrc -s sendmail 關(guān)閉 sendmail: stopsrc -s sendmail 3. 通過 SMTP 服務(wù)器發(fā) Internet 郵件 在使用 SMTP 代理的情況下,sendmail 需要對 /etc/sendmail.cf 配置文件中的 DS 項(xiàng)進(jìn)行修改。DS 項(xiàng)是指被用來轉(zhuǎn)發(fā)郵件的主機(jī)。注意,該配置項(xiàng)修改以后,sendmail daemon 必須重啟才能生效。/etc/sendmail.cf 文件的具體的修改內(nèi)容如清單 10 所示。 清單 10./etc/sendmail.cf 文件的修改內(nèi)容 # "Smart" relay host (may be null) DS[SMTP 的主機(jī) IP] 自動(dòng)發(fā)送郵件的腳本實(shí)現(xiàn) 在 AIX6100-03 操作系統(tǒng)中,sendmail version AIX6.1/8.13.4 已經(jīng)被默認(rèn)安裝。在這樣的配置環(huán)境中,本節(jié)將給出兩個(gè)實(shí)現(xiàn)不同功能的 Perl 腳本。 清單 11 中的 Perl 腳本實(shí)現(xiàn)了郵件帶主題和附件的功能。 清單 11. 帶有附件的郵件自動(dòng)化發(fā)送郵件腳本
復(fù)制代碼 清單 12 中的 Perl 腳本實(shí)現(xiàn)了不帶附件、有郵件內(nèi)容的自動(dòng)化發(fā)送郵件的功能。 清單 12. 不帶附件的郵件自動(dòng)發(fā)送郵件的腳本實(shí)現(xiàn)
復(fù)制代碼 不依賴郵件客戶端配置的實(shí)現(xiàn) 利用 Perl 模塊實(shí)現(xiàn)郵件的發(fā)送 我們同樣可以借助許多現(xiàn)有的 Perl 模塊來實(shí)現(xiàn)電子郵件的發(fā)送功能。從 CPAN 網(wǎng)站上的如下鏈接 (http://search.cpan.org/modlist/Mail_and_Usenet_News/Mail)中,我們可以找到許多與 Mail 配置、傳輸相關(guān)的 Perl 模塊,比如 Mail::Mailer,Mail::POP3Client, Mail::Postfix, Mail::Internet, Mail::Sendmail, Mail::Sender 等等。 CPAN 網(wǎng)站上有如此眾多的 Perl 模塊可供選擇,我們最終選擇了 Mail::Mailer。Mail::Mailer 是由 Mark Overmeer <mark@overmeer.net> 開發(fā)的,已經(jīng)被集成進(jìn) MailTools 模塊。目前 Mail::Mailer 版本為 2.04,用戶可以在如下的鏈接地址上找著詳細(xì)的介紹信息:http://search.cpan.org/~markov/MailTools-2.04/lib/Mail/Mailer.pod??傮w上來說,Mail::Mailer 的實(shí)現(xiàn)很簡潔,雖然它提供了很少的編程接口,但對于郵件的發(fā)送來說已經(jīng)足夠。 Mail::Mailer 的安裝 我們可以通過 CPAN 來安裝 Mail::Mailer。不過需要注意的是,在使用 CPAN 安裝 Mail::Mailer 之前,我們需要確保計(jì)算機(jī)可以連接到 Internet 網(wǎng)絡(luò)。 我們可以在 Linux/UNIX 終端下輸入清單 13 中的命令進(jìn)入 CPAN 的操作界面。CPAN 的命令行界面如清單 14 所示。 清單 13. 進(jìn)入 CPAN 操作界面
復(fù)制代碼 清單 14.CPAN 的命令行界面
其中,cpan[1]>是 CPAN shell 的提示符;我們可以在它后面輸入相應(yīng)的 CPAN 命令來完成特定的功能。最后,我們可以通過在 CPAN 的操作界面中輸入清單 15 中的命令來安裝 Mail::Mailer。CPAN 會(huì)自動(dòng)連接到 CPAN 網(wǎng)站搜索并下載 Mail::Mailer 相關(guān)的包,并最終完成 Mail::Mailer 的安裝。 清單 15. 安裝 Mail::Mailer cpan[1]> install Mail::Mailer Mail::Mailer 的接口 Mail::Mailer 提供的是面向?qū)ο蟮慕涌?。它非常簡單,除?Mail::Mailer 對象構(gòu)造和析構(gòu)的方法以外,只有一個(gè) open 方法需要介紹。 使用 new 來構(gòu)造 Mail::Mailer 對象的方法如清單 16 所示。 清單 16.Mail:Mailer 對象的構(gòu)造方法 Mail::Mailer->new(TYPE, ARGS) 其中,TYPE 是指后臺(tái)的郵件發(fā)送程序,而 ARGS 是指傳遞給該后臺(tái)郵件發(fā)送程序的參數(shù)列表。目前可用的 TYPE 值有 sendmail,smtp,qmail 和 testfile。 sendmail: 它會(huì)調(diào)用系統(tǒng)中已安裝的 sendmail 做為郵件發(fā)送程序; smtp: 它會(huì)通過 Net::SMTP 模塊去投遞郵件; qmail: 它就會(huì)使用 qmail 的 qmail-inject 程序去發(fā)送郵件; testfile: 用來調(diào)試的參數(shù),它會(huì)將相關(guān)的數(shù)據(jù)寫入日志文件。 另外需要說明的方法是 $obj->open(),它的聲明和參數(shù)說明如清單 17 所示。 清單 17.Mail::Mailer 對象的 open() 方法 $obj->open(HASH) 當(dāng)通過 Mail::Mailer->new(TYPE, ARGS)成功創(chuàng)建 Mail::Mailer 對象以后,我們就可以通過 open() 方法來構(gòu)建郵件。這里 HASH 類型的參數(shù)包含一系列的 key 和對應(yīng)的 value;注意,這些 key 值必須是郵件的 head 域所包含的值,比如 To,F(xiàn)rom,Replyto,Subject,Cc,Bcc 等等;而 value 必須是這些 key 所對應(yīng)的值。 Mail::Mailer 發(fā)送郵件的腳本實(shí)現(xiàn) 我們將給出一個(gè)使用 Mail::Mailer 來發(fā)送電子郵件到指定郵箱的實(shí)例,如清單 18 所示。我們使用 sendmail 作為后臺(tái)的郵件發(fā)送程序。 清單 18. 使用 Mail::Mailer 發(fā)送郵件
復(fù)制代碼 結(jié)合 cron 的系統(tǒng)監(jiān)控功能實(shí)現(xiàn) 系統(tǒng)管理人員可以結(jié)合 cron 與電子郵件的自動(dòng)發(fā)送功能,實(shí)現(xiàn)系統(tǒng)狀態(tài)的自動(dòng)監(jiān)控功能。cron 是一個(gè)定時(shí)調(diào)度任務(wù)的守護(hù)進(jìn)程,它可以根據(jù)時(shí)間、日期、月份、星期的組合來調(diào)度任務(wù)。 監(jiān)控系統(tǒng) CPU 利用率(LINUX) 我們首先實(shí)現(xiàn)一個(gè)可以獲取當(dāng)前系統(tǒng) CPU 使用率的 Perl 腳本。它可以獲取當(dāng)前的 CPU 使用率,一旦獲取到的 CPU 使用率超過 85%,該腳本就會(huì)自動(dòng)發(fā)送電子郵件給指定的用戶。注意,該腳本只能運(yùn)行于 Linux 平臺(tái)。 具體的 Perl 腳本內(nèi)容可以參考清單 19。 清單 19. 監(jiān)控系統(tǒng) CPU 利用率的腳本
復(fù)制代碼 配置 cron 任務(wù) 我們可以利用“crontab”命令來配置 cron 任務(wù);在本文中,我們設(shè)定每個(gè)小時(shí)的第 30 分鐘運(yùn)行一下監(jiān)控系統(tǒng) CPU 利用率的腳本。我們使用”crontab – e”命令來編輯當(dāng)前用戶的 cron 任務(wù),編輯的內(nèi)容如清單 20 所示,其中 mon.pl 是清單 19 中 Perl 腳本的名稱,/path/to/ 是指 mon.pl 腳本的路徑。 清單 20. 配置 cron 任務(wù)
復(fù)制代碼 小結(jié) 本文是 Unix/Linux 系統(tǒng)管理自動(dòng)化系列中的一篇,主要講述 UNIX/Linux 的郵件系統(tǒng)的配置,并講述了如何使用 Perl 腳本來實(shí)現(xiàn)郵件的自動(dòng)發(fā)送和接收;最后,本文把自動(dòng)發(fā)送郵件的功能與 cron 系統(tǒng)結(jié)合在一起,給出了監(jiān)控系統(tǒng) CPU 利用率的腳本實(shí)現(xiàn)。系統(tǒng)管理人員可以利用類似的功能來實(shí)現(xiàn)系統(tǒng)的自動(dòng)化管理,從而減輕自己的工作強(qiáng)度,并且提高系統(tǒng)的可維護(hù)性。 |