中小企業Mail Server實戰應用與觀念剖析(下)

2009-03-27
之前上、中篇文章已經介紹過單機Mail Server收發郵件、使用客戶端收信相關的設定與調整、郵件安全相關的議題,以及Mail Server之間遞送信件、sendmail設定、郵件RELAY概念,因此本文將接續介紹最後相關的內容。
本文下篇將從圖形收發郵件軟體evolution開始介紹,進而談到如何設定yum使用副廠evolution套件、郵件通訊協定POP與IMAP的特性差異、郵件伺服端帳號別名功能,以及郵件伺服器RELAY設定等等。  

使用evolution收發信件  

首先,將從C主機(郵件客戶端)使用evolution收發B主機上面的郵件,測試環境如下(承接前期內容):  

B主機

172.18.0.108 郵件伺服端,接收寄給「郵件帳號@foo.com.tw」的信件
C主機 172.18.0.176 郵件客戶端,使用evolution新增郵件帳號測試收發信件

在RHEL5使用 圖形化郵件客戶端軟體  

RHEL5 Server版並未內建evolution和thunderbird這兩個圖形化郵件客戶端軟體。倘若不是很講究的話,拿現成的CentOS 5或Fedora Core 6套件補裝上去就可以開始測試。或者,使用RHEL5的Desktop版本也會內建這兩個軟體。其實,許多桌上型Linux Distribution都已內建這兩個軟體。  

yum Client簡易設定範例  

接著示範如何在RHEL5使用CentOS 5副廠套件來設定yum Client端。yum Server資料來源以義守大學ftp為例,藉此順便複習一下如何設定yum Client端。先用Client工具(例如firefox、lftp、gftp)找出義守大學ftp(ftp.isu.edu.tw)內CentOS yum的資料來源,資料來源可以是FTP或HTTP通訊方式。  

下圖是用指令lftp(支援Tab鍵自動補齊功能)找出資料來源為「ftp://ftp.isu.edu.tw/Linux/CentOS/5.2/os/i386/」的目錄。

找到現成的資料來源後,接著將其填寫到yum Client設定檔案內。然後,使用指令「cd /etc/yum.repos.d/」切換到設定yum資料來源的目錄。其中有一個rhel-debuginfo.repo範本檔案,用cp指令將它複製成foo.repo(檔名須為.repo結尾)。接下來,更改foo.repo內容如下:

[foo] name=foo
baseurl=ftp://ftp.isu.edu.tw/Linux/CentOS/5.2/os/i386/
enabled=1gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

其中,[ ]內的foo以及name=foo那一行=後面的foo只是一個名稱,命名為foo的目的只是為了與原來的rhel-debuginfo錯開。尤其是[ ]內的名稱foo,必須與原來的rhel-debuginfo錯開,否則可能會衍生額外的問題。

而「baseurl=ftp://ftp.isu.edu.tw/Linux/CentOS/5.2/os/i386/」填寫內容即是剛剛查出來的資料來源。至於enabled=1的1代表啟用,gpgcheck=0的0,代表不使用下一行的那個GPG key來檢查是否為RHEL5原廠套件。

修改完畢,使用指令「yum install -y evolution」即可在RHEL5內安裝好CentOS 5的evolution。此外,設定好yum套件之後,安裝thunderbird來進行測試其實也可以。

設定evolution郵件帳號(POP收信)

安裝好evolution並加以啟動之後,就是設定郵件帳號的畫面,依照精靈的指示來到「身分」頁面。其中,「全名」欄位一般都是填寫姓名,例如張三李四。「電子郵件位址」則填寫測試用的foo@foo.com.tw(這同時也是回覆的收件地址)。

緊接著進入接收電子郵件頁面,在「伺服器類型」下拉選單中選擇【POP】,然後在「伺服器」欄位中填入「mail.foo.com.tw」。至於「使用者名稱」,evolution程式已經自動填入「foo」。

在「傳送電子郵件」頁面中,「伺服器」欄位則同樣填寫「mail.foo.com.tw」,然後就完成設定了。

自己寄信給自己來做測試

接下來自己寄信給自己,寫一封信件寄到foo@foo.com.tw,以便測試是否正常。右上圖是正常收發的快照。

測試寄給這台伺服器的其他郵件帳號

以寄給foo2@foo.com.tw為例,如果伺服器尚未有這個帳號的話,則會如下圖出現「User unknown」訊息。

