出处:http://www.netadmin.com.tw/article_content.aspx?sn=1302050001 作者:吳惠麟 时间:2013-5-19 17:53:18
要傳遞一封電子郵件是需要許多的關卡配合才能成功,所以問題不一定是出現在自己所掌管的郵件伺服器上。雖然市場上有一些標榜郵件稽核的產品可幫助使用者挖掘相關資訊,但問題是這種產品所費不貲,不是一般中小企業能夠負擔得起。因此,本文將以Postfix郵件伺服器為例,利用Logfmon實作出一個可立即將發送電子郵件的狀態置入資料庫,讓相關管理人員能夠即時掌握電子郵件發送狀態的解決方案。
負責管理電子郵件系統的網管人員相信都曾被問過這樣的一個問題:「為什麼我寄出去的電子郵件對方都說沒有收到?」,這時,一個有經驗的網管人員就必須發揮溝通的技巧,說明電子郵件的傳遞流程以及相關的背景知識。
如此大費周章的解說,只是為了解釋要傳遞一封電子郵件是需要許多的關卡配合才能成功,所以問題不一定是出現在自己所掌管的郵件伺服器上。
大部分明理的使用者通常都能夠接受這樣子的解釋說明(當然接受的程度是依照該網管人員在公司同仁心目中的專業程度而定),但是往往會再補上一句話:「那有沒有相關的電子郵件Log記錄來佐證我們的郵件伺服器沒有問題?」
聽到這句話,大多數的網管人員恐怕都會感到為難,因為電子郵件的Log記錄多如牛毛,就算已儲存相關的記錄,要從裡面挖掘出有用的資訊也很費功夫。
雖然市場上有一些標榜郵件稽核的產品可幫助使用者挖掘相關資訊,但問題是這種產品所費不貲,不是一般中小企業能夠負擔得起。
而且,既然決定使用Postfix(一個有名的開源碼電子郵件伺服器)來當成郵件伺服器,就是因為看上開源碼免費的特性。在此前提下,當然也就不會去購買這種昂貴的郵件稽核產品。
不過,相同的問題曾被多次的詢問,就代表這個問題有解決的必要,因此在本文中,筆者將以Postfix郵件伺服器為例,實作一個可即時將發送電子郵件的狀態置入資料庫,以便相關管理人員能夠即時掌握電子郵件發送狀態的解決方案,此解決方案主要的功能如下:
1. 在電子郵件伺服器發送電子郵件後,可即時記錄「收件者資訊」與「寄件者資訊」。
2. 在電子郵件伺服器發送電子郵件後,可即時記錄該封電子郵件的發送狀態,可分為如下的四種狀態:
- sent:電子郵件已成功地發送出去
- deferred:電子郵件因某種原因被延遲發送出去
- bounced:該電子郵件已被退信
- expired:該電子郵件已逾時
本解決方案所使用的軟體套件如表1所示:
表1 解決方案所需系統及套件
系統架構說明
如圖1所示,本解決方案主要的思惟流程如下所述:
- 1.當使用者利用Postfix郵件伺服器寄發電子郵件時,即會在系統的maillog檔案內產生一筆相關的電子郵件Log。
- 2.利用Logfmon軟體監控maillog檔案,一旦發現maillog發生變化,即比對所設定的樣式,如果樣式符合,即執行mailstatus.pl程式,來解析相關Log資訊。
- 3.mailstatus.pl程式將解析相關樣式,並將收件者、寄件者及寄發電子郵件狀態等資訊儲存至資料庫之中。
|
▲圖1 解決方案主要流程。 |
什麼是Logfmon
本解決方案是利用監控maillog檔案的方式來即時擷取相關的Log資訊儲存到資料庫,以達到管理郵件伺服器電子郵件發送狀態的目的。
因此,首先需要一個可即時監控檔案變動情形的解決方案。在Windows系統中最有名的相關軟體是Filemon,而在Linux系統下可利用Logfmon來即時監控系統檔案變動情況。
Logfmon主要利用正規表示法(Regular Expression,RE)來設定比對的規則樣式,當所監控的檔案內容發生變動,即將所變動的內容與此規則樣式進行比對。 如果比對成功,亦即檔案變動的內容樣式符合使用者所自定義的樣式規則,即執行使用者自定義的指令或程式,相關比對流程如圖2示。
|
▲圖2 Logfmon比對運作流程。 |
由於Logfmon使用正規表示法來設定比對的條件式,因此接著簡單介紹正規表示法。由於本方案僅需使用模式比對的功能即可達成要求,所以這裡僅介紹模式比對,其餘更進階的用法就留待讀者自行研究。 正規表示法(Regular Expression)是一種威力強大的語法,可利用一些含有特殊符號的字串,來描述符合某種句型的句子。表2即說明了正規表示法所使用的特殊符號及模式比對。 表2 正規表示法所使用的特殊符號及模式比對
在說明相關的正規表示法的用法後,下一步即是安裝Logfmon程式。先至網頁「http://sourceforge.net/projects/logfmon/」取得最新版本(本解決方案中所使用的版本為1.1版)。解壓縮後,即可直接使用make進行編譯。 在編譯的過程中,筆者曾發生找不到y.tab.h的錯誤訊息而無法編譯成功。如果讀者也有發生這個問題,可先執行指令「make y.tab.c y.tab.h」產生y.tab.h,然後再重新使用「make && make install」來編譯Logfmon並進行安裝。 完裝完成後,就必須設定相關的設定檔(/etc/logfmon.conf),如下頁表3說明logfmon.conf所提供的參數及相關的意義。 表3 logfmon.conf的參數及使用說明
在了解Logfmon的相關用法後,下一步是取出Postfix在處理電子郵件時,會在「/var/log/maillog」產生相關記錄的正規表示法樣式,以便於採用Logfmon設定樣式比對時使用。 筆者使用的郵件伺服器為Postfix軟體,Postfix郵件伺服器會將相關的電子郵件記錄,儲存在「/var/log/maillog」檔案內,其他的郵件伺服器系統可能會稍微有些不同,這點要請讀者自行確認相關位置。 在這裡,Logfmon的角色是將Postfix所產生的記錄交由mailstatus.pl程式解析並儲存至資料庫內。因此,在「/etc/logfomon」內可設定如下的參數(其中#為註解):
設定成功後,以下先簡單說明Postfix在處理電子郵件後會在「/var/log/maillog」檔案產生的Log。 如圖3所示,即為成功發送一封電子郵件的相關Log記錄。通常一封電子郵件會有多筆的Log記錄,在此僅擷取一筆來當例子。
|
▲圖3 成功發送一封電子郵件的Log記錄。 |
在圖3中有一個欄位為Mail ID,每一封的電子郵件都會有一個唯一的Mail ID,讀者可以利用這個資訊來取得同一封電子郵件,以及其他相關的Log記錄。
根據上述的格式,可以定義出如表4的正規表示法樣式。
表4 正規表示法樣式
上述的四種郵件狀態,是筆者根據實際運作郵件伺服器時所產生的Log資訊,以及解析Postfix原始碼而得到的狀態。或許,可能還有其他的狀態,請讀者自行研究。在本解決方案中,將只記錄此四種狀態。
系統實作
這裡不多談資料庫的安裝,假設讀者均已安裝成功資料庫。先建立一個資料庫,此資料庫名稱為logdb。而後再建立一個資料庫表格,名稱為mailstatus,架構如下(其中#為註解):
負責解析電子郵件記錄並儲存至資料庫的mailstatus.pl,該程式內容如下:
將mailstatus.pl置於「/usr/bin/」目錄內。最後,可利用「logfmon -f /etc/logfmon.conf」指令來執行Logfmon。
如果一切正常,此時相關的資訊將會匯入資料庫,如圖4所示。
|
圖4 相關的資訊已匯入資料庫內。 |
至此,自製的郵件發送狀態記錄系統即告完成。