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