假如已經依照本文上集介紹的方法,在伺服器上使用指令「useradd -s /sbin/nologin foo2」建立帳號foo2的話,信件就會傳出去,依照程序派送到foo2在伺服器上的收件匣(/var/spool/mail/foo2)。

此時,先在伺服器使用指令「passwd foo2」設定foo2的密碼,例如設定密碼成「f2」,應用在接下來將介紹的使用IMAP方式來收取foo2的信件。

設定evolution郵件帳號(IMAP收信)

再度使用新增郵件帳號精靈,來到「身分」頁面。其中的「全名」欄位是為了與原來的張三李四有所區隔,所以填寫「王五趙六」。而「電子郵件位址」則填入「foo2@foo.com.tw」(這同時是別人回信時的收件地址)。

然後,在「接收電子郵件」頁面內開啟「伺服器類型」的下拉選單,選擇其中的【IMAP】選項。「伺服器」欄位內則同樣填寫為「mail.foo.com.tw」,至於「使用者名稱」,evolution程式已自動填寫成「foo2」。

隨後進入「傳送電子郵件」頁面,其中的「伺服器」欄位一樣是填寫成「mail.foo.com.tw」。

設定完成之後,開始收信就可以看到,由張三李四寄來的信件,位於使用IMAP的foo2@foo.com.tw帳號收信匣之中,如下圖所示。

由王五趙六回信給張三李四的信件,傳送到伺服器時,伺服器發現是它的信件,於是收下來並派送(Delivery)到foo的郵件信箱(位於「/var/spool/mail/foo」),evolution再用POP方式從伺服器收回來,放到POP的收件匣,見下圖。

POP與IMAP的特性差異(一)

當我們使用圖形介面以POP方式收信時,預設會將伺服器上的信件,一次全部收到客戶端主機,並且清空伺服器上已收走的信件。

而使用IMAP方式登入收信,會先讀取伺服器上信件的列表以及其基礎訊息,例如寄件者、收件者、主旨、日期、已讀未讀等等,直到點選某封信件時,才將伺服器上信件內文傳輸到客戶端主機以供讀取。

觀察伺服器上foo與foo2的收信匣(位於「/var/spool/mail/」目錄下)後,發現使用POP的foo會把信件收走;使用IMAP的foo2則會把信件「留在」伺服器上。

下圖是在伺服器上分別使用指令「mail -f /var/spool/mail/foo」、「mail -f /var/spool/mail/foo2」讀取信件的快照。

POP與IMAP的特性差異(二)

通常會新增幾個資料夾來做郵件分類與歸檔,或是作為郵件過濾時的目標資料夾,這都是相當方便的應用。

使用POP方式新增的資料夾是位於客戶端主機內,而使用IMAP方式新增的資料夾則位在伺服器上。

左下圖分別以POP和IMAP的方式各新增一個「test」資料夾,另外比較特別的是,以IMAP方式建立一個中文的測試資料夾。

在伺服器列出IMAP使用者foo2的家目錄,以dovecot(IMAP伺服器)來說,會產生一個「mail/」目錄,列出「mail/」目錄內容,就會看到剛剛新增的test IMAP資料夾以及中文的IMAP測試目錄了。

以上圖來看,evolution在伺服器上新增IMAP「資料夾」,只是一個個的檔案,用英文取名的「test」比較不特別,用中文取名為「測試」的資料夾,在伺服器上面的檔案名稱則是被編碼成「&biyKZg-」,這是一種unicode實作的轉換編碼方式,稱為UTF-7。

利用IMAP把信件放回伺服器

如果若不小心使用POP將信件收到客戶端主機,卻又想反悔,則可利用IMAP的特性,將收下來的信件重新放回去伺服器上,此時只要再新增一個相同的帳號來使用IMAP通訊方式,利用滑鼠拖放(Drag-and-drop)POP收下來的信件至IMAP資料匣即可。

而下頁圖示是將王五趙六的回信,拖放到foo2@foo.com.tw IMAP收件匣的快照。

上述情況的另一個變通方法,是利用POP通訊時〔接收選項〕活頁標籤內的「在伺服器保留郵件備份」選項,但必須在接收前就先設定好。至於,〔接收選項〕活頁標籤內的另一個常用功能「自動檢查新郵件」,其預設是每10分鐘檢查一次。

郵件伺服端帳號別名功能

筆者曾經發生一個蠻巧合的案例,假設公司某位使用者的郵件帳號amanda@foo.com.tw依照正常程序在伺服器上建立帳號、設定密碼,並在evolution測試收發信,信是送了出去卻遲遲沒有信件收進來。

