簡易 Mail Server 架設 -- Sendmail 設定
本文已不再維護,更新文章請參考此處
最近更新日期:2003/09/12
 
在這個郵件伺服器的架設中,我們首先談論 Mail 與 DNS 的重要相關性,然後依序介紹 Mail Server 的相關名詞,以及 Mail Server 的運作基本流程與協定,也會談到相關的 Relay 與 郵件認證機制 等項目,這些項目對於未來郵件主機的管理與設定是重要的,請不要忽略了這方面問題的討論喔。當然,主要的目的還是在於架設 Sendmail 這個使用最為廣泛的郵件主機伺服器軟體囉!這裡我們以 Red Hat 7.x 以及 Red Hat 9 為主體來說明 Sendmail 的主要架構,要說明的是,雖然本文是以 Red Hat 為主體,但是 Sendmail 的架構仍然可以在其他使用 Sendmail 的 Linux 系統當中成立的。而重頭戲則在最後面的 Tarball 安裝一套完整的 Sendmail 喔 ( 我是以 Mandrake 9.0 及 Red Hat 7.x 版本來測試的 )!如果您的 Linux 上面本來就沒有 Sendmail ,並且您還是習慣 Sendmail 這個套件,那麼,這篇文章仍然相當的適合您查閱!
 
前言
郵件伺服器運作原理
  1. Mail 與 DNS 系統的相關性
  2. 郵件的傳送流程、MUA、MTA、MDA
  3. 使用的協定
  4. 什麼是 Relay 與認證機制
套件安裝
  1. 使用 RPM 安裝 Sendmail
  2. 使用 RPM 安裝 IMAP 套件
主機的設定
  1. Sendmail Server 的檔案架構與基礎說明
  2. 使用 m4 來簡易設定 sendmail
  3. 啟動 Mail Server
  4. 設定主機名稱 local-host-names
  5. 設定郵件伺服器使用權限 /etc/mail/access
  6. 重要觀念:一封信件的收受流程
  7. 設定使用者別名 /etc/aliases
  8. 設定郵件轉遞 ~/.forward
  9. 察看信件佇列 ( mailq ) 與 mailers 狀態
用戶端的使用說明
  1. Linux 下使用 mail 功能 ( IP寄信, 夾帶檔案 )
  2. Linux 下使用 telnet 功能
  3. X-Window 與 Windows 的 MUA 功能
關於郵件主機安全的設定
  0. sendmail 本身的安全設定項目( Sendmail 本身的建議 )
  1. SMTP 認證
  2. 關於 ORDB 抵擋 open relay 郵件主機之機制說明與實作
  3. Procmail 相關說明
以 Tarball 完整安裝 Sendmail (含 SMTP 郵件認證、procmail 與 ORGB 的完全安裝! )
其他應用說明
  0. 無法寄信時的可能問題說明與解決之道
  1. 關於備份
  2. 關於 quota 的設定與 /var/spool/mail 目錄的轉移
本章與 LPI 的關係
參考資源
本章習題練習

前言:
電子郵件帶來的好處:
在目前的社會當中,沒有電子郵件 ( e-mail ) 似乎是蠻奇怪的一件事!。可以說,現在 e-mail 已經成為一個很普遍的人與人之間的溝通管道了,電子郵件可以很快速的幫你將文件或訊息傳送到地球上的任何一個有網路存在的角落,當然,你也可以在任何有網路的地方,連上 Internet 去收取你的信件!很快樂不是嗎?是的!e-mail 的存在是相當重要的,你可以藉由這個電子郵件取得最即時的一手資料!你也可以利用他幫你聯絡好朋友,還可以用來把馬子哩!君不見前一陣子相當有名的『電子情書, You got a mail』這部電影嗎?呵呵!反正,電子郵件真的帶給目前繁忙的人們一個相當輕鬆獲得資訊的方式!
電子郵件衍生的問題:
不過,遺憾的是,只要是有人類的地方,就會有很多你意想不到的事情會出現了,當然,e-mail 也不例外,怎麼說呢? 我們來慢慢的分析一下吧:
  1. 電子郵件夾帶病毒:你可以常常聽到電子郵件所夾帶的病毒對吧!沒錯,利用電子郵件以及人們對於電子郵件的漫不經心的態度,使得以電子郵件為媒介的電腦病毒更容易『深入人群』當中吶!這個問題造成大大小小的傷害,如果發生在大企業當中,那可真是受不了那∼那個主管受的了一天到晚電腦重新安裝的∼而且萬一中毒的是大型主機,光是資料的損毀就可能讓公司倒閉了....
  2. 怪客入侵事件:沒錯! e-mail 也是一個相當不安全的網路協定,你可以輕易的使用怪客軟體 ( Cracker ) 就可以取得使用者在利用 e-mail 傳送過程當中的,將他的帳號與密碼擷取下來,分析之後,並進一步的破解對方的郵件主機∼哇!真是亂可怕一把的!
  3. 廣告與垃圾信件:這個可說是目前各大 ISP 心中永遠的痛∼這些垃圾信件可以佔掉很多那少的可憐的頻寬,使得正常使用者連線速度與品質下降,更可能造成網路的停頓∼當然,常常收到垃圾信件的你,大概也不好過吧!
  4. 暴力攻擊事件:萬一你沒有將郵件主機設定好,嘿嘿!送信者可以藉由你主機收信的功能,發送大量的信件,讓你『一次收個夠!』灌爆你的主機硬碟,想要不當機都粉難∼
  5. 真實社會的討厭事情:『黑函』!聽到會不會很害怕?當然很害怕啦!偏偏,使用 e-mail 就可以作很多的壞事∼這真是太不道德了∼
  6. 不實的信件內容:只要注意到消基會的訊息就可以知道啦,不明來源的電子郵件說的內容,嘿嘿!不要輕易的相信,因為,很多可是以訛傳訛,結果,大家都被耍了的∼例如,你的朋友收到一封信,認為『哇!這是大事情』,所以在沒有求證的情況下,將信『轉寄』給你看,嘿!你的朋友寄給你的,當然要相信他啦!立刻再轉寄,如此一再地循環,嘿嘿!這個錯誤內容的訊息馬上就讓大家知道,更可怕的是『還會讓大家接受∼』所以,看到任何訊息時,請千萬要記得求證一下吶!
可怕吧!電子郵件會衍生出這麼多的問題說∼
網管人員的痛
因為 e-mail 的便利性,與郵件主機的容易受到惡意的攻擊,這兩個事件真的是很難分的清,怎麼說呢?如果為了使用者的便利性而大開便利之門,那麼,您的郵件主機大概用不了多久,就會被列入黑名單之中,進而成為大家的拒絕往來戶,呵呵!反而成為笑柄,並且反而造成了使用者的不便∼而如果管制得太嚴格,又顯的不夠人性化∼最起碼,你的主管就會不太滿意∼怎麼辦呢?!哈哈!沒錯啦!郵件主機就是這麼回事∼讓人又愛又怕的一個玩意兒,搞的定他,恭喜你,一切圓滿順利,搞不定他,主機被當成垃圾信件轉運站事小,丟掉工作可就『茲事體大』啦∼就因為他是這麼重要,但是又這麼難以搞定,所以啦,我們可要好好的學一學他吶!

郵件伺服器運作原理
既然要使用 e-mail ,當然就需要郵件主機伺服器囉 ( Mail Server )!不然你的信要怎樣寄出去呢?事實上,mail server 的原理說難不難,但是說簡單嗎∼似乎又有點難以理解ㄋㄟ∼,所以,底下我們要來談一談他的原理部分,然後再針對主機的設定來進行說明咯!底下,我們首先要講的,就是『Mail server 系統與 DNS 系統有什麼關連性?』這個部分新手最容易被搞混哩,是否要架設 mail server 就『宿命』的一定得架設 DNS 主機在你的主機上面嗎

Mail 與 DNS 系統的相關性:
一直以來,Mail server 與 DNS 系統就是分不開的,怎麼說呢?今天如果你要寄電子郵件的話,那麼就得藉由郵件主機幫你將信件送出去,對吧!那麼我們在 DNS 那個篇幅裡面也談到了相當多的概念了,就是,人腦實在無法記憶住電腦網路的 IP 資料,因此,才會有所謂的 Domain Name System, DNS 主機,這個 DNS 主要的功能之一,就是將主機名稱轉譯成為 IP ,我想,這裡您應該也已經瞭解了,對吧!如果是『不瞭解』,那麼不要往下看了,請前往 簡易 DNS 伺服器 去瞧一瞧,瞧完了再回來繼續吧!OK!好了,既然如此的話,那麼使用郵件主機來寄信,並且不想要背主機所在的 IP ,那蛣M就一定需要讓你的主機名稱可以經由 DNS 系統來找到你的 IP 囉!對吧!沒錯,如果你真的要提供一個 Internet 上面的郵件主機,最好還是註冊一個合法的主機名稱,比較好記憶ㄋㄟ∼
好了,接下來要討論的就是,既然我的主機需要 DNS 來轉譯主機名稱使成為 IP ,那麼我真的就得必須要架設 DNS 嗎?當然不是!要注意的是,我們剛剛提到的是『我就得在 Internet 上面註冊一個合法的主機名稱來對應 IP 』而不是『一定得要架設 DNS 在我的主機上面!』這個很重要,因為有太多的新手被 mail server 與 DNS server 的關係搞錯亂了!如果到這裡又混亂了!那麼請,真的,一定,回到 DNS 伺服器那篇去慢慢的再從頭讀一次,否則.....也就是說,我們需要的是『合法註冊過的主機名稱』就是了!所以,你可以使用動態 IP 去申請一個動態 IP 的領域名稱,也可以使用各大 ISP 提供的各項功能來註冊,反正只要能夠註冊一個領域名稱就是了!當然,你也可以自行去註冊一個 DNS 主機,並且在你的主機上面建立 DNS 系統,但這並非是必要的!
那麼,假設我的主機名稱對應 IP 已經成功的在 Internet 上面完成合法註冊了,這樣就好了嗎?是這樣沒錯啦!確實,只要有主機名稱對應到 IP ,亦即是有 A ( Address ) 這個 DNS 的標誌後,那麼就可以架設 mail server 了,並且,一般來說,應該不會有問題的!然而, DNS 系統本身還有其他的功能可以支援 mail server ,使 mail server 更穩定與具有更佳的避免信件遺失功能,所以,就有 MX 這個 DNS 的標誌產生啦!MX 這個 DNS 設定中的標誌,主要就是要給 mail server 用的,基本上, MX 就是 Mail eXchanger 的縮寫,他可以讓 Internet 上面的信件馬上找尋到 Mail 主機的位置,此外,由於 MX 後面可以接數字,因次,一個 domain 或者是一部主機,可以有多個 MX 標誌,這有什麼好處呢?主要的好處就是可以讓,當主要的 mail server 掛點時,由於有 mx 標號,因此,信件不會直接退回,而是跑到下一個 MX 設定的主機去,並且暫存在該處,等到主要的 mail server 起來之後,這個 MX 設定的主機就會將信件給他傳送到目的地!如此一來,甚至可以達到異地備援的功效呢!不只如此喔!MX 的功效還很多!最大的優點就是有點類似 router 的功能,我們或許可以稱之為 郵件路由 吧!當有了 MX 標誌之後,由於這是 DNS 的設定,所以當你要傳送 mail 的時候,那麼就可以直接依據 DNS 的 MX 標誌直接將信件傳送到該設定的 mx 郵件主機,而不需要去尋問到底郵件要寄到哪裡去!這功能相當的不錯的!因為可以讓你的郵件很快的而且正確的送達到目的地呢!此外,由於可以設定多個 mx ,因此,假設『此路不通』,也就是先使用的 mx 郵件主機不通的時候,那麼信件就會往下一個 mx 郵件主機傳送!這樣可以避免信件被退信的機會!當然就更加的穩定囉!不過,這裡也要特別強調, MX 『一定』要設定正確,否則,呵呵!反而會讓你的信件永遠在 Internet 上面流浪呢
一般來說,郵件位址的寫法為: account@server.name 的寫法,在小老鼠 ( @ ) 前面的指的是『帳號』,至於 @ 後面的則是主機的名稱!當你寄出這樣的一封信時,首先,你的郵件主機會先去 DNS 系統尋找 server.name 這個主機名稱對應的 IP 與 MX 標誌,若有 mx 標誌,那麼這封 e-mail 將會把信先送到該 mx 主機,然後再由該 mx 主機將信件送達目的地 ( 就是 server.name 這個主機啦 ) ,而如果有多個 mx 標誌時,那麼這封 e-mail 會送到最優先的 mx 主機去(也有可能這部主機就是目的地主機喔!),然後交給該主機來處理囉!而如果沒有 mx 標誌的話,那麼在查得 IP 之後,信件才會慢慢的送達該郵件主機囉!在送達到郵件主機後,該主機則以前面的『帳號』將信件發送到各個使用者的郵件目錄下!所以囉,為什麼說 mail 與 DNS 系統相關性很高呢?嘿嘿!由上面的說明您應該就不難瞭解啦! ^_^

