本文上篇先從單機 Mail Server 收發郵件開始談起,進而提到使用客戶端收信相關的設定與調整,以及郵件安全相關的議題。
本文中篇接著從 Mail Server 之間遞送信件開始介紹,以及 sendmail 設定、郵件 RELAY 概念等等。
本文下篇接著從圖形收發郵件軟體 evolution 開始介紹、談到該如何設定 yum 使用副廠 evolution 套件、郵件通訊協定 POP 與 IMAP 的特性差異、郵件伺服端帳號別名功能、郵件伺服器 RELAY 設定等等。
我們將會從C主機(郵件客戶端)使用 evolution 收發B主機上面的郵件,介紹測試環境如下(承接前期):
| B主機 | 172.18.0.108 | 郵件伺服端,接收寄給『郵件帳號@foo.com.tw』的信件 |
| C主機 | 172.18.0.176 | 郵件客戶端,使用 evolution 新增郵件帳號測試收發信件 |
在 RHEL5 Server 版並未內建 evolution 以及 thunderbird 這兩個圖形化郵件客戶端軟體。倘若不是很講究的話,拿現成的 CentOS 5 或 Fedora Core 6 套件補裝上去就可以開始測試了;若是比較講究的話,使用 RHEL5 Desktop 版就有內建這兩個軟體。
接著示範在 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.4/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.4/os/i386/ enabled=1 gpgcheck=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.4/os/i386/ 填寫內容即是我們剛剛查出來的資料來源。
enabled=1 改成 1 代表啟用。
gpgcheck=0 改成 0 代表不使用下一行的那個 GPG key 來檢查是否為 RHEL5 原廠套件。
改完之後使用指令「yum install -y evolution」即可將 CentOS 5 的 evolution 在 RHEL5 裝到好。

裝好 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 的信件。
再度使用新增郵件帳號精靈,來到『身份』頁面。
『全名』欄位為了要與原來的張三李四有所區隔,所以填寫「王五趙六」。
『電子郵件位址』填寫 foo2@foo.com.tw(這同時是別人回信時的收件地址)。

在接收電子郵件頁面,伺服器類型下拉選擇『IMAP』
『伺服器』欄位同樣填寫 mail.foo.com.tw
『使用者名稱』已由 evolution 程式自動填寫成 foo2

在傳送電子郵件頁面,『伺服器』欄位一樣是填寫 mail.foo.com.tw

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

由王五趙六<foo2@foo.com.tw>回信給張三李四的信件,傳送到伺服器時,伺服器發現是他的信件於是收下來並派送(Delivery)到 foo 的郵件信箱(/var/spool/mail/foo),evolution 再用 POP 方式從伺服器收回來,放到 POP 的收件匣(如下圖)。

當我們使用圖形介面採用 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 方式各新增一個 test 資料夾,另外比較特別的是在 IMAP 方式建立的一個中文的測試資料夾。

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

以上圖看來在 evolution 新增 IMAP『資料夾』在伺服器上面只是一個個的檔案,用英文取名的 test 比較不特別,用中文取名為『測試』的資料夾,在伺服器上面的檔案名稱則是被編碼成『&biyKZg-』,這是一種 unicode 實做的轉換編碼方式稱為 UTF-7。
遇到不小心將信件使用 POP 收到客戶端主機卻想要反悔,可利用 IMAP 的特性,將收下來的信件重新放回去伺服器上面,此時只要再新增一個相同的帳號來使用 IMAP 通訊方式,利用滑鼠托放(Drag-and-drop)POP 收下來的信件至 IMAP 資料匣即可。
下圖是示範將王五趙六的回信,托放到 foo2@foo.com.tw IMAP 收件匣的快照。

上述情況的另一個變通方法,是利用 POP 通訊時接收信件選項『在伺服器保留郵件備份』(需在接收前設定)。

接收信件選項另一個常用功能『自動檢查新郵件』預設是每十分鐘。
筆者曾經發生一個蠻巧合的案例,假設公司某位使用者的郵件帳號 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主機 | 172.18.0.191 | 郵件伺服端,接收寄給『郵件帳號@foo2.com.tw』信件 |
| B主機 | 172.18.0.108 | 郵件伺服端,接收寄給『郵件帳號@foo.com.tw』信件 |
| C主機 | 172.18.0.176 | 郵件客戶端,使用 evolution 新增郵件帳號測試收發信件 |
簡單說其實只有增加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 伺服器。
一切準備就緒後,在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 收到的回覆信件。