此時,會去調閱郵件紀錄檔內容,寄給amanda的信件似乎是轉給root帳號。下圖是用指令「tail /var/log/maillog」觀察郵件紀錄檔的快照。

伺服器上root帳號的確有收到寄給amanda的信件,如下圖所示。

會發生這樣的情況,主要就是郵件別名功能所造成的,若觀察其設定檔案「/etc/aliases」,裡頭就有一筆「amanda: root」,這就是為何寄給amanda會轉給root的原因,這個檔案位於「/etc/aliases」(請注意不是在「/etc/mail/」目錄下)。為了追求郵遞效率,真正有效的是二進位DB檔案「/etc/aliases.db」,若異動「/etc/aliases」時,記得要使用指令「newaliases」更新成「/etc/aliases.db」,才會生效。

下圖示範編輯「/etc/aliases」用#字號註解amanda那一行,並新增一行「service: foo」,使得寄給amanda正常且寄給service帳號的信件轉給foo,修改完畢,記得使用指令「newaliases」使其生效。

下圖是用evolution來測試剛剛修改的設定,其中amanda終於有信件進來了,foo收到寄給service@foo.com.tw的信件(位於「我的電腦」樹狀目錄下收件匣的新信件)。

發送給其他主機的信件

先前的測試都是發送信件給這台伺服器收取,接著要測試的是發送信件到這台伺服器後,不讓這台伺服器將信件留下來(因為這些信件的目標主機不是它),而是希望這台伺服器再轉遞給別台伺服器收信,也就是本文中集提到的郵件RELAY觀念。

準備測試環境

描述測試環境如下:

簡單來說,其實只有增加A主機而已,B主機與C主機都與原來的測試環境一樣。A主機在本文中集也已出現過,原本是用來測試指令寄信給B主機,在這裡記得讓A主機模仿B主機,也成為一台郵件伺服器,不同的是,A主機接收寄給「郵件帳號@foo2.com.tw」信件而已。

有關DNS環境也是要仿造一個與B主機類似的查詢結果,要能夠查詢出foo2.com.tw的MX紀錄以及相關A紀錄指向A主機IP「172.18.0.191」。例如,在DNS伺服器設定檔案「/etc/named.conf」內新增管理一個foo2.com.tw的zone,並依照設定檔案的指示輸入相關SOA、NS、MX紀錄以及A紀錄(假設紀錄檔案位於「/var/named/foo2.com.tw.db」)。

筆者的測試環境為求簡單,A、B、C三台主機都詢問同一台DNS伺服器。

關於Relaying denied

一切準備就緒之後,在C主機使用evolution寄信給foo@foo2.com.tw時,會先丟給B主機(因為已在evolution設定傳送郵件主機是mail.foo.com.tw),然後B主機發現不是給它的信件(是寄給foo@foo2.com.tw),所以先查看來源主機(C主機)是否在允許RELAY的列表中,預設是不被允許,所以出現如下圖的警告訊息。

RELAY的設定檔案位於「/etc/mail/access」(實際運作的是DB檔「/etc/mail/access.db」),為了要允許來自於C主機的轉遞信件,所以編輯B主機的「/etc/mail/access」,仿造其原有格式新增一行「Connect:172.18.0.176 RELAY」(172.18.0.176是C主機IP),修改好了之後,記得重新啟動sendmail使其生效。

如果設定是要允許一整個網段(例如172.18.0.0/255.255.0.0)客戶端主機RELAY,則必須輸入像「Connect:172.18 RELAY」的格式。請注意,172.18沒有. 結尾。

如果還有其他意外

通過了RELAY這個關卡後,接著B主機會查詢foo2.com.tw的MX紀錄,MX紀錄優先找數字最小⋯⋯,讀者是否覺得內容有似曾相似的感覺?從這裡開始,就是本文中集的內容了,只是錯誤訊息由原本的文字模式來到evolution圖形模式而已,例如下圖是DNS還沒處理好,所出現的「(reason: 550 Host unknown)」快照。

DNS處理好之後卻可能因為A主機的防火牆擋住,導致信件Queue在B主機,處理方式請參考本文中集。

當A主機的防火牆處理好之後,訊息變成「Connection refused」,可能又是什麼原因所造成的呢?還記得嗎?

有些內容在上集、中集都已經介紹過,所以若有狀況的話,就請參考前兩篇文章,最完整的測試就是互相寄信、回信都應該收得到才是,下圖是amanda@foo.com.tw寄給foo@foo2.com.tw收到的回覆信件。


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!