郵件的傳送流程、MUA、MTA、MDA
約略瞭解了 DNS 與 mail server 之間的關係之後,在接下來我們要瞭解的是,那麼 mail 到底是如何傳送到目的郵件主機的呢?底下我們分成『寄信』與『收信』兩個主要的郵件主機使用方式來加以介紹囉!先說明一下關於『寄信』的部分好了,通常我們都是使用桌上型電腦來寄信的,舉個例子來說好了,如果你以 Netscape 或者 Kmail 或者 OutLook Express 來寄信的時候,那麼那封信到底是怎麼送出去的呢?可以參考一下底下的圖示來說明:
 

圖一、電子郵件以郵件主機寄送信件示意圖
 
先來說明一下什麼是 MUA, MTA 與 MDA 什麼的,再來說信件怎麼傳送的好了! 好了,瞭解了 MUA, MTA 與 MDA 之後,再來說到那麼如何將信寄出去呢?可以分為底下幾個步驟:
  1. Step 1 使用者利用 MUA 寄信到 MTA 上面:通常我們使用 MUA ( 例如 Outlook express ) 寫信的時候,你總是要定義出幾個咚咚:
  2. 好了,你在圖一左上角的那部機器上面,也就是『本地端用戶使用電腦』利用 MUA 的功能 ( 例如 Outlook express 好了 ) 寫好了信之後,按下 MUA 的那個『傳送』的按鍵,MUA 就會依據你所定義的主機位址將信發送到 MTA 上面;
     
  3. Step 2 MTA 收到自己的信件,交由 MDA 發送到該帳號的 MailBox 當中:如果在 Step 1 所收到的信件中,那個 e-mail.server 就是 MTA 自己,此時 MTA 會將該信件交由 MDA 去處理,將信件放置在收進者的信箱中;

  4.  
  5. Step 3 MTA 將信再轉送出去:如果由 Step 1 來的信件的收件人並不是 MTA 的內部帳號,那麼該封信將會被再轉送出去!由 Step 1 及 Step 3 的動作,我們也稱為 Relay (郵件轉遞) 的功能喔!

  6.  
  7. Step 4 遠端 MTA 收受本地的 MTA 所發出的郵件:遠端的 MTA 會收受我們這部 MTA 的信件,並將該信件交給他的 MDA 來處理 ( Step 5 ) ,此時,信件會存放在遠端的 MTA 上面,等待使用者登錄讀取或者下載回去!
整個流程大致上就是這樣。這個時候,你由左上角的 MUA 將信件寄出之後,最後信件將會存放在右邊那部 MTA 主機裡面喔還沒有到達你的朋友的電腦 ( 就是右邊的 MUA 那部電腦 ) !這個時候,就要繼續談到收信的動作了!收信的動作有點像這樣:
 

圖二、用戶端收受郵件主機的電子郵件示意圖
 
遠端用戶使用的電腦直接連接到他的 MTA ,跟 MTA 要求察看自己的 mailbox 是否有信件,而 MTA 透過 MDA 去檢查之後,如果有信件的話,就會將他傳送回使用者的 MUA 中!同時,根據 MUA 的不同設定, MTA 會選擇將該 mailbox 清除掉,或者繼續保留!若繼續保留的話,那麼下次使用者再次的接收信件時,保留的信件會再次的被下載,因此,通常使用者 MUA 都是預設刪除掉 MTA 上面的 Mailbox 內容的!接下來我們得談一談,那麼寄信與收信使用的是什麼協定呢?

使用的協定
總是得瞭解一下使用的協定吶!我們在寄信的時候,亦即由 MUA 將信件發送到 MTA 的過程中,以及 MTA 將信轉遞到下一個 MTA 的功能,目前絕大部分的郵件主機都是使用 SMTP ( Simple Mail Transfer Protocol ) 這個協定,port number 為 25 啦!在寄信的時候,你的 MUA 會主動的連接 MTA 的 port 25 ,然後將信經由 MTA 的 smtp 協定 ( port 25 ) 而送出去!而郵件主機 MTA 在轉遞的時候,也是經由下一部 MTA 的 port 25 來將信送出去的!所以囉,不論你是使用什麼 MUA 或 MTA 郵件架設軟體,只要大家都支援 smtp ,那麼信件就可以順利的流傳囉!
收信呢?收信則是 MUA 經由 POP ( Post Office Protocol ) 協定來連接到 MTA 的使用者 Mailbox,以讀取或者下載使用者在 Mailbox 當中的信件。,目前常用的 POP 協定為 POP3 ( Post Office Protocol version 3 ),這個協定產生的 port number 為 110 ,所以,你的 MUA 經由 MTA 的 port 110 將信件由 MTA 的 mailbox 當中將信件收到本地端的 MUA 上面供你瀏覽!同樣的,只要 MTA 與 MUA 同時支援 POP3 這個協定,那麼信件就可以自由的收受了!此外,目前也很流行使用 IMAP 這個協定來收受信件。在 pop3 的收信協定中,一般來說,當 client 端收完了主機端的信件之後,則該信件會主動的被主機端所刪除!不過, IMAP 則可以避免這個問題! IMAP 具有讓使用者 ( client 用戶端 ) 自行定義信件放置的目錄功能,以及是否要儲存下載的信件之後,原信件是否保留在主機上面的功能!目前我們常見的 Web 介面的電子郵件使用,大部分就是以 imap 來達成的!
所以我們知道了!通常一部提供收發信件的 MTA ( 不考慮 Web 介面的郵件主機 ) 至少需要兩個協定,分別是 SMTP 與 POP3 !而且,只要你的 MUA 與 MTA 同時均支援 SMTP 與 POP3 ,那麼彼此就可以溝通囉!這也是為什麼你使用 Outlook express 寄出的信,但是你的朋友可以使用 Netscape 收下來的原因!總之,就是『網路協定』的溝通啦!
 

什麼是 Relay 與認證機制
圖一的寄信流程圖裡面的第三步驟 ( step 3 ) 中,我們知道, MTA 在分析收到的郵件之後,如果收件者不是本身主機的帳號,則會將該信件再傳送到下一個 MTA 上面,這個由 MTA 幫忙轉信的功能就稱為 Relay 啦。那麼在這個功能當中,您有沒有發現一件奇怪的事情啊!那就是:『是否任何人都可以使用我的 MTA 郵件主機伺服器來傳送他的郵件呢?』這個問題涉及到 Mail Server 的設定技巧了!如果設定不良的話,例如早期的 Sendmail 版本中,他就沒有針對使用者來進行管制,也就是說,任何人都可以使用這樣的一部郵件主機來達到信件傳送的目的!這種主機我們稱為『Open Relay』的電子郵件主機喔!這裡請仔細的思考一下,如果我的 MTA 對於寄信的人沒有一個限制的話,結果會如何呢?呵呵!沒有錯,結果就是任何人都可以使用你的 MTA 來發信了!那有什麼好可怕的?我們在前言的地方就已經稍微說過了,那個所謂的『廣告信、垃圾信件』的問題,而如果你的 MTA 沒有對寄信的人作限制的話,由於任何人都可以使用你的 MTA 來發信,你的 MTA 將會變的『很笨重!』什麼意思?那就是,你的 MTA 將會幫任何人寄信,如此一來,你的『網路頻寬將會被廣告信件所用光!』結果將導致你的 MTA 變成『Open Relay 主機黑名單的一份子∼』!!!
 
為了避免這個問題,所以,目前所有新版的郵件主機伺服器架設軟體 ( Mail server packages ) 預設的情況之下,都不會對外完全的開放 Relay 的功能的!預設通常僅『針對主機 ( localhost ) 開放 Relay 的功能』,不過,這樣的 MTA 是可以收受來自 Internet 上面的,註明收件者是我們 MTA 主機內部帳號的信件的,因此, MTA 在『收信』上面是沒有問題的!
 
但是關閉了 Relay 之後,雖然可以避免掉我們 MTA 主機被當成廣告信發送站,不過如此一來又造成了一些困擾!何解?因為通常我們僅針對主機,或者一些規範的 IP 或者是網段等信任的主機來開放他們的 Relay 的功能,所以在這個設定的範圍內的 Client 端電腦可以自由的收發信件,至於沒有規範到的 IP 來源的寄信信件,將完全的擋掉。然而萬一您使用的是 ADSL 計時制的呢?又或者您是常常在外面出差的大老闆,則你的 IP 將『不會固定』,完蛋啦∼怎麼辦?既不能完全開放 Relay ,又沒有固定 IP ,無解了嗎?呵呵!還好,有所謂的 郵件認證機制 來幫我們解決這個困境啦!
 
所謂的『郵件認證機制』就是在剛剛我們圖一的寄信流程圖中,在 MTA 當中加入需要檢查發信者的『帳號與密碼』比對的功能,當 MTA 接到來自 Client 端的傳信需求時,會檢查來自 Client 端的認證比對(帳號密碼),如果帳號與密碼比對正確,則開始接受信件並幫忙轉信,如果比對不正確則將該 MTA 並不會接受該封信件,直接在 Client 端顯示『不接受您的信件』之類的訊息喔!目前有相當多種的郵件認證機制,這裡我們偏向於介紹目前廣為使用的 SMTP 郵件認證這個機制。
 
所謂的 SMTP 郵件認證機制,顧名思義,就是在 smtp 這個協定上面動手腳的一個機制囉!亦即是在寄信的時候,(由 MUA 到 MTA 那個 step 1 的步驟中 ),我們的 MTA 主機『一定要求檢驗 MUA 發信者的帳號與密碼!』這樣的功能!果真能做到這一點的話,那麼你的 MTA 就可以在經過認證之後,提供認證者的 Relay 功能,而不需要針對某些信任網域或 IP 來分別設定開放 Relay 的功能啦!因為經由『認證』的機制,你的 MTA 會去分析寄信者的相關資訊,通過後才會接受信件並幫他們寄信,否則就不接受信件!呵呵!沒錯!就是這樣!透過這樣的機制,您將不需要規範 Relay 的 IP 或網段,直接交給 SMTP 郵件認證來幫你管理你寄件者的 Relay 功能,從此以後,你的 Clients 就不會常常向你抱怨說 MTA 不穩定囉!
 
我們底下將介紹使用 cyrus-sasl 這種密碼驗證的認證機制囉!好了!底下我們將要介紹一下目前郵件伺服器佔有率上面應該依然是第一的 sendmail 這個 mail server 的架設!

套件安裝:
使用 RPM 來安裝 Sendmail 實在是『快樂得不得了∼』太簡單了∼目前提供 Sendmail 做為郵件主機伺服器的主要為 Red Hat 這個 Linux distribution ,至於其他的 Linux distribution 是否提供 Sendmail 就得請您自行到該官方網站上面查詢一下囉!底下我們主要是以 Red Hat 7.x 以及 Red Hat 9 的 Linux 系統做為 Sendmail 的介紹,此外, OpenLinux server 3.1.1 亦是使用此一相關功能套件的喔!那麼需要安裝哪些套件呢?還記得我們在 Mail Server 使用的協定裡面談到的幾個基本的協定吧?亦即是 SMTP 與 POP3 這兩個,此外,由於 Sendmail 必須『讀入』一些資料庫格式,所以也必須要安裝相關的資料庫的函式庫喔!
 
不過,如果您的系統是比較老舊的,例如 Red Hat 6.x 以前的版本,又或者是您的系統本來就不存在 Sendmail ,例如 Mandrake 等其他版本的 Linux distribution 時,那麼您就得使用 Tarball 的方式來安裝了! ( 事實上,幾乎所有的 Linux distribution 都會納入 sendmail ,只是有些套件,例如 Mandrake 預設是安裝 postfix 就是了! ) 安裝 Tarball 的 Sendmail 真是一件很『雪特』的苦差事,而且安裝的不夠好的話,還有可能產生一些設定上的困擾,此外,安裝的過程當中,使用到很多的『天書一般的設定檔案與牛屎一般的一大沱設定資料』,這些資料如果沒有一定程度的 Sendmail 架構知識,是無法安裝起來的,還有還有, Tarball 安裝的話,最好是所有的 Sendmail 相關套件都一起安裝,而不是分開來安裝,所以,鳥哥將 Sendmail 的 Tarball 安裝方法放在最後面,希望您至少看完『主機的設定』該節的完整內容,以及瀏覽過『關於郵件主機安全的設定』之後,再來嘗試以 Tarball 完整的安裝起屬於您自己的 Sendmail 郵件主機喔!
 
好了,底下我們就來安裝 Sendmail 及 POP3 這兩個郵件伺服器上面的元件吧!

使用 RPM 安裝 sendmail ( 適用於原本 Linux 就是使用 sendmail )
如果您是使用 Red Hat 7.3 以前的版本,例如 Red Hat 7.1, 7.2, 7.3 ,或者是 Open Linux Server 3.1.1 的話,那麼請先確定一下底下的套件是否已經安裝上去了呢?
 
[root@test root]# rpm -qa | grep sendmail
sendmail-cf-8.11.6-3
sendmail-8.11.6-3
# 若有屬性相依的問題時,請將您的原版安裝光碟拿出來, mount 上去後,
# 仔細的,一個一個的將相依的套件安裝上去囉! ^_^
[root@test root]# rpm -qa | grep m4
m4-1.4.1-5
[root@test root]# rpm -q mailx
mailx-8.1.1-22
 
那個 sendmail 就是主要的郵件伺服器程式 sendmail-cf 是一些設定檔案, 這兩個套件是『一定』要安裝的!至於那個 m4 的套件,則是轉換 sendmail 設定檔的一支程式囉!也要安裝喔!而那個 mailx 就是提供最簡單的 mail 這支寄信與收信的套件啦!由於我的測試系統是 Red Hat 7.2 ,所以使用的算是比較舊一點點的 sendmail 8.11.6 版,如果您想要換裝新版的 sendmail 8.12.xx 的話,請參考底下『Tarball 完整安裝 Sendmail 伺服器』的步驟!不過,這裡我們先還是玩一玩這個預設的版本即可!記得喔!安裝完畢之後,請到 Red Hat 的網站上面去下載更新的 RPM 來更新吧 http://www.redhat.com/apps/support/errata/!或者是台灣的映射站喔!ftp://linux.sinica.edu.tw/pub1/redhat/updates/
 

使用 RPM 安裝 IMAP 套件
這個 IMAP 套件,就是負責收信的 POP3 那個協定啦!請使用 RPM 確認他已經安裝在您的系統上面囉!
 
[root@test root]# rpm -qa | grep imap
imap-devel-2001a-1.72.0
imap-2001a-1.72.0
 
那個 imap 就是我們主要的 POP3 那個協定的套件囉!如果您是使用 Open Linux 的話,那麼設定檔應該會是在 /etc/inet.d 內,而如果是使用新的 xinetd 的話,那麼設定檔就會是在 /etc/xinetd.d 裡面囉!等一下我們再來好好的談一談啦! ( 註:本章節並沒有談到 imap 這個協定的設定與應用,事實上, imap 這個套件同時提供了 pop2, pop3, imap 等協定的設定與相關功能喔! )

主機的設定:
知道如何安裝 Sendmail 之後,接下來,我們得瞭解一下在郵件伺服器架設之前,您需要先進行什麼樣的工作呢? 好了,既然是玩 Sendmail ,那麼就得瞭解一下 sendmail 的相關檔案與說明囉!
 

Sendmail Server 的檔案架構與基礎說明
 
Sendmail 幾乎所有的設定檔都安置在 /etc/mail 底下,不過,如果你是以 RPM 安裝的話,那麼還有所謂的 sendmail-cf 的設定檔,這個就是使用 M4 在進行 sendmail.cf 設定的程式!由於 Sendmail Server 所使用到的套件並不少,這包括有 sendmail, imap 以及 m4 等等,我們針對這些套件來談一談每個目錄與檔案下的資料吧!
使用 m4 來簡易設定 sendmail
 
一般來說,只要您在安裝完了 sendmail 之後,您的 Mail Server 就可以正式的來啟動了!但是不幸的是,在 Red Hat 7.xx 以後的版本中(包含 Red Hat 9),為了杜絕廣告信件的問題,所以在預設的情況下,您的 sendmail 將『只會監聽 127.0.0.1 這個介面的收發信件需求!』至於非 Red Hat 版本的 sendmail 則可以正常的來啟動喔!為了解決這個問題,所以我們勢必要針對 sendmail.cf 這個設定檔案來進行修訂,但是這個檔案原本即建議需要由 m4 來進行修改,所以,我們就得瞭解一下使用 m4 來轉換成為 sendmail.cf 的設定檔 file.mc 的相關參數囉!
啟動 Mail Server
 
Mail Server 的啟動是相當的簡單的,在 Red Hat 的系統當中,你可以依序啟動 sendmail 以及 POP3 這個服務喔:
 
1. 啟動 sendmail
[root@test root]# /etc/rc.d/init.d/sendmail start
Starting sendmail:                                         [  OK  ]

2. 啟動 POP3 這個協定
[root@test root]# cd /etc/xinetd.d
[root@test xinetd.d]# vi ipop3
# 找到下面這一行:
disable = yes
# 將他改成
disable = no
# 儲存後離開!至於更詳細的說明,可以參考『基礎學習篇認識服務』喔!

[root@test cf]# /etc/rc.d/init.d/xinetd restart
[root@test cf]# netstat  -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:pop3                  *:*                     LISTEN
tcp        0      0 *:smtp                  *:*                     LISTEN

 
看到了嗎?這樣我們的 Mail Serve 就已經啟動了!他已經可以進行收信與送信的工作囉!事實上,如果您曾經以 vi 檢查過 /etc/rc.d/init.d/sendmail 這個檔案的話,你會發現他其實就是使用 /usr/sbin/sendmail 這支程式在工作的啦!他通常的指令下達方式為:
 
[root@test root]# /usr/sbin/sendmail -bd -q30m
參數說明:
-bd : 表示將 sendmail 以 daemon (可以想成常駐記憶體的類型) 的類型啟動!
-q  : queue 的意思,後面接的是時間參數,時間參數有:
    s (秒) m(分) h(小時) 及 d(天)
    -q30m 表示每隔三十分鐘,會將放置在郵件佇列 ( 一般是在 /var/spool/mqueue ) 
    的郵件嘗試寄出一次!所以,上面的例子當中,說的是將 sendmail 以 daemon 
    的類型啟動之後,並且每 30 分鐘去將郵件佇列(為寄出的郵件)嘗試寄出一次!
 
而 Red Hat 針對郵件佇列寄送郵件的時間,則是設定在 /etc/sysconfig/sendmail 這個檔案裡面喔!
 
註:
如果您在啟動 sendmail 的時候,出現類似這段文字:
*** Warning: File `virtusertable.db' has modification time in the future (2003-01-13 11:57:26 > 2003-01-13 06:04:40)
make: warning: Clock skew detected. Your build may be incomplete.
這表示您在安裝 Linux 的時候,可能發生一些時間上面的錯誤判斷了!導致於你的 sendmail 相關的設定檔竟然比目前的時間還要新,也就是該檔案乃『來自未來』∼這個時候你可以使用:
touch /etc/mail/*
來將檔案的時間更新為目前的時間,那就可以順利的啟動 Sendmail 囉! ^_^
 

設定主機名稱
 
啟動了 Sendmail 之後,還需要規定你的主機名稱喔,這樣,你的郵件主機才能正常無誤的開始工作吶!假設您的主機 IP 可以在 Internet 上面以 DNS 系統查詢到,以我為例,我的機器上面有 www.tsai.adsldns.org 及 tsai.adsldns.org 兩個主機名稱,並且這兩個主機名稱均指向我家裡的那一部機器,那麼假如我只要 tsai.adsldns.org 具有收信的資格,如果人家寄信到 www.tsai.adsldns.org 則不予以接受,並將該封信件退回去時,可以這樣做:
 
[root@test root]# cd /etc/mail
[root@test mail]# vi local-host-names
tsai.adsldns.org
 
在該檔案裡面僅存在一個主機名稱即可!那麼萬一我有三個主機名稱,分別是 tsai.adsldns.org, www.tsai.asdldns.org 及 tsai.linux-site.net,而且我這三個主機名稱都希望可以收到信件時,那麼你就必需要這樣修改囉:
 
[root@test root]# cd /etc/mail
[root@test mail]# vi local-host-names
tsai.adsldns.org
www.tsai.adsldns.org
tsai.linux-site.net
 
每一行有一個主機名稱!請記住,未來如果您的主機新增了不同的 HOSTNAME ,並且你希望該主機名稱可以用來收發信件,那麼要修改 local-host-names 喔!那麼什麼時候不要將所有的主機名稱都給他寫到這個 local-host-names 裡面去呢?!由於目前的廣告信件實在是太多了,他們會主動的在 Internet 上面搜尋一些主機名稱,然後隨機四處發送垃圾郵件。如果您的主機有四個名稱,每個主機名稱都寫到 local-host-names 去的話,呵呵!很可能一封廣告信您會『收到四次』,因為四個主機名稱嘛!所以囉!有的時候還是不要讓全部的主機名稱都可以收信是比較好的吶!
 

設定郵件伺服器使用權限 /etc/mail/access
 
在你啟動了 Sendmail 以及設定好主機名稱 ( local-host-names )之後,那你就可以利用『在你的主機上面利用你的主機來寄信』了!為什麼要加上『在你的主機上面』呢?還記得我們在前面有提過,為了杜絕廣告與垃圾信件,所以預設的情況中, Sendmail 是關閉 Open Relay 的對吧!但是為了主機使用者的方便,所以我們預設是有啟動 local 這個 Mailer ,也就是說:
  1. 只有使用者是在主機上面發信的,例如使用 SSH 登入主機後,以 mail 這個指令來發信;
  2. 又或者使用者直接在主機上面使用 X-Window System 裡面的郵件代理人,亦即是 Netscape 或者是 Kmail 等軟體來發信
的時候,我們的 Sendmail 才會幫使用者『寄信』喔!至於其他的電腦來源的『寄信』郵件,Sendmail 一概將他退信回去!那麼如果我想要在其他的電腦上面使用我這部 Mail Server 來寄信呢?這個時候就要編輯『/etc/mail/access』這個信任網域設定的檔案啦!假設一個例子好了: 那麼我可以怎樣設定 Sendmail 的存取權限呢?
 
[root@test root]# vi /etc/mail/access
# 預設情況下有啟用的 IP
localhost.localdomain           RELAY
localhost                       RELAY
127.0.0.1                       RELAY

# 想要開放權限的 IP 與網域
192.168.0           RELAY
140.116.44.125         RELAY

# 擋掉的 IP、主機名稱與 E-mail
h8h.com       DISCARD
192.168.1.100    DISCARD
test@testing.domain.name  REJECT
# 儲存後離開

[root@test root]# makemap hash /etc/mail/access < /etc/mail/access

 
在 /etc/mail/access 當中,只要有加上 # 就是註解內容,所以不會被讀入資料庫當中!其實真正的 Sendmail 可以讀得到的資料庫是 /etc/mail/access.db 這個檔案,不過,我們必需先在 /etc/mail/access 編輯完畢後,再以 makemap 這支程式將他改寫成為資料庫!所以,不要忘記 makemap 那個步驟喔!由上面的檔案我們就可以知道啦, access 的語法為
規定的範圍          規定可以在sendmail上面的動作
IP/不完整IP/主機名稱/E-mail   RELAY/DISCARD/REJECT
在『規定範圍』與『規定可以在 sendmail 上面的動作』兩項目之間最好以 <tab> 按鍵來隔開會比較正確!『規定的範圍』還可以設定『來源』與『目的』喔!例如:
from:test@your-domain.com.tw  REJECT
to:blah@your-domain.com.tw   REJECT
當信件想要使用我們的郵件主機來進行寄信或者是 Relay 的動作時,首先會傳送 mail header 到我們的 mail server 上面,這也就是一些郵件的基本資料(如認證資訊、來源IP、目標的 MTA 等等),但並不包含郵件的內容(例如信件本體、附件夾帶等等的內容)。也就是說,一封郵件基本上可以分為兩大部分,分別是 Header 與 Body ,Header 僅記錄郵件基本資訊,Body 才是真正的信件內容。當郵件想要進入 MTA 時,會先發送 Header 給 MTA ,MTA 判斷這個 Header 的資訊是可接受的之後,才後繼續接受來源主機的郵件 Body 內容!如果這些基本訊息傳送過來的主機資訊包括在 /etc/mail/access.db 裡面所記錄到的主機(或IP)範圍時,就可以指定底下這些動作: 通常我們比較建議使用 DISCARD 啦!為什麼呢?如果該 IP 來源傳送的是廣告信件,您又使用 REJECT 的話,那麼兩方面的郵件主機將會一再地進行 mail header 的傳送,也是挺消耗頻寬的!所以我們比較建議使用 DISCARD!再來,由於 access 不支援網域的寫法,亦即
192.168.0.0/24
192.168.0.0/255.255.255.0
這種類型的網域寫法並不能被使用的!所以,只能以 192.168.0 這種寫法來達成整個網域的設定了!也就是說, access 裡面大概只能支援 A/B/C Class 的網域, subnet 大概就無法達成了!只能一個一個 IP 的 Keyin 囉!編輯完這個檔案之後,就可以讓你的其他主機使用 Sendmail 的 Relay 功能囉!還不賴吧!
 

重要觀念:一封信件的收受流程
 
OK!到目前為止的 Sendmail 主機設定而言,你的 Mail Server 應該已經能夠應付一個小型的企業單位了,不過,為了讓您能夠更清楚的知道『我要如何控制我的 Mail Server 』,我們底下將會以 Sendmail 收受一封信件的流程,來介紹信件的傳送方向,好讓您更清楚的瞭解到你的 Mail Server 在幹啥好事喔!一般而言,當你的 Sendmail 收到一封信件時,他是怎樣判斷這封信件要怎樣傳送的呢?我們先談一談如果 Sendmail 收到一封『非本機端送出的來信』時,他是怎樣處理這封信件的?
  1. 當 MTA 收到一封郵件,並且該郵件的『信件收件者』為 MTA 本身的用戶帳號時,此時將會以本機端 ( local ) 的收件規則來進行收件,如果 /etc/mail/access.db 沒有針對來源 IP 或者 host 或者 e-mail 抵擋時,則該封信會被我們的 MTA 收下來,並且儲存到 /var/spool/mail 裡面。例如,當我的 tsai.adsldns.org 收到一封給 vbird@tsai.adsldns.org 的郵件,並且 /etc/mail/access.db 沒有針對來源抵擋 ( 在不考慮 procmail 的情況下 ) ,那麼我的 tsai.adsldns.org 這部主機,會立刻將該封郵件存放到 /var/spool/mail/vbird 裡面去,而不必經由『認證』或者抵擋的機制。請注意,在這個情況中, Sendmail 並不會去檢查送件者是否來自於信任網域喔 ( 只要 /etc/mail/access 沒有擋到的主機或IP或其他的 e-mail 資訊 )!

  2.  
  3. 如果這封郵件的『信件收件者』並沒有 MTA 本身的用戶帳號時,那麼 MTA 會以 SMTP 這個外送規則來傳信,此時 MTA 會開始去檢查 /etc/mail/access.db 這個資料庫裡面,任何有關於送件者的 IP、E-mail 以及相關的動作等,如果該封郵件有相關的資料在 /etc/mail/access.db 裡面時 ( 不論是 RELAY, REJECT 或是 DISCARD ) 那麼該封郵件就會依照 /etc/mail/access.db 裡面指定的行為進行郵件的動作(可能是 RELAY 或 DISCARD 等等)!

  4.  
  5. 如果該封郵件經過上面兩道手續後,仍然找不到任何有關的動作訊息,那麼這封郵件將會退回給原發信者!
上面的信件收受行為是在沒有 SMTP 郵件認證以及 procmail 這個 MDA 管理的時候所具備的動作!如果加入 SMTP 或者 procmail 之後,會變成怎樣呢?呵呵!先不告訴你,待會繼續往下看再說吧!
 
關於廣告信的收受
 
很多人常常會發現這樣的一件事,就是:『為什麼有人利用我的 mail server 寄信給我?』舉個例子來說,假如我的一部 Mail server 主機名稱為 mta.domain.name ,而他上面有個實體郵件用戶為 user@mta.domain.name !這個 MTA 主機並沒有對外開放 RELAY 的功能喔!但是有一天, user 這個人還是接到廣告信了!更神奇的是,該封廣告信的發信者為 someother@mta.domain.name !怪怪!明明我的 mta.domain.name 就是沒有 someother 這個用戶,怎麼還可以用我的主機寄信給我自己呢?
 
好了,現在請仔細的參考一下上面的三個步驟,你會發現一件事情,就是『第一個步驟中,如果發現該封信的收件者有本機的帳號時,且 /etc/mail/access 沒有抵擋到該封信時,則該封信件就會被接收下來!』對啦!就是因為如此,因此,對方可以用你的 mail server 寄信給你!不過,還好的是,這樣的情況中,該封廣告信只會在你的 Mail Server 內傳送,並不會寄出去外部的!註:因為要寄到外部去,就需要 RELAY 的功能啦!
 
上面提到的是關於『來自 MTA 外部的信件』時的處理動作,那麼如果這封郵件是來自於『主機內部』的行為呢?例如:使用者以 SSH 登入後,使用 mail 這個指令來執行寄信的動作,又或者是直接在 MTA 這部主機上面的 X Window System 內的 Kmail 來發信呢?由於我們剛剛在設定 sendmail.mc 這個檔案的時候,你會發現一句設定值:
MAILER(local)
或者是
Cwlocalhost.localdomain
這兩個設定都代表『本機寄出的郵件可以不用經過 SMTP 的手續,將直接以 sendmail 的功能寄出』,這也就是說,無論如何,來自主機內部的信件都將被傳送出去!這也是為什麼有的時候明明你的 sendmail 沒有正常的啟動,但是在主機上面直接以 mail 這個指令卻還是可以將郵件送出的原因啦!
 
例題:曾經有朋友發現一個有趣的現象,那就是他的 WWW 網站提供 CGI 的功能 ( 所謂的 CGI 指的是一些動態的網頁內容,例如鳥哥的私房菜裡面的留言版,這些功能很多是利用 perl 語言或者其他語言寫成的程式喔!),他所提供的 CGI 程式的功能可以幫助使用者寄信,後來發現很多人便藉由這個 CGI 的網路功能,使用他的 WWW 主機發送大量的廣告信,他就很生氣的將他自己的 WWW 主機的 Sendmail 關閉,也就是將 smtp 的 port (25) 關掉,以為這樣就可以將廣告信杜絕啦!但是,廣告信卻還是一直的發送!並沒有停下來!您知道為什麼嗎?!
答:
原因應該很簡單吧!因為 WWW 在 Linux 本機上面跑,而管理員提供的的 CGI 是在 WWW 上面跑,也就是說,這個 CGI 本來就是利用 Linux 的 Sendmail 在傳送郵件的,那既然 sendmail 本來就可以不需要透過 smtp 的 port 來傳送郵件,自然你的廣告信就還是可以自由的發送出去囉!

設定使用者別名 /etc/aliases
 
一、群組寄信的功能:
約略了解了 Sendmail 整體之後,目前你的 Sendmail 應該也可以順利正常的運作了!不過,還有個重要的課題要來討論,那就是關於『群組寄信』的問題啦!假設你是在學校單位裡面,在這所學校裡面的每個同學都有自己的帳號,而學校的老師也都是使用同學的電子郵件來聯絡感情!不過,要記住一個班級 30~50 個同學的電子郵件位址實在不怎麼好記,加上未來同學們畢業,新的同學又加進來,哇!豈不頭疼∼這個時候您可以幫助這些善良的老師們啦!就利用這個『使用者別名設定』的功能即可!怎麼作呢?我們可以將一個班級取一個代號,例如預計 92 年畢業的 13 班,就稱為 student9213 這樣的帳號,但是這個帳號並非是實體用戶喔!他僅是一個別名而已!基本上,他代表了 92 年畢業的 13 班的全體同學的電子郵件!這個功能可以透過編輯 /etc/mail/aliases 來達成喔!( 註:這個檔案不一定在 /etc/aliases ,有時會在 /etc/mail/aliases ,完全依照當時使用 filename.mc 定義時的路徑而定的! ) 這個 /etc/mail/aliases 的語法有點像這樣:
在郵件上面的收件者帳號:   真實帳號1, 真實帳號2, 真實帳號3....
birdhouse:          bird1, bird2, bird3, bird4
在上面的例子中,『真實帳號1...帳號3 中間的所有帳號與帳號之間都以逗號隔開而已!』你也可以在逗號後面接空白字元,這是沒有關係的!但是不能只接空白字元而沒有逗號喔,不然就會造成人名的誤判!而 birdhouse 那一行就更清楚啦!當我寄出一封信給 birdhost@tsai.adsldns.org 時,在 tsai.adsldns.org 主機收到這封信之後,會將該封信複製成四封並分別寄給 bird1, bird2, bird3, 及 bird4 四個使用者,所以你只要記住 birdhouse 就行了!所以,如果用在上面學校單位的那個例子時,就可以這樣進行:
 
1. 編輯別名設定檔:
[root@test root]# vi /etc/aliases
新加入這一行在 aliases 的最底下:
student9213:  st001,st002,st003,st004.st005,st006,st007.....

2. 製作資料庫 /etc/aliases.db 
[root@test root]# newaliases

 
要注意的是,與 /etc/mail/access.db 相似的,我們 sendmail 讀取的資料庫格式其實是 /etc/mail/aliases.db 這個檔案,所以當你編輯完成 /etc/mail/aliases 之後,記得一定要使用 newaliases 這個指令來將資料變成資料庫喔!否則 sendmail 將不會讀取到您剛剛修改完成的變動!這個群組寄信功能相當的不賴,如果你有四個計畫在你的 Linux 主機上面,而這四組人都是你管的,但是這四組人又互相沒有資訊的交流,那麼你就可以進行這四組人的郵件群組功能,同時,將你的實體帳號分別加入這四個群組中!哈哈!就可以收到這四個群組的信件囉!
 
二、使用者的別名設定與重要郵件備份:
除了群組功能之外, aliases 還可以用來做為一個用戶多個郵件名稱的設定喔!例如,小老弟我,鳥哥的渾號僅在 Linux 裡面通稱而已,一般的上班單位裡面,仍然主要以我的名字記憶我的郵件的!也就是說,我具有兩個帳號在我的 tsai.adsldns.org 上面,分別是 vbird@tsai.adsldns.org 及 dmtsai@tsai.adsldns.org !那麼我是否還要建造另一個實體使用者帳號呢?當然不需要,我只要在 /etc/mail/aliases 裡面加入一行:
 
1. 編輯別名設定檔:
[root@test root]# vi /etc/mail/aliases
dmtsai:  vbird

2. 製作資料庫 /etc/mail/aliases.db 
[root@test root]# newaliases

 
那麼未來這兩個電子郵件均將寄到我的 /var/spool/mail/vbird 信箱裡面去喔!所以,不論是寄給 dmtsai 還是 vbird ,我都可以直接以 vbird 這個帳號來取得這兩個郵件位址的信件,因為都這兩個郵件都放到 /var/spool/mail/vbird 這個信箱嘛!相當的方便吧! ^_^另外,如果我要將某個帳號在收信時,順便備份一份到系統當中時,例如寄信到 vbird 時,順道寄一份到 testing 時,可以這樣做:
 
1. 編輯別名設定檔:
[root@test root]# vi /etc/mail/aliases
dmtsai:  vbird
vbird:     vbird,testing

2. 製作資料庫 /etc/mail/aliases.db 
[root@test root]# newaliases

 
如此一來,則寄給 vbird 的信件,vbird 自己保留一份之外,也會再寄給 testing 這個人喔!可以做為備份的需要啦!
 
三、外部信件的寄送
另外,如果你的電子郵件想要將該郵件外傳的話,要怎麼做?這個同樣可以做為郵件的『異地備援』之用!怎麼說呢?同樣用我們的 tsai.adsldns.org 來做說明吧!假設我的帳號 vbird@tsai.adsldns.org 送到 tsai.adsldns.org 之後,要再傳送一份給 vbird@vbird.adsldns.org ,也就是說,信件傳送到 tsai.adsldns.org 這部主機的 vbird 後, tsai.adsldns.org 會主動的再將該信件外傳到 vbird.adsldns.org 這一部上面去!怎麼做呢?你可以這樣搞定:
 
1. 編輯別名設定檔:
[root @test root]# vi /etc/mail/aliases
dmtsai:    vbird
vbird:     vbird,vbird@vbird.adsldns.org

2. 製作資料庫 /etc/mail/aliases.db 
[root @test root]# newaliases

 
如此一來,任何人寄給 vbird@tsai.adsldns.org 的郵件,都會額外再多寄一份給 vbird@vbird.adsldns.org !就可以達到異地備援的目的啦!很方便吧!此外,你也可以用來做為 Mail list 呢!嘻嘻!
 
四、檔案類型的別名 include
再讓我們回到第一點『群組寄信』的地方,您會不會覺得,如此一般的設定方法,在經過了幾年之後,你的這個 aliases 會變的亂七八糟的!所以這裡再讓我們學個有用的技巧,就是利用 aliases 裡面的 include (包括) 功能,使用檔案類型的方法來達成群組寄信的目的!舉上面學校相同的例子來說明好了,今天我的 student9213 這個群組帳號中,所有的人員都給他寫入 /etc/mail/student9213 這個檔案當中,然後再以 include 的功能給他寫入 aliases 這個檔案中∼你可以這樣做:
 
1. 編輯 /etc/mail/student9213 :
[root@test root]# vi /etc/mail/student9213
st001, \
st002, \
st003, \
st004, \
....
st050
假設共 50 個學生,則最後一個不用加上『 , \』!與變數設定規則相符!

2. 還是要編輯 aliases 的!
[root@test root]# vi /etc/mail/aliases
dmtsai:        vbird
vbird:         vbird,vbird@vbird.adsldns.org
student9213:   :include:/etc/mail/student9213

3. 製作資料庫 /etc/mail/aliases.db 
[root@test root]# newaliases

 
整個寫法是:
群組帳號: :include:使用的檔案完整檔名
請注意,這個檔案類型的格式為『:include:』亦即 include 兩邊都有冒號,並且,在最前面帳號的地方也有冒號喔!不要記錯了∼至於在 /etc/mail/student9213 這個檔案中的寫法與 aliases 後面接的帳號或 E-mail 類型寫法相同,例如:
vbird, vbird@vbird.adsldns.org, userID@host.domain.name
不過,我們也可以利用跳脫字元『\』來加以格式美觀化,會比較整齊畫一喔!但是,仍然不要忘記了那個可愛的『逗號』喔!例如上面表格裡面的 st001, .... 說明的樣式!這部份如果不太明瞭的話,請拿出鳥哥的私房菜 Linux 基礎學習篇,好好的看一看 BASH Shell 裡面介紹的變數設定規則吧! ^_^!
 
上面提到的都是關於系統管理員設定的資料部分,那麼預設的 aliases 裡面有什麼東西呢?通常有這些資料存在的喔:
 
[root@test root]# vi /etc/mail/aliases
# 基礎 sendmail 資料!由於 sendmail 預設使用 mailer-daemon 與
# postmaster 做為資料發送者,或者是信件被退回時的帳號!但是我
# 們的系統並沒有這兩個帳號,因此,必需要使用 aliases 的功能!
# 如果是使用 sendmail ,那麼底下這兩行『務必存在』才行!
mailer-daemon:  postmaster
postmaster:     root

# pseudo accounts. 也就是系統的帳號,這些帳號是給系統來使用的,
# 基本上,這些帳號並無法登入主機,但是偏偏某些程式進行時,產生
# 的錯誤訊息可能會寄給該系統帳號,但該帳號無法登入,所以會讓系統
# 無形之中遺失許多的資訊,所以囉,這些帳號也需要來做 aliases 
# 並且將收件者交給系統一定會有的人物! root 是耶!通常這些帳號
# 常見的有 bin, daemon, adm, lp, sync, shutdown, halt, mail, news
# uucp, operator, games, gopher, ftp, nobody, named, xfs, system, 
# 等等等等!
bin:            root
daemon:         root
adm:            root
lp:             root
sync:           root
shutdown:       root
....(略).....

# trap decode to catch security attacks 有些攻擊者在攻擊你的主機時,
# 該相關的資訊會寄給你的 decode 這個帳號,將他轉成 root 吧!
decode:         root

# 這是 root 的收件信者! 由於預設狀況中, root 是不能在主機外部
# 的任何一部電腦收信的!如果您想要讓你的一般帳號可以接收 root 的
# 信件,以即時掌握主機資訊,那麼底下的 # 將他打開,後面接你的
# 帳號吧!
#root:          your_account

 
這些資料在 aliases 當中是必需要的喔!如果你是自行以 Tarball 建立 Sendmail 的話,那麼這個 aliases 可是需要加入的吶!
設定郵件轉遞 ~/.forward
 
瞭解了 aliases 之後,是否會發現一個問題呢?那就是,雖然 aliases 可以幫我們達到 mailling list 的功能,但是『只有 root 才可以修改該 aliases 檔案』,那麼萬一我並不是網站管理員,怎麼辦?是否還是可以建立一個 mail 轉寄的功能呢?確實還是可以啦!這個時候可以使用郵件轉寄 ( mail forward ) 的功能喔!你可以在該帳號的家目錄之下建立一個檔案,檔名為 ~/.forward ,利用該檔案就可以達到 Mailling list 的功能啦!
 
還是來假設個案例囉:假設我有一個帳號,名稱為 birdhouse ,而我希望寄信給該 birdhouse 時,就可以將信件分送給該 MTA 主機上面的 bird1, bird2, bird3, 及 bird4 之外,還可以寄給外部的 bird@yahoo.com 及 bird@pchome.com 此外,還記錄一份給 birdhouse 這個主要帳號!這個時候你可以這樣做:
 
[birdhouse@test birdhouse]$ cd ~
[birdhouse@test birdhouse]$ vi .forward
birdhouse
bird1
bird2
bird3
bird4
bird@yahoo.com
bird@pchome.com
[birdhouse@test birdhouse]$ chmod 644 .forward
 
直接將你要寄出去的郵件位址都寫到 ~/.forward 裡面去,每個位址都佔用一行,如此一來,嘿嘿!只要是寄給 birdhouse@tsai.adsldns.org 的郵件,就可以自動的來傳送到 ~/.forward 內部所設定的郵件位址囉!同時,這個檔案除了可以用來建立類似 mailling list 的功能外,也可以讓你自己設定『異地備份郵件』的功能呢!就是在該檔案內寫入你自己的帳號以及外部信件的郵件位址,那麼當你的主機收到要給你的信時,除了給你一份外,還會再轉一份給你訂定的郵件位址!而最大的優點是,『不需要建立資料庫或者重新啟動 sendmail !』以 vi 設定完,並且儲存後,立刻生效!好用的很∼
 
不過需要注意的是,由於這個檔案是這樣的方便設定,萬一被某些居心不良的人看到甚至可以修改時,那可就不得了了!你能想像你的信件都會被複製一份到某人的信箱嗎?所以囉,這個檔案必需只有你能修改,其他人則僅能查閱而無法修改才行喔!亦即這個 .forward 檔案的權限必需要:
  1. 該檔案所在使用者家目錄權限,其 group、other 不可以有寫入權限。
  2. .forward 檔案權限,其 group、other 不可以有寫入權限。

察看信件佇列 ( mailq )與 Mailers 狀態
 
關於信件佇列
對於 Sendmail 設定到目前為止,應該也可以正常的應付蠻多工作的啦!但是我們還是得要瞭解一下的是:『如果我將郵件送到 Sendmail 主機後,Sendmail 便會幫我將該封郵件傳送到目的地的 MTA ,不過,如果目的地 MTA 主機有問題時,這封信會怎麼跑?』一般來說,如果 DNS 設定正確的話,也就是說目的地 MTA 有 MX 標誌存在時,只是剛好這部主機暫時無法連線,或者是有些問題,導致無法立即接受來自你的 MTA 的郵件,此時這封郵件將會被放置到你的 MTA 主機的佇列目錄去,通常預設是在 /var/spool/mqueue 當中!然後在一定的週期時間內, Sendmail 會定時的嘗試將郵件寄送出去,一般 Sendmail 的預設設定是:
  1. 如果該封信在五分鐘之內無法寄出,則系統會發出一封『警告信』給原發信者,告知該封郵件尚無法被寄送出去,不過,系統仍會持續的嘗試寄出該封郵件;
  2. 如果在四小時候仍無法寄出,系統會再次的發出警告信給原發信者;
  3. 如果持續進行五天都無法將信件送出,那麼該封郵件就會退回給原發信者了!
在 Red Hat 的預設條件中,在 /var/spool/mqueue 當中的信件會每隔 60 分鐘由 Sendmail 嘗試重新傳送一次到目的地去!這個嘗試的時間是可以改變的!可以利用 sendmail 的指令或者直接修改 /etc/sysconfig/sendmail 裡面的 『QUEUE=時間』來修訂!例如,如果你想要讓 Sendmail 每隔 30 分鐘就幫你嘗試傳送 /var/spool/mqueue 裡面的未寄出的信件時,那麼就將 /etc/sysconfig/sendmail 這個檔案裡面的『QUEUE=1h 』改成『QUEUE=30m 』即可!
 
信件佇列的內容
老實說,信件佇列的內容是給 Sendmail 看的,不是給人看的,所以我們都不可能看的懂他的訊息!這個時候,只得以 Sendmail 的指令來反查這些郵件佇列到底是什麼咚咚了!很簡單的,只要下達 mailq 或者是 sendmail -bp 就可以這些郵件佇列的基本資料!
 
[root@test root]# mailq
                /var/spool/mqueue (1 requests)
----Q-ID---- --Size-- -----Q-Time----- ------------Sender/Recipient------------
h1LEKYR23711    36414 Fri Feb 21 22:20 <gold@tsai.adsldns.org>
                 (Deferred: Connection refused by vbird.adsldns.org)
                                       <qqq@vbird.adsldns.org>
 
Q-ID:表示此封郵件佇列的代表號 ( ID );
Size :這封信有多大容量 ( bytes )的意思;
Q-Time:這封信什麼時候進入 /var/spool/mqueue 這個目錄的,並且說明無法立即傳送出去的原因 (例如上面的 Deferred );
Sender/Recipient:送信與收信者的電子郵件囉!
 
如果您有開放郵件的話,那麼記得偶而要去看一看您的郵件佇列 ( mailq ) 是否存在大量的未寄出信件喔!好讓你知道是否可能被當作轉信站啦!
 
關於郵件在 Mailer 中的統計狀態 ( mailstats )
除了 mailq 記錄了在信件佇列的資訊之外,還有一個檔案可以紀錄 sendmail 由『開始運作到目前為止,郵件的收發總計資料』喔!預設就是 /etc/mail/statistics 這個屬性為 data 的檔案,那麼我怎麼將這個檔案的資料讀出來呢?很簡單啊!就藉由 mailstats 這個小指令來讀取即可!讀取出來的結果有點像這樣:
 
[root@test root]# mailstats
Statistics from Sat Mar 23 21:34:09 2002
 M   msgsfr  bytes_from   msgsto    bytes_to  msgsrej msgsdis  Mailer
 4    50752    9126380K    23617    5425714K     1070     122  esmtp
 9    21329    5919236K    65162   13364494K     1068       8  local
=============================================================
 T    72081   15045616K    88779   18790208K     2138     130
 C    72081                88779                 2655
 
上面共出現七行,第一行只是顯示目前的時間而已,至於每個直列的意義為: 由上面的資料你會發現,哇!怎麼鳥哥的信箱 15GB 的信件啊!真可怕∼別擔心,那個資料是由『 sendmail 開始運作到現今』的結果,我的 sendmail 運作了若干年了,有這樣的信件資料量其實不怎麼吃驚啦! ^_^

用戶端的使用說明
設定 Mail Server 就是要拿來用的!所以,當然要介紹一下怎麼使用 Mail Server 啦!我們分為 Linux 與 Windows 稍微做介紹囉!

關於郵件主機安全的設定
Sendmail 常常被傳成『安全性很差的郵件伺服器!』當然, Sendmail 官方網站也很不滿的回應說『其實, Sendmail 的問題來自於一些"該死的"檔案權限設定錯誤的狀況!』也就是說,其實 sendmail 常常會因為『系統管理員』設定檔案或者目錄不良的情況下,導致 Mail Server 發生問題囉!所以,底下我們就來說一說這個 sendmail 的安全性與其他相關的安全方面設定吧!

Tarball 的安裝方式 ( 適用於原本 Linux 沒有 sendmail 或者是認證機制的! )
Sendmail 的安裝方面真的是相當的『雪特!』比那個 LAMP 還要麻煩的多∼所以,如果你的系統當中主要是以 sendmail 做為你的郵件伺服器軟體,例如 Red Hat 7.2, Red Hat 7.3 等等的,那麼就以你的 distribution 提供的軟體來安裝!不要直接使用 Tarball 的方式安裝,因為要配合的套件實在太多了,鳥哥也說不準是否有什麼咚咚忘記給他安裝上來ㄋㄟ!所以,除非你是最近釋出的 distribution 例如 Mandrake 9.0 ,因為他使用的並非是 sendmail ,或者是 OpenLinux Server 3.1.1 ,因為他的 sendmail 預設沒有 認證機制 存在,否則,盡量以你的 distribution 提供的 sendmail ( RPM 版本 ) 來安裝你的郵件伺服器吧!例如 Red Hat 7.x 版的就直接由 Red Hat 提供的 sendmail 為準吧!
 
如果你是使用 OpenLinux Server 3.1.1 以及 Mandrake 或者是其他並非使用 sendmail 的 Linux distribution 時,由於這些 distribution 不是提供其他的 mail server package 而沒有 sendmail ,就是在郵件伺服器套件上面缺東缺西的,例如缺乏 procmail, cyrus-sasl....等等的套件,所以,看來您也只好摸摸鼻子,好好的自行加油努力以 tarball 的方式來安裝囉!那麼與 RPM 版本類似的,你需要的套件有哪些呢?至少需要有底下這幾個,郵件伺服器的功能才夠完整喔: 基本上,我們目前僅安裝 sendmail 及 cyrus-sasl 就好了!不過,考慮有些 Linux Distribution 並沒有提供相關的功能,所以我們還是安裝一下 procmail 好了!因為那個 Cyrus SASL 就是要達成 SMTP 認證的重要工具,而我們的 senmdail 是用他來做認證的,所以兩者要一起編譯與安裝才行吶!!直到目前為止 ( 2003/02/20 ) 我們使用最新的 Cyrus-SASL 2.1.12 版以及 procmail 3.22,至於 sendmail 則使用 8.12.7 版!首先,我們必需先建立密碼資料的函式庫,亦即 Cyrus SASL 這個套件與 Procmail 喔: ( 註:目前 sendmail 或其他的,例如 postfix 等郵件伺服器軟體,主要仍以 Cyrus-sasl 1.5.28 這個版本來安裝的,包括 sendmail 官方網站的介紹「http://www.sendmail.org/~ca/email/auth.html」亦是使用 1.5.28 來做介紹!不過, Cyrus SASL 的官方網站說, 2.xx 版本的 SASL 比較優良,所以,這裡我們參考了 sendmail 官方網站,以及 Cyrus SASL 的官方網站的文章,整理出底下的安裝步驟囉! )
 
安裝 Cyrus SASL 2.xx 版本!
1. 首先將資料解壓縮(假設您將我們網站的檔案捉到 /root 底下了!)
[root@test root]# cd /usr/local/src
[root@test src]# tar -zxvf /root/cyrus-sasl-2.1.12.tar.gz
.....(略).....最後建立一個 cyrus-sasl-2.1.12 的目錄

2. 再來就是設定你的 cyrus SASL 的參數以及編譯囉!
[root@test src]# cd cyrus-sasl-2.1.12
[root@test cyrus-sasl-2.1.12]# ./configure   \
> --prefix=/usr/local/cyrus-sasl2 --enable-login --enable-plain \
> --enable-pwcheck --with-saslauthd=/var/run
# 注意上面的語法!!那個 \ 是跳脫字元喔!後面直接 Enter !
# 不要接任何空白或者是 tab 按鍵!若有問題,請到 Shell 看看!
# 至於那個 pwcheck 的項目,就是要用來做為密碼確認的一個咚咚囉!

[root@test cyrus-sasl-2.1.12]# make clean && make
[root@test cyrus-sasl-2.1.12]# make install
# 上面三個步驟會花去一些時間,請耐心等待∼
# 而由於我們剛剛設定了 --prefix=/usr/local/cyrus-sasl2 這個參數,
# 所以, make install 之後,我們有用的函式庫會在 
# /usr/local/cyrus-sasl2/lib/sasl2 這個路徑當中,但是, cyrus 程式
# 會主動去找 /usr/lib/sasl2 這個目錄!所以,我們必需要做連結檔!

[root@test cyrus-sasl-2.1.12]# cd /usr/lib
[root@test lib]# ln -s /usr/local/cyrus-sasl2/lib/* .
# 這樣就建立起連結檔囉!很厲害喔!

3. 準備建立 sendmail 與 cyrus SASL 使用的簡易設定檔:
[root@test lib]# cd /usr/lib/sasl2
[root@test sasl2]# echo 'pwcheck_method: saslauthd' > Sendmail.conf 
# 注意了!一般來說, sendmail 會使用 SASL 這個函式庫裡面,
# 在 /usr/lib/sasl2/Sendmail.conf 這個檔案的設定做為他的預設使用 SASL 的
# 參數檔案,那個 Sendmail 的 S 是大寫,請不要寫錯了!我們使用 SASL 預設的
# saslauthd 這支程式做為密碼認證的 daemon 囉!

4. 建立一些需要的參數:
[root@test sasl2]# vi /etc/man.config
# 新增一行:
MANPATH /usr/local/cyrus-sasl2/man

5. 檢驗 saslauthd 這支程式是否可行!
[root@test sasl2]# /usr/local/cyrus-sasl2/sbin/saslauthd -a shadow
[root@test sasl2]# cd /usr/local/src/cyrus-sasl-2.1.12/saslauthd/
[root@test saslauthd]# make testsaslauthd
[root@test saslauthd]# ./testsaslauthd -u userID -p 'yours.passwd'
0: OK "Success."
# 若顯示 OK 的話!那麼就是成功啦!很好!我喜歡∼

6. 設定開機時啟動
[root@test saslauthd]# vi /etc/rc.d/rc.local
# 加入這一行:
/usr/local/cyrus-sasl2/sbin/saslauthd -a shadow

 
安裝 Procmail
1. 首先將資料解壓縮(假設您將我們網站的檔案捉到 /root 底下了!)
[root@test root]# cd /usr/local/src
[root@test src]# tar -zxvf /root/procmail-3.22.tar.gz
.....(略).....最後建立一個 procmail-3.22 的目錄

2. 直接給他安裝!
[root@test src]# cd procmail-3.22
[root@test procmail-3.22]#  make install
[root@test procmail-3.22]#  which procmail
/usr/bin/procmail

 
這樣就大功告成了!接下來準備安裝 Sendmail 囉!
 
0. 首先將原有的 sendmail 資料備份例如 /etc/mail 目錄底下的檔案!
  並且,必需要確定有安裝 Berkeley DB 等相關的函式庫!這是 makemap 要用的喔!
[root@test root]# mv /etc/mail /etc/mail.old
# 請注意!如果您使用的 Linux Distribution 並非為 sendmail ,那麼上面的
# 目錄可能不會存在!請詳細的參考您的主機上面的說明喔!

[root@test root]# locate libdb.so
/lib/libdb.so
# 這個檔案請『務必存在!』可能是 libdb.so 或 libdb.a 的形式!
# 這個檔案是 Berkeley 資料庫的主要函式庫,這是用來做為 makemap 
# 的一些資料庫格式所必需要的函式庫,如果你的系統不存在,那麼請
# 拿出你的原版光碟片來安裝!通常這個套件的檔名應該是 db3-devel.....
# 或者是 libdb3..... 的檔案名稱!請以 RPM 來安裝吧!
# 基本上,反正你的光碟片上(不管幾片,全部拿出來喔!)所有
# 檔名為 db#### 及 libdb### 的檔案都裝上去就對了!
# 至於相關的屬性相依問題,請參考 RPM 與 Tarball 的安裝一文。

[root@test root]# locate libwrap
/usr/lib/libwrap.a
# 這個檔案與等一下我們要建立的 TCP_Wrappers 的支援有關,
# 請確定他的存在喔!如果不存在的話,而你的系統又是 MDK 9.0 時,
# 可以拿出第三片來安裝 tcp_wrappers-devel..... 那個 RPM 檔案,
# 如果是其他的 distribution 同時又找不到 libwrap.a 時,
# 那底下 site.config.m4 裡面的 -DTCPWRAPPERS 及 -lwrap 都拿掉!
# 不要支援也沒有關係!

1. 將 sendmail 解壓縮,假設您下載的資料在 /root 底下
[root@test root]# cd /usr/local/src
[root@test src]# tar -zxvf /root/sendmail.8.12.7.tar.gz
.....(略).....會建立一個名為 sendmail-8.12.7 的目錄

2. 建立 sendmail 所需要的 Cyrus SASL 支援之設定項目:
[root@test src]# cd /usr/local/src/sendmail-8.12.7/devtools/Site
[root@test Site]# vi site.config.m4
PREPENDDEF(`confMAPDEF', `-DMAP_REGEX')
APPENDDEF(`confENVDEF', `-DTCPWRAPPERS -DSASL=2')
APPENDDEF(`conf_sendmail_LIBS', `-lwrap -lsasl2')
APPENDDEF(`confLIBDIRS', `-L/usr/local/cyrus-sasl2/lib')
APPENDDEF(`confINCDIRS', `-I/usr/local/cyrus-sasl2/include')
define(`confMANROOT', `/usr/share/man/man')
# 這個 site.config.m4 是 sendmail 在編譯的時候會主動去讀取的主機自行設定檔。
# 上面這六行是需要自行建立的!請特別注意, cyrus sasl 的 2.x 與 1.5 版
# 在安裝與設定上是不一樣的!所以這裡請特別留意喔!不要搞錯了!
# 第一行:上面第一行與一些正規表示法有點關係,可加可不加!
# 第二行:第二行在設定支援的模式,我們支援了 TCP_Wrappers 及 SASL 身份認證!
#     關於 TCP_Wrappers 請參考前面『簡易防火牆』的說明吧!
#     至於 -DSASL=2 則是 SASL 第二版的格式!
# 第三行:第三行與第二行有點關係,使用 TCP 時需要用到 libwrap.a 這個檔案,
#     那就是 lwrap 這個標誌!至於 -lsasl2 就是 libsasl2.so 那個檔案啦!
# 第四行與第五行:這兩行 /usr/local/cyrus-sasl2 指的是我的 SASL 的資料庫所在目錄
# 如果你不是安裝在這個目錄的話,請依照您剛剛在建立 cyrus sasl 下達的 
# --prefix=/你的/目錄 來填寫喔!還有其他相關的說明,請參考您主機內的
# /usr/local/src/sendmail-8.12.7/sendmail/README
# 請注意,如果您確定可以支援 TCP_Wrappers 之後,那麼你就可以在
# /etc/hosts.deny, /etc/hosts.allow 以底下的樣式來抵擋 IP 或主機名稱
sendmail: 192.168.0.0/255.255.255.0 :Allow 
sendmail: 192.168.0.100: deny
# 更多的 TCP_Wrappers 資訊請參考『認識網路安全

3. 開始編譯 sendmail 囉與新增 sendmail 管理員 smmsp 
[root@test Site]# cd /usr/local/src/sendmail-8.12.7/sendmail
[root@test sendmail]# sh Build -c
......(略).....會花很多時間喔!
[root@test sendmail]# groupadd -g 40 smmsp 
[root@test sendmail]# useradd -M -g smmsp -u 40 -d /var/spool/clientmqueue  \
-s /dev/null smmsp 
[root@test sendmail]# mkdir -p /var/spool/clientmqueue
[root@test sendmail]# chown -R smmsp:smmsp /var/spool/clientmqueue 
[root@test sendmail]# chmod -R 770 /var/spool/clientmqueue 
# 新增一個使用者,他無法登入,ID 是 40 號! 這個使用者的家目錄是 /var/spool/clientmqueue 
# 主要僅用於郵件的收受與傳遞!增加這個使用者是 sendmail 8.12 板後新增的功能!
# 主要的目的在於提供更安全的 sendmail 使用環境! 

4. 設定 macro 檔案
[root @test sendmail]# cd /usr/local/src/sendmail-8.12.7/cf/cf
[root @test cf]# vi sendmail.mc
# 這個檔案的內容是你必需要建立的!如果你要跟我一樣的話,就用底下的設定吧!
divert(-1)
dnl ================================================================================
dnl     This file is modified from Red Hat 7.2's redhat.mc file.  VBird 2003/02/20
dnl     The functions of sendmail are as following
dnl            dnl                     ==> Just mark, such as # in shell scripts
dnl             VERSIONID               ==> The version of sendmail and vender
dnl             OSTYPE                  ==> The Operation System type
dnl             define                  ==> difine some usefull functions
dnl             FEATURE                 ==> some functions and files' location !
dnl             other settings          ==> Other settings.
dnl             MAILER                  ==> mail protocol and featurs.
dnl
dnl     The following is the command to macro the *.mc to *.cf !
dnl
dnl             sh Build sendmail.cf
dnl             cp sendmailcf /etc/mail
dnl
dnl ======1. Some informations =====================================================
include(`../m4/cf.m4')
VERSIONID(`Sendmail for Linux using Mandrake 9.0')
OSTYPE(`linux')
define(`confDEF_USER_ID',``8:12'')

dnl ======2. Some settings =========================================================
define(`confTO_CONNECT', `1m')dnl The timeout waiting for an initial connect (1 minute here)
define(`confTRY_NULL_MX_LIST',true)dnl If this host is the best MX for a host and other arrangements haven't been made, try connecting to the host directly; normally this would be a config error.
define(`confDONT_PROBE_INTERFACES',true)dnl About /etc/mail/mailertables !
define(`ALIAS_FILE', `/etc/mail/aliases')dnl About username aliases
define(`STATUS_FILE', `/etc/mail/statistics')dnl
define(`UUCP_MAILER_MAX', `2000000')dnl
define(`confUSERDB_SPEC', `/etc/mail/userdb.db')dnl
define(`confPRIVACY_FLAGS', `authwarnings,novrfy,noexpn,restrictqrun')dnl

dnl ======3. About some other important settings ===================================
define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl About procmail settings
define(`confAUTH_OPTIONS', `A')dnl The following three lines are about SASL settings
TRUST_AUTH_MECH(`LOGIN PLAIN')
define(`confAUTH_MECHANISMS', `LOGIN PLAIN')

dnl ======4. important settings here! ==============================================
FEATURE(`no_default_msa',`dnl')dnl Don't generate the default MSA daemon,
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl This must be set because the up line
FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl
FEATURE(redirect)dnl About Redirect the address to another one mail server !
FEATURE(always_add_domain)dnl
FEATURE(use_cw_file)dnl useing /etc/mail/local-host-names
FEATURE(use_ct_file)dnl useing /etc/mail/trusted-users
FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')dnl about procmail
FEATURE(`access_db',`hash -T<TMPF> -o /etc/mail/access.db')dnl
FEATURE(`blacklist_recipients')dnl
EXPOSED_USER(`root')dnl
FEATURE(`accept_unresolvable_domains')dnl

dnl ======5. About ORDB deny the open relay mail servers ===========================
FEATURE(`dnsbl', `relays.ordb.org', `"Email blocked using ORDB.org - see <http://ORDB.org/lookup/?host="$&{client_addr}">"')

dnl ======6. MAILER settings here ==================================================
MAILER(smtp)dnl
MAILER(procmail)dnl
Cwlocalhost.localdomain
# 重點是上面四行粗體字喔!特別留意了!

5. 開始給他製作 sendmail.cf 這個檔案囉!
[root@test cf]# sh Build sendmail.cf <==這個在製作 sendmail.cf 這個檔案
[root@test cf]# mkdir -p /etc/mail
[root@test cf]# sh Build install-cf 
# 這個在安裝 sendmail.cf 到 /etc/mail 底下去!

6. 開始安裝 sendmail 主程式,以及其他相關的程式,例如 makemap 等等的!
[root@test cf]# cd /usr/local/src/sendmail-8.12.7/sendmail/
[root@test sendmail]# sh Build install
[root@test sendmail]# cd ../makemap
[root@test makemap]# sh Build install
[root@test makemap]# cd ../mailstats
[root@test mailstats]# sh Build install

7. 其他檔案的建立與修訂!
[root@test sendmail]# cd /etc/mail
[root@test mail]# echo 'test.adsldns.org' >> local-host-names
# 這裡請輸入你的主機名稱
[root@test mail]# echo 'localhost    RELAY'  >> access
[root@test mail]# makemap hash access < access
[root@test mail]# touch domaintable
[root@test mail]# makemap hash domaintable < domaintable
[root@test mail]# touch mailertable
[root@test mail]# makemap hash mailertable < mailertable
[root@test mail]# touch trusted-users
[root@test mail]# touch virtusertable
[root@test mail]# makemap hash virtusertable < virtusertable
[root@test mail]# mkdir -p /var/spool/mqueue
[root@test mail]# chown root:wheel /var/spool/mqueue/
[root@test mail]# chmod 700 /var/spool/mqueue
[root@test mail]# touch aliases
[root@test mail]# sendmail -v -bi
/etc/mail/aliases: 0 aliases, longest 0 bytes, 0 bytes total
# 若是出現上面的字樣的話(不一定是這樣的!但反正就是不會顯示錯誤訊息就是了!)
# 就表示您的 sendmail 應該已經『沒問題啦!』
[root@test mail]# sendmail -bd -q30m   <==啟動 sendmail 看看吧!
[root@test mail]# telnet localhost 25 <==試看看連的上嗎?!
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 test.adsldns.org ESMTP Sendmail 8.12.7/8.12.7; Tue, 18 Feb 2003 21:56:00 +0800
ehlo localhost   <==這裡輸入測試列!
250-test.adsldns.org Hello localhost.localdomain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN
250-DELIVERBY
250 HELP
quit  <==這裡輸入離開字樣!
221 2.0.0 test.adsldns.org closing connection
Connection closed by foreign host.
# 如果看到出現上面的那行黃色加粗字體,呵呵!那就是 OK 啦!

 
上面的 site.config.m4 及 sendmail.mc 可以在鳥哥的網站上面下載喔(http://linux.vbird.org/download/index.php#sendmail_sendmail)!免得打錯字.....基本上, Tarball 的安裝方式有點麻煩,此外,又容易發生問題,所以,除非必要,否則建議還是使用原本 Linux distribution 所提供的 RPM 或者其他的套件管理員的方式來安裝吧!此外,關於 aliases 與啟動 sendmail 的 script 也可以在上面的相關連結下載喔!安裝方式中,需要注意的是在您下載完畢之後,請:
  1. Procmail 如果本機上面已經安裝了,不需要重新移除後再安裝!直接使用本機原有的即可!
  2. 依照上面的方法安裝所有的套件;
  3. 將 aliases 放置在 /etc/mail 底下;
  4. 將 procmailrc 放置在 /etc/ 底下;
  5. 在 /etc/logrotate.d 增加 procmail 的 logrotate 資料;
  6. 將 sendmail 放置在 /etc/rc.d/init.d/ 底下
  7. 在 /etc/rc.d/rc.local/ 最底下新增一行即可開機時啟動:

  8. /etc/rc.d/init.d/sendmail start
這樣就已經安裝好整個 Sendmail 囉!設定上是很容易啦!不過,維護上面可就要多費心囉!

其他應用說明:
上面的 Sendmail 說明,如果您都已經詳細的參詳之後,應該對於你的 Mail Server 管理的能力具有蠻強的認知了!不過,系統管理員無時無刻總是會遇到突發狀況的!所以,這裡我們來聊一聊一些可能會發生在你我身上的 Mail Server 可能會遇到的問題吧!

無法寄信時的可能問題說明與解決之道
 
雖然 Mail 很方便,但是仍然會有無法將信件寄出的時候!如果您已經設定好 Sendmail 了,但是總是無法將郵件寄出去,那可能是什麼問題呢?
  1. 關於硬體配備:無論任何情況之下,如果硬體出問題,那麼所有的服務都將不正常啦!所以,請先檢查您的硬體是否『怪怪的!』這個先確認 OK 吧!
  2. 關於網路參數的問題:如果連不上 Internet ,那麼哪裡來的 Mail Server 呢?所以請先確認你的網路已經正常的啟用了!關於網路的確認問題,請查閱前幾篇『Linux 網路偵錯』的內容介紹;
  3. 關於服務的問題:請務必確認 port 25 與 port 110 已經正確的啟動了!使用 netstat 指令即可瞭解是否已經啟動該服務!
  4. 關於防火牆的問題:很多時候,很多朋友使用 Red Hat 或者其他 Linux distribution 提供的防火牆設定軟體,結果忘了啟動 port 25 與 port 110 的設定,導致無法收發信件!請特別留意這個問題喔!可以使用 iptables ( 核心為 2.4.xx 版本 )  或者是 ipchains ( 核心為 2.2.xx 版本 ) 來檢查是否已經啟用該 port 呢!其餘請參考簡易防火牆設定那一章喔!
  5. 關於 TCP_Wrappers 的問題:如果你的 sendmail 還有支援 tcpd 這個程式 (或者說是 libwrap 這個函式庫 ) 的話,那麼在 /etc/hosts.allow 與 /etc/hosts.deny 的設定也會影響到收發信件的正常與否!如果 /etc/hosts.deny 有設定『ALL: ALL』的話,那麼請務必在 /etc/hosts.allow 裡面加設『 sendmail:  ALL 』喔!
  6. 關於設定檔的問題:在 sendmail 8.11 版本中,僅有 sendmail.cf 這個設定檔,但是在 8.12 當中多了個 submit.cf 這個寄信功能檔案,請務必確定您的 *.mc 設定是正確的!說說鳥哥的經驗,有一次在測試的時候,一直發信無法將信件寄出去!明明 sendmail.mc 都沒有什麼問題,就是 local 無法寄信!後來才發現,因為我更動過 submit.mc 這個檔案,重新以 m4 跑過之後,忘記將他給改回來了!結果花了我兩天的時間在搞 sendmail.mc ....所以,在作任何一步動作的時候,請千萬記住『作筆記』或者『將動作記下來!』
  7. 關於檔案權限的問題:一般來說,如果以 RPM 安裝 sendmail 會比較沒有問題,而如果以 Sendmail 8.12 以後版本手動安裝的話,那由於 sendmail 對於安全的要求越來越嚴格,所以你必須針對每個目錄或檔案進行檢查才行!通常檢查的目錄為:
  8. 關於使用者的設定問題:一般而言,如果使用者不登入 sendmail 主機進行寄信的動作( local mailer ),那麼 /etc/passwd 裡面的設定就無關緊要了!不過,如果該使用者想要在 sendmail 本機上面使用 mail 的功能,那麼在 8.12 版本當中,您就必須要:
  9. 其他檔案的設定問題:
  10. 其他可能的問題:最常發生的就是認證的問題了!這是由於使用者沒有在 MUA 上面設定『我的郵件需要認證』的選項啦!請叫你的 client 端用戶趕緊勾選吧!
  11. 還是不知道問題的解決方案:一般而言,上面的幾個訊息應該可以提供您校正 sendmail 的問題了,不過,如果還是查不出問題的話,那麼請務必檢查您的 /var/log/maillog (有的時候是 /var/log/mail ,這個要看 /etc/syslog.conf 的設定 ),當你寄出一封信的時候,例如 vbird 寄給 bird2@tsai.adsldns.org 時,那麼 maillog 檔案裡面會顯示出兩行,一行為 from vbird一行為 to bird2@tsai.adsldns.org,也就是『我由哪裡收到信,而這封信會寄到哪裡去!』的意思,由這兩行就可以瞭解問題了!尤其是 to 的那一行,裡面包含了相當多的有用資訊,包括郵件無法傳送的錯誤原因的紀錄!如果您對於登錄檔不熟,請拿出『鳥哥的 Linux 私房菜 -- 基礎學習篇』裡面的『認識登錄檔』一文吧!(註:這就是鳥哥為什麼老是希望大家能夠先看完基礎篇的原因,太重要了!)

關於備份
 
不管什麼時候,備份總是重要的!那麼如果我是單純的 Mail Server 而已,我需要的備份資料有哪些呢?
  1. /etc/procmailrc 這個檔案;
  2. /etc/passwd, /etc/shadow, /etc/group 等與帳號有關的資料;
  3. /etc/mail 底下的所有檔案資料;
  4. /etc/sendmailcf 或者 /etc/aliases 等等 sendmail 相關檔案(因為可能不放在 /etc/mail 當中! )
  5. /home 底下的所有使用者資料;
  6. /var/spool/mail 底下的檔案與 /var/spool/mqueue 郵件佇列檔案;
  7. 如果是 Sendmail 8.12 則可以考慮儲存 /var/spool/clientmqueue。
如果真的僅要備份這些資料的話,我可以寫一支程式讓他每週備份一次喔!假設該程式可以放置在 /usr/local/backup/backup.sh 這裡,並且備份的資料也都放置在此!當然,可以的話,應該是要放置在另一顆硬碟,甚至是另一個儲存裝置,例如 tape 等等比較好的啦!底下提供一個程式範例囉:
 
#!/bin/bash
# 這支程式可以用來備份 mail server 的帳號資料喔!
# 撰寫者 VBird 2003/02/24

# 0. 設定目錄與相關的變數:
dir=/usr/local/backup
[ -z "$dir" ] || mkdir -p "$dir"
[ -f "$dir" ] && echo "$dir exist, but is not a directory, stop here" && exit

# 開始備份一些檔案:
cp -a /etc/passwd   $dir
cp -a /etc/shadow   $dir
cp -a /etc/group    $dir
[ -z /etc/procmailrc ]  && cp -a /etc/procmailrc $dir
[ -z /etc/sendmail.cf ] && cp -a /etc/sendmail.cf $dir
[ -z /etc/aliases ]     && cp -a /etc/aliases

# 開始備份目錄:
tar -zcvf $dir/home.tar.gz     /home
tar -zcvf $dir/etcmail.tar.gz  /etc/mail
tar -zcvf $dir/varmail.tar.gz  /var/spool/mail
tar -zcvf $dir/mqueue.tar.gz   /var/spool/mqueue
[-z /var/spool/clientmqueue ] &&  \
tar -zcvf $dir/clientmqueue.tar.gz /var/spool/clientmqueue

 
你可以在網站下載(http://linux.vbird.org/download)然後將這支程式改變一下屬性『chmod 755 backup.sh』之後,放到 crontab 裡面去執行就可以啦!
 

關於 quota 的設定與 /var/spool/mail 目錄的轉移
 
網路上有很多『免費的電子郵件信箱』空間,一般而言,使用的就是 quota 這個磁碟配額工具!因為我們的 Linux 主機硬碟空間就是這麼多!當然囉,使用磁碟配額 (quota) 會是一個對大家比較公平的方法!使用 quota 的技巧已經在『鳥哥的 Linux 私房菜 -- 基礎學習篇』裡面介紹過了,這裡不再重複介紹,要介紹的是幾個可能會發生在實際的案例中的一些小技巧:

本章與 LPI 的關係
在 LPI 網站 http://www.lpi.org 裡面提到的,關於 Sendmail 的考試題庫的地方,只有在 LPI level 1 的 102 ,裡面的 topic 113 Networking Services ,第二點當中,簡易的 Sendmail 設定。強調的是『應試者必須簡單的設定 sendmail (指的應該是 m4 scripts ,不過會很簡單!不要擔心∼)、能夠建立 mail aliases 、能夠管理郵件佇列、能夠啟動或者是關閉 sendmail 這個服務、瞭解使用者的郵件轉遞 ( forward 功能 ),以及簡單的 sendmail 除錯!此外,應試者也需要瞭解什麼是 Open Relay 與避免 Open Relay 才行!』至於會考的檔案與指令可能有這些:

參考資源:
本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )
簡易 Mail Server 架設 -- Sendmail 設定

2003/02/24:第一次完成
2003/02/25:根據小州與網中人兄的建議,修改一些 Sendmail 相關的說明與內容,建議的內容請參考這裡
2003/02/28:加入使用 IP 寄信的方法!
2003/03/01:增加 Tarball 安裝時,TCP_Wrappers 的支援!
2003/03/14:增加 mailstats 的說明!
2003/09/12:修改了 procmailrc 的內容、整個版面稍微修訂,以及內容的稍微校稿!

2003/02/24以來統計人數