伺服器架設篇 - RedHat 9

第二十章、簡易 Mail Server 架設 -- Sendmail 設定

郵件主機之簡易設定、使用 Sendmail 郵件伺服器之設定

最近更新時間: 2003/09/12

本文資料主要針對 RedHat 9 的系統進行說明,要注意的是,RedHat 9 與 Red Hat Enterprise Linux (RHEL) 是完全不同的東西!RedHat 9 在 2003 年推出,在 2004 年就不再維護了!這部份網站更新到 2005 年,也沒有再維護過! 因此,建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 RedHat 9 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!
在這個郵件伺服器的架設中,我們首先談論 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 這個套件,那麼,這篇文章仍然相當的適合您查閱!

前言:

電子郵件帶來的好處:
在目前的社會當中,沒有電子郵件 ( 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 ( Mail User Agent ):顧名思義, MUA 就是『郵件使用者代理人』,華特(what)?郵件還需要代理人,怎麼回事呢?喔!這是由於通常我們 Client 端的電腦都無法直接寄信的(不然幹嘛要郵件主機?),所以,需要透過 MUA 來幫我們傳達信件,不論是送信還是收信,Client 端的用戶都需要透過各個作業系統提供的 MUA 才能夠使用郵件系統。舉個例子來說, Windows 裡面的 OutLook Express, Netscape 裡面的 mail 功能與 KDE 裡面的 Kmail 都是 MUA 啦! MUA 主要的功能就是收受郵件主機的電子郵件,以及提供使用者瀏覽與編寫郵件的功能!
  • MTA ( Mail Transfer Agent ) : MUA 是用在 Client 端上面的軟體,那麼這個 MTA 就是用在郵件主機上面的軟體啦!他也是主要的郵件伺服器喔!這個 MTA 就是『郵件傳送代理人』的意思。也來顧名思義一下,既然是『傳送代理人』,那麼使用者寄出的信,與使用者要收信時,就是找他 ( MTA ) 就對啦!因為他要負責幫我們使用者傳送嘛!沒錯!基本上, MTA 的功能有這些:

  •  
    1. 收受外部主機寄來的信件:既然是郵件主機,那麼『接收信件』想必就是主要的功能囉!呵呵,答對了!所以囉, MTA 最主要的功能就是收受外部來的信件,只要這個信件裡面有 MTA 內部的帳號時,那麼這封信就會被 MTA 收下來;
    2. 幫使用者傳送 ( 寄出 ) 信件:既然可以收信,那麼自然也就可以發信囉!沒錯啦!只要使用者具有合法的使用 MTA 的權力,那麼該使用者就可以利用這部 MTA 將他把信傳送出去!不過需要注意的是, MTA 會將信件送給目的地的 MTA 而不是目的地的 MUA 喔!不要搞錯了!(註:曾經有個朋友跟我說,要我傳資料給他,而因為他要接收我的信件,所以他的電腦 "指的是 Windows 那個 Client 端的電腦" 得一直開著,真是不方便!聽到這句話時,害我嚇了一跳~這個觀念是不對的~因為使用者使用的是 MUA ,而信件『僅會送達到 MTA 主機上面』而已,收、發信件時,都需要透過 MTA 來幫忙處理的!所以,使用者在使用郵件編輯器"MUA"將資料編輯完畢之後,按下送出,並且成功的送到 MTA 之後,接下來的事情就是 MTA 的工作了,跟使用者的 Client 端這部電腦 "一點關係也沒有了" )
    3. 讓使用者自己的信可以收回去:使用者可以將放置在郵件主機的信件收到自己的個人電腦上面收看。
     
    大致的功能就是這些啦!通常我們所說的 Mail server ( 郵件伺服器 ) 就是指 MTA 而言的!
  • MDA ( Mail Delivery Agent ) : 『郵件遞送代理人』主要的功能就是將 MTA 所收受的信件,依照信件的流向 ( 送到哪裡去 ) 來將該信件放置到本機帳戶下的郵件檔案中 ( Mailbox )!或者是再經由 MTA 將這個信件送到下個 MTA 去!而如果信件的流向是到本機當中時,這個郵件代理人的功能可不止是將由 MTA 傳來的郵件放置到每個使用者的 Mailbox 而已,他還可以具有郵件分析 ( filtering ) 與其他相關的功能呢!這個功能很了不起喔!怎麼說呢?具兩個例子來說好了:

  •  
    1. 如果你知道某個廣告信件的主旨都是固定的,例如『AV情色XXX』,你想將這種信件直接給他丟掉垃圾桶,可以嗎?當然可以囉!透過 MDA 郵件分析的功能,就可以將信件丟棄啦!
    2. 如果有一天你要出差去,看樣子可能一個星期碰不到電子郵件了,但是你又不想讓一些朋友認為你在耍大牌都不回信的....這個時候你就可以利用 MDA 的功能,讓郵件主機分析到,當要送給你這個使用者的帳號的信出現時,就自動回覆一封回信,讓寄件者知道你在忙碌中....呵呵!這樣的功能是否很不錯呢?還不止這樣喔!其他的等一下後面再提吧!
  • Mailbox :『郵件信箱』說穿了,就是在你主機上面的一個目錄下的,某個人『專用』的信件收受檔案啦!舉個例子來說,系統管理員 root ,在預設的情況下,他會有個信箱,預設的檔案是在 /var/spool/mail/root 這個檔案就是了,一個帳號都會有一個自己的信箱喔!然後,當 MTA 收到 root 的信時,就會將該封信件存到 /var/spool/mail/root 這個檔案中囉!使用者可以透過程式來將這個檔案裡面的信件資料讀取回去喔!
好了,瞭解了 MUA, MTA 與 MDA 之後,再來說到那麼如何將信寄出去呢?可以分為底下幾個步驟:
  1. Step 1 使用者利用 MUA 寄信到 MTA 上面:通常我們使用 MUA ( 例如 Outlook express ) 寫信的時候,你總是要定義出幾個咚咚:
    • 發信人與發信網站:對啦,總是要有這個資訊才行的嘛!這個發信網站就是等一下 Step 2 接收信件的那個 MTA 啦;
    • 收信人與收信網站:是的,就是 account@e-mai.server 的樣式啦!那個 account 就是該 e-mail.server 裡面的帳號啦!
    好了,你在圖一左上角的那部機器上面,也就是『本地端用戶使用電腦』利用 MUA 的功能 ( 例如 Outlook express 好了 ) 寫好了信之後,按下 MUA 的那個『傳送』的按鍵,MUA 就會依據你所定義的主機位址將信發送到 MTA 上面;
     
  2. Step 2 MTA 收到自己的信件,交由 MDA 發送到該帳號的 MailBox 當中:如果在 Step 1 所收到的信件中,那個 e-mail.server 就是 MTA 自己,此時 MTA 會將該信件交由 MDA 去處理,將信件放置在收進者的信箱中;

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

  5.  
  6. 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 之後,接下來,我們得瞭解一下在郵件伺服器架設之前,您需要先進行什麼樣的工作呢?
  • 若想要架設的郵件主機未來是對 Internet 提供服務的,那麼請確定您已經申請了『主機名稱』或者已經具備有『經過合法授權的 DNS 主機』的服務了!重要的地方在於你的主機必須能夠讓大家在 Internet 上面查詢的到啊!
  • 雖然有 A 這個 DNS 的標誌就可以架設 Mail server ,不過,畢竟有 MX 標誌還是比較好的,所以,特別提醒大家,如果要架設 Mail Server ,最好(非必要)還是請您的上層 DNS 主機幫您設定 MX 標誌,或者,您自己擁有 DNS 主機管理權時,可以自行設定 MX 這個標號才好!
好了,既然是玩 Sendmail ,那麼就得瞭解一下 sendmail 的相關檔案與說明囉!
 

Sendmail Server 的檔案架構與基礎說明
 
Sendmail 幾乎所有的設定檔都安置在 /etc/mail 底下,不過,如果你是以 RPM 安裝的話,那麼還有所謂的 sendmail-cf 的設定檔,這個就是使用 M4 在進行 sendmail.cf 設定的程式!由於 Sendmail Server 所使用到的套件並不少,這包括有 sendmail, imap 以及 m4 等等,我們針對這些套件來談一談每個目錄與檔案下的資料吧!
  • 設定檔

  • Sendmail 的設定檔幾乎全部都在 /etc/mail 底下,但是也不一定!因為還需要看當初你建立 sendmail.cf 這個主要設定檔時,將各個檔案放置的地點而定!這部份可以使用 RPM 的方式來反查出你的設定檔案的路徑。Sendmail 與相關套件的設定檔與相關的說明為:
     
    • /etc/mail/sendmail.cf 或 /etc/sendmail.cf:這個就是 sendmail 的主要設定檔,所有的參數都是他在管理的!但是,這個檔案內的各個設定被號稱為『天書』,所謂的天書就是『非一般人看的懂得!』,就連 sendmai 官方網站自行開發出來的設定程式也都『告誡大家不要手動編輯這個檔案』,所以這裡我們也不談這個檔案的內容啦!但是既然這個是主要設定檔,那麼又不要讓大家手動編輯,那我要怎樣進行 sendmail 設定的修改呢?這個時候就需要使用到 M4 這個指令了! m4 可以將簡單的一些環境設定參數,重新以內定的函式庫或者函式定義來『製作』 sendmail.cf 這個設定檔呢!sendmail 預設的 sendmail.cf 放置在 /etc/mail/sendmail.cf ,但是某些 Linux distributions 則將他改放在 /etc/sendmail.cf 這裡~
     
    • /usr/share/sendmail-cf/cf/xxxx.m4 :剛剛我們提過那個 sendmail.cf 對吧!而由於這個檔案最好不要手動修改,所以需要使用到 m4 這支程式。 m4 可以將一個簡單的環境設定檔轉成 sendmail.cf ,那個環境設定檔就是 sendmail-cf 這個套件所提供的啦。在 Red Hat 7.x 的系統中,主要的環境設定檔就是 /usr/share/sendmail-cf/cf/redhat.mc 這個檔案喔!不過,在 Red Hat 7.3 以後的所有 Red Hat Linux 版本當中,這個檔案被移動到 /etc/mail/sendmail.mc 了!至於其他的 Linux 版本則請參考你的 sendmail-cf 套件的內容!
     
    • /etc/mail/local-host-names :這個檔案主要用來處理一個主機同時擁有多個主機名稱時候的收發信件主機名稱問題。這個檔案的用途可大了!當你的主機擁有多個 HOSTNAME 的時候,例如我的主機擁有三、四個主機名稱,那麼是否每個名稱都可以用來做為收受信件的主機名稱 ( To: .. ) 呢?並非如此!如果你的主機名稱為 test1.your.domain 以及 test2.your.domain ,而且這兩個 hostname 您都希望可以用在收受電子郵件,果真如此,那麼,你就必需將這兩個名字都寫入 local-host-names 這個檔案當中,一個主機名字佔用一行。注意:沒有寫入這個檔案的『你的主機名稱』,那信件將無法正確的寄達這部主機喔~例如:www.vbird.adsldns.org、vbird.adsldns.org這兩個主機名稱的 ip 都是相同的,也就是指向同一台機器上。假設這台主機名稱預設為 vbird.adsldns.org,那在預設情況下,寄給 userid@vbird.adsldns.org 都是 ok 沒有問題的!但是寄給 userid@www.vbird.adsldns.org 就會出現錯誤。其中原因是因為沒有告訴 MTA 除了 vbird.adsldns.org 這個主機名稱外,還有 www.vbird.adsldns.org 也是指向這台主機上。所以寄給 userid@www.vbird.adsldns.org 會出現錯誤,通常就是 mail loop to me,要不然就是不允許 relay 的錯誤情況。
     
    • /etc/mail/access.db :這個是『規定誰可以或不可以使用本郵件伺服器的資料庫』,要轉成這個資料庫需要藉由 makemap 以及 /etc/mail/access 檔案的配合!這個檔案可以說是 Sendmail 裡面最重要的『使用者權限管理』的資料了!在後面我們會繼續說明。
     
    • /etc/mail/aliases.db 或 /etc/aliases.db :這個 aliases.db 是用來設定『信箱別名』的一個咚咚!你可以藉由這個檔案的設定來規範你的『群組收信』喔!不過,還需要藉由 aliases 及 newaliases 來做成這個檔案才行!
     
    • /etc/mail/statistics :這個檔案在記錄 Sendmail 收發信件的相關資訊喔!
  • 執行檔

  • Sendmail 的執行檔也不少,得說一說:
     
    • /usr/sbin/sendmail:就是 sendmail 的主要執行檔啦!他會讀取 sendmail.cf 這個檔案的設定內容喔。你在發送信件時,就是使用這支程式啦!啟用這支程式之後,預設的啟用的 port 是 25 咯。
     
    • /usr/sbin/ipop3d:sendmail 的功能是在處理寄信問題,而 ipop3d 就是處理 client 的收信問題啦!如果你的 Mail Server 希望提供用戶端使用 Netscape 或 OutLook express 來收信,那麼就需要提供這個服務才行!這個服務的設定檔在 Red Hat 當中是在 /etc/xinetd.d/ipop3 ,如果是 Open Linux server 3.1.1 的話,那就會變成在 /etc/inet.d/imap 這個檔案中。注意: pop3 是由 imap 套件所提供的,並沒有包含在 sendmail 套件之中喔!
     
    • /usr/sbin/makemap:主要將 access 轉成 access.db 的資料庫製作的執行檔;
     
    • /usr/sbin/mailstats:將 /etc/mail/statistics 檔案讀出來的一支程式!可以查看到目前為止 Sendmail 工作共傳送、接收多少郵件囉!
     
    • /usr/bin/newaliases:將 /etc/mail/aliases 轉成 /etc/mail/aliases.db 的執行檔!
     
    • /usr/bin/mailq:用來觀察 /var/spool/mqueue 這個郵件暫存目錄的資料情況的指令!
     
    • /usr/bin/m4:這個就是將 *.mc 檔案轉成 *.cf 檔案的主要執行檔囉!需要搭配 sendmail 原始碼,或者是 sendmail-cf 這個套件才行!注意: m4 是也需要額外的安裝的一個套件喔!sendmail 原本套件中並未包含 m4 這個套件!
  • 郵件相關目錄

  • sendmail 接收下來的郵件放置在哪裡呢?
     
    • /var/spool/mail :這個是郵件『收受下來之後,每個使用者信件放置的目錄』,一個帳號會使用掉一個檔案,例如你的帳號為 test ,那麼你的信在 Server 中時,就是 /var/spool/mail/test 這個檔案了!此外,你的 POP3 的協定亦是使用這個目錄中的 mailbox 做為預設的郵件取得的檔案資料。
     
    • /var/spool/mqueue:當郵件由於對方主機的問題,或者是網路的問題,而無法送出去時,那麼該封郵件將會暫時的存放在這個目錄下,然後主機會每隔大約 30 ~ 60 分鐘重新嘗試傳送一遍,通常設定在五天內該封信件還寄不出去,那就會退給原發信者了!
     
    • /var/spool/clientmqueue:這是新的 sendmail 8.12 版本才會出現的佇列目錄 (您如果想要以 tarball 安裝 sendmail 的話,請務必參考本章底下的說明,這個目錄的權限設定相當的重要喔!) 。
    大致上的檔案就是這樣啦!接下來談一下如何設定 sendmail 吧!

使用 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 的相關參數囉!

  • 建立 M4 參數檔:

  • m4 的參數檔通常檔名均取為 filename.mc 這樣的附檔名格式,你可以在 /usr/share/sendmail-cf/cf 裡面找到相當多的範例檔案喔!例如 Red Hat 的設定範例檔為 /usr/share/sendmail-cf/cf/redhat.mc (如果是 Red Hat 7.3 以後版本,含 Red Hat 9 ,這個檔案則放置在 /etc/mail/sendmail.mc 喔!)。這個環境參數設定檔的設定項目很多,其格式為:
       
      設定元件(`設定項目', `參數一', `參數二')
       
    仔細看到上面的例子當中,在設定的元件後面接上小括號,而小括號內則為該設定元件的項目內容,以及該項目內容的參數!而將設定項目與各參數包起來的『並不是單引號』,要注意的是,在『設定項目』左右兩邊的:
    1. 左邊的是 quod ,也就是鍵盤上面數字鍵 1 的左邊那個按鍵『`』;
    2. 右邊的才是單引號『'』。
    這裡很容易被搞錯!請特別注意,而每個設定項目與參數之間,則是以逗號『,』來做為分隔喔!底下我們談一談幾個主要的設定元件與各個設定元件底下的設定項目吧!
     
    • divert :這個元件僅是在於提供『是否要將說明資料(或者是註解資料)寫入輸出的檔案中』而已,如果在 filename.mc 檔案當中具有註解符號時,(注意, *.mc 的註解符號可以是 # 也可以是 dnl 這個字串!)而你輸出資料時不想將這些說明資料也輸出,那就可以使用 divert (-1) 。反之,如果你想將這些說明資料同時輸出,那就使用 divert (0)。由於我們不想要手動修改 sendmail.cf ,所以輸出的資料當然就不太需要註明啦!只要在環境設定檔 *.mc 裡面說明清楚即可!因此,你應該會常常在檔案當中看到 diver (-1) 才對!範例為:
      •  
        divert (-1)
     
    • OSTYPE:這個元件功能在設定使用的作業系統類別! Sendmail 預設提供數種作業系統的模式,你可以在 /usr/share/sendmail-cf/ostype 這個目錄當中找到所支援的作業系統模式。因為我們是使用 Linux ,所以範例為:

    •  
        OSTYPE(`linux')
         
    • define:這個元件的作用比較多喔!他可以定義出許多有用的 sendmail 需要的參數,舉個例子來說,如果我要將郵件別名設定檔放置在 /etc/aliases 底下,那麼我可以使用底下的範例:
      •  
        define(`ALIAS_FILE', `/etc/aliases')
         
      那個 ALIASE_FILE 就是主要的設定項目啦!而這個項目主要規定郵件者別名的檔案所在地,所以囉,後面就直接接上完整的檔案名稱啦!更多詳細的 define 說明,可以參考您電腦中的 /usr/share/sendmail-cf/README 這個檔案喔!
       
    • undefine:恰恰與 define 相反啦! Sendmail 預設會支援定義很多的項目,而如果您不需要定義該項目,則可以使用 undefine 來將他移除掉喔!例如:
      •  
        undefine(`UUCP_RELAY')
         
    • FEATURE:這個元件 FEATURE 字面上的意思是『特徵、特色』,那也就是說,這個元件裡面會規定出 sendmail 所額外新增的一些任務啦!這些任務的支援必需要 sendmail 有提供才可以!你可以在 /usr/share/sendmail-cf/feature 這個目錄當中找到 sendmail 所提供的各個功能喔!舉個例子來說,如果我們要規定 sendmail 存取權限設定的檔案,也就是 /etc/mail/access.db 時,你可以這樣寫:
      •  
        FEATURE(`access_db',`hash -o /etc/mail/access.db')
         
      注意:上面 access_db 是某個任務的項目,而後面接的 hash 是資料庫格式,至於 sendmail 所使用的資料庫則是 /etc/mail/access.db !更多的 FEATURE 相關設定項目可以參考 /usr/share/sendmail-cf/README
       
    • MAILER:這個元件在設定所使用的郵件主機傳送郵件(遞送, delivery)的代理人,一般而言,我們的代理人都是 smpt 協定啊,不過,如果我們主機內的用戶(主機 /etc/passwd 存在的實體用戶)想要使用 sendmail 來寄信,那是否仍然要透過 smtp 這個代理人呢?不太需要的, sendmail 本身就提供發信的功能,而要讓主機上面的實體用戶可以在登入主機環境的中使用 sendmail ,那你就必需要啟動 local 這個本地端的郵件遞送功能啦!因此,通常這個元件會設定為:
      •  
        MAILER(local)
        MAILER(smtp)
         
      如此一來,當 sendmail 發現信件來自於主機內部,那就會使用 local 來傳送信件,當信件來自於主機外部時,那才會使用 smpt 協定來寄信喔!未來還可以新增 procmail 這個 MDA 呢! sendmail 支援的 MAILER 可以在 /usr/share/sendmail-cf/mailer 這個目錄中查詢的到!
       
    各個設定元件我們先介紹到這裡,至於更詳細的說明,請務必到 /usr/share/sendmail-cf/README 這個檔案當中尋找!至於其他更完整與新鮮的 M4 設定項目,請到 http://www.sendmail.org/m4/readme.html 查詢喔!底下我們來聊一聊這個環境參數檔設定完畢之後(或者稱為 M4 scripts ),要怎樣來『製作』sendmail.cf 呢?
     

  • m4 程式的執行

  •  
    m4 程式在執行的時候,必需要先讀入相關的參數項目才行,這個參數項目在 /usr/share/sendmail-cf/m4/cf.m4 這個檔案當中,因此,如果你的 *.mc 檔案裡面沒有這一行:
       
      include(`/usr/share/sendmail-cf/m4/cf.m4')
       
    那麼你就必需要執行兩個檔案的 m4 轉換,否則只要執行一個即可!假設您的 m4 script 檔名為 redhat.mc ,那麼您可以這樣轉換 sendmail 所需要的 sendmail.cf :
     
    Red Hat 7.2 以前版本:
    1. 若 redhat.mc 裡面沒有 include 的項目,則:
    [root@test root]# cd /usr/share/sendmail-cf/cf
    [root@test cf]# m4 /usr/share/sendmail-cf/m4/cf.m4 \
    >  redhat.mc > redhat.cf
     
    2. 若 redhat.mc 裡面已經包含了 include 的項目,則:
    [root@test cf]# m4 redhat.mc > redhat.cf
      
    Red Hat 7.3 (含 Red Hat 9) 以後版本:
    1. 若 sendmail.mc 裡面沒有 include 的項目,則:
    [root@test root]# cd /etc/mail
    [root@test mail]# m4 /usr/share/sendmail-cf/m4/cf.m4 \
    >  sendmail.mc > redhat.cf
     
    2. 若 sendmail.mc 裡面已經包含了 include 的項目,則:
    [root@test mail]# m4 sendmail.mc > redhat.cf
     
    上面製作而成的 redhat.cf 就是 sendmail.cf 的內容啦!然後請將你的 sendmail.cf 備份,舉個例子來說, Red Hat 的 sendmail.cf 在 /etc/ 底下,所以我可以這樣做:
     
    [root@test cf]# mv /etc/sendmail.cf /etc/sendmail.cf.old
    [root@test cf]# cp redhat.cf  /etc/sendmail.cf
    # 若是 Red Hat 7.3 以後版本,則
    [root@test mail]# cp redhat.cf  /etc/mail/sendmail.cf
     
    這樣就成功啦!
     

  • 修改 Red Hat 7.x 以後版本 ( 含 Red Hat 9 )的設定檔:

  •  
    我們說過, Red Hat 7.x 以後版本的設定檔裡面已經將郵件來源的介面定義為『僅來自 127.0.0.1 這個介面』,所以我們必需要開放監聽的介面才行!請注意,這裡僅開放『監聽』而不是開放 Relay 喔!如果您使用 Red Hat 7.1/7.2 ,那麼請修改您的 /usr/share/sendmail-cf/cf/redhat.mc ,如果是 Red Hat 7.3 ,則修改 /etc/mail/sendmail.mc !我們這裡都以 sendmail.mc 為主來說明,如果您是使用 Red Hat 7.2 以前版本,請記得搜尋相關的檔案喔!至於非 Red Hat 系統,例如 Open Linux ,則可以略過這個步驟喔!
     
    1. 尋找檔案的內容
    [root@test root]# cd /etc/mail
    [root@test mail]# vi sendmail.mc
    找到下面這一段:
    DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
    將他改成
    DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')
    儲存後離開

    2. 重新製作檔案:
    [root@test mail]# m4 sendmail.mc > redhat.cf
    [root@test mail]# mv sendmail.cf sendmail.cf.old
    [root@test mail]# cp redhat.cf sendmail.cf

     
    這樣就大功告成囉!

啟動 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 主機想要支援我內部網域的所有電腦來寄信,而我內部網域的電腦 IP 網段為 192.168.0.0/24 這一段;
  • 還有,我另外有一個公共 IP ( Public IP )為 140.116.44.125 ,也想要讓他可以寄信;
  • 此外,我發現 192.168.1.100 電腦使用者都會亂寄垃圾給我的郵件主機,所以我想要擋掉他;
  • 那個 h8h.com 也有問題,我也要擋掉這個網域 (domain) 的來源;
  • 更發現有個使用者叫做 test@testing.domain.name 也是色情廣告信業者!
那麼我可以怎樣設定 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)範圍時,就可以指定底下這些動作:
  • RELAY:允許該來源主機所傳送過來的郵件可以被接受,然後再進行 Relay 的動作。以上面的範例為例,則 192.168.0.0/24 來源的電腦所發送來我們 Mail Server 的郵件將會被接受喔!
  • REJECT:若來源主機的主機名稱或 IP 在 REJECT 的情況下,則我們 Mail Server 將不會接受對方的郵件內容(就是 body 部分),『並且會回傳一個錯誤或警告訊息給原發信端』喔!
  • DISCARD:與 REJECT 相似,亦即關閉規定範圍內的電腦主機的 RELAY 功能,不過, Sendmail 會直接將該信件『丟棄』而不會『退回』!
通常我們比較建議使用 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 可是需要加入的吶!
  • 什麼是 Mailling list :我們剛剛在 aliases 裡面有進行過群組寄信對吧!那麼你寄給某個帳號時,該帳號會將你的來信再寄給該群組帳號的所有人員,此外,還可能將該封信件也備份一份在自己的機器上,這個功能就可以稱為是 Mailling list 啦!有點像是目前很流行的『電子報』之類的咚咚!也就是說,我們可以用這個很簡單的 aliases 這個檔案就可以達到 Mailling list 的功能了!

設定郵件轉遞 ~/.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
 
上面共出現七行,第一行只是顯示目前的時間而已,至於每個直列的意義為:
  • M     :只是一些郵件工作(Mailer)代號的標題啦!不過,重要的地方在第六行的 T ,那個是『Total 總和』的意思~
  • msgsfr:共有多少封信由這個郵件工作 ( mailer ) 所發出去的呢?以第四行最右邊看到的 local 為例,這表示由 local 發出的信件共有 21329 封的意思~
  • bytes_from:表示的是信件資料容量,同樣以第四行 local 為例,他發出的 21329 封信,共有 5919236K 喔!
  • megsto:與 msgsfr 類似,只是 msgsfr 是寄出資料,而 megsto 則是『收到的信件封數』以上面的資料來看,則 local 收到的共有 65162 封信!
  • bytes_to:這就不需要解釋了吧! ^_^
  • msgsrej:那個 rej 是 reject (拒絕) 的意思,這一列是信件被 deny 的次數;
  • msgsdis:那個 dis 是 discard 的意思,同樣是 deny ,只是經由 discard 的程序就是了!
  • Mailer :就是 sendmail 許多 mailers 當中的一個啦!那個 esmtp 主要用來對外,至於 local 則主要針對本機端的 mailbox 囉!
由上面的資料你會發現,哇!怎麼鳥哥的信箱 15GB 的信件啊!真可怕~別擔心,那個資料是由『 sendmail 開始運作到現今』的結果,我的 sendmail 運作了若干年了,有這樣的信件資料量其實不怎麼吃驚啦! ^_^

用戶端的使用說明

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

  • Linux 下使用 mail 功能

  • 在 Linux 的系統當中,一定會存在的用戶端當中的郵件指令就是 mail 這個指令啦!由於這個 mail 指令是直接使用 sendmail 的 local 端的功能,所以使用 mail 時,即使你的 port 25 沒有啟動,仍然可以寄信喔!(但是在 Red Hat 9 以後,已經將這樣的功能取消了!所以您至少需要啟動 sendmail 的預設設定,亦即僅監聽 127.0.0.1 的 port 25 才行!)早期沒有 POP3 這個協定的服務時,用戶在使用 mail 都需要登入主機之後,才能以 mail 這個指令來操作郵件呢!現在就幸福多了,可以直接用 Netscape 之類的軟體來收發電子郵件說。來談一談怎麼發信與收信吧!
     
    • 用 mail 直接編輯文字郵件與寄信:

    • 使用 mail 最簡單的方式就是直接的使用線上編輯的方式來將文字資料傳送出去囉!假如你要發一封信給 vbird@qqdomain.name 時,你可以使用『 mail user@email.domain.name 』的格式,所以你可以這樣做:
      [root@test root]# mail vbird@qqdomain.name
      Subject: This is a test mail
      There are writing area!
      You can't use the Up/Down button in this form...
      you can finish with "."
      <==這個『.』就是結束符號!要正常離開編輯畫面就是 . !
      Cc: <==這就是副本!
      如同上面的樣式,mail 會主動的顯示 Subject 給你,你可以輸入這封信的標題在此~然後就進入編輯畫面啦!你可以在編輯畫面中寫入中英文喔!之後,最重要的是,一定要在開頭的地方輸入那個句號『.』,這樣 mail 就會開始將信傳送出去。在 Red Hat 的預設狀況中,還包含提供了一個副本收受者的郵件位址,就是出現 Cc: 那邊,你可以在後面再接上另一個郵件地址,那就是副本啦!這樣就將信寄出囉!
       
    • 使用 IP 測試寄信:

    • 萬一你的 Linux server 並沒有 domain name 時,是否就無法建置 Mail Server 了呢?當然不是啦!還是可以架設 Mail Server 的啦,還記得我們在前面的網路基礎裡面有提過啦,既然有內部 lo 的介面,自然就一定可以讓我們『測試 tcp/ip 架構』的設定啦!既然如此,我又沒有 domain name ,又架設了一個提供只有少數人知道的 mail server 時,那麼人家怎麼寄信給我啊!呵呵!很簡單啊!就利用 IP 來寄信啊!怎麼寄出去?
      [root@test root]# mail vbird@[127.0.0.1]
      [root@test root]# mail vbird@[192.168.0.100]
      看到了嗎?就是將 domain name (FQDN) 以 IP 來置換,而且,使用中括號將 IP 包起來,這個中括號很重要啊!不要忘記了喔!使用 IP 寄信僅是一個權宜之計,畢竟沒有多少人會記得你的主機 IP 啊!並且,若是使用 ADSL 計時制的撥接方式,那麼得到的 IP 是 ISP 動態分配的 ( dynamic ),所以可能每次上網的 IP 都不固定~那麼不是會搞死人....所以啦,申請一個 domain name ,如果每次上線都會不同 IP 的情況下,也可以申請免費的動態 DNS 系統的領域名稱,而使用國內的 ISP 提供的主機名稱自動對應 IP 的功能也可以啦!這些名稱都可以用來架設 mail server 喔!
       
    • 用 mail 寄出純文字檔案:

    • 還記得鳥哥的 Linux 私房菜 -- 基礎學習篇裡面的 Bash shell 提到的標準輸入 ( < ) 嗎?既然我使用 mail 的時候需要用到鍵盤輸入,那麼我當然可以利用『標準輸入』來使檔案替代鍵盤的 Keyin 囉!因為在 mail 的編輯畫面中,我們無法使用上下左右按鍵,而且,如果你剛剛在上一行寫錯字了,還沒有辦法回到上一行呢!編輯上面實在不怎麼人性化。所以,我可以使用任何的文字編輯軟體,將我的信件編輯成檔案,請注意,必需是純文字檔喔!然後再將該檔案寄出即可!例如我要將 root 家目錄底下的 .bashrc 寄出去給 vbird ,可以這樣做:
      語法:
      [root@test root]# mail -s '這裡可以接郵件標題' 這裡是郵件收件者  <  檔案名稱
      範例:
      [root@test root]# mail -s 'This is a test mail' vbird < /root/.bashrc 
      需要注意的是,如果 mail 給帳號而已,那麼就是寄給本機的使用者,如果是以電子郵件地址的寫法,才是向外面寄出去的郵件喔!
       
    • 用 mail 接收 mailbox 的信件:

    • 寄信還比較簡單,那麼收信呢?同樣的啦,收信還是使用 mail ,直接在提示字元之後輸入 mail 時,會主動的捉取使用者在 /var/spool/mail 底下的郵件信箱 ( mailbox ),例如我 vbird 這個帳號在 shell 的環境中,輸入 mail 後,就會將 /var/spool/mail/vbird 這個檔案的內容讀出來,並且顯示給 vbird 看!
      語法:
      [vbird@test vbird]# mail
      範例:
      [vbird@test vbird]# mail
      Mail version 8.1.1 6/6/93.  Type ? for help.
      "/var/spool/mail/vbird": 2 messages 2 new
      >N  1 root@vbird.adsldns.o  Sat Feb 22 13:01  24/945   "test uuencode"
       N  2 root@vbird.adsldns.o  Sat Feb 22 13:12  26/838   "This is a test mail"
      在上面的畫面中,顯示 vbird 共有兩封『新信』此外,底下會附上這兩封新信的發信站與標題及時間等。
       
      • 讀信:有看到『>』那個符號吧!那表示目前 mail 所在的郵件欄位,你可以直接輸入 Enter 即可看到該封信件的內容!另外,你也可以在『&』之後的游標位置輸入號碼,就可以看該封信件的內容了!(註:如果持續按 Enter ,則會自『 > 』符號所在的郵件逐次向後讀取每封信件內容!)
      • 顯示標題:如果要重新顯示每封信的標題,可以輸入 h 即可;
      • 回覆郵件:如果要回覆目前『 > 』符號所在的郵件,直接按下『R』即可進入剛剛前面介紹過的 mail 文字編輯畫面囉!你可以編輯信件後傳回去囉!
      • 刪除郵件:按下『 d## 』即可刪除郵件!例如我要刪除掉第 2 封郵件,可以輸入『d2』如果是要刪除第10-50封郵件,可以輸入『d10-50』來刪除喔!請記得,如果有刪除郵件的話,離開 mail box 時,要使用『q』才行!
      • 儲存郵件到檔案:如果要將郵件資料存下來,可以輸入『 s ## filename』,例如我要將上面第一封郵件存下來,可以輸入『 s 1 uuencode 』即可將第一封郵件內容存成 uuencode 這個檔案!
      • 離開 mail :要離開 mail 可以輸入 q 或者是 x ,請注意『輸入 x 可以在不更動 mail box 的情況下離開 mail 程式,不管你剛剛有沒有使用 d 刪除資料;使用 q 才會將刪除的資料移除,並且會將所有已讀過的信件內容轉存到你家目錄下的 mbox 檔案!』也就是說,如果你不想更動 mail box 那就使用 x 或 exit 離開,如果想要使剛剛移除的動作生效,就要使用 q 啦!不過,使用 q 之後,只有未讀的信件才會保留在 /var/spool/mail/accout 裡面,其他已讀的資料都會被存入 ~/mbox 當中!例如 /home/vbird/mbox 為儲存 vbird 已讀過的信件!
      • 請求協助:關於 mail 更詳細的用法可以輸入 help 就可以顯現目前的 mail 所有功能!
       
      上面是簡易的 mail 收信功能!不過,如果離開 mail 時按下 q ,不是會有信件轉存到 ~/mbox 這個郵件信箱嗎?那麼我要如何讀取這個檔案內的信件資料呢?可以簡單的使用這個方式來讀取:
      [vbird@test vbird]# mail -f ~/mbox
      使用『-f file 』規定新的 mail box 檔案,如果沒有 -f file 的話,就會直接使用 /var/spool/mail 裡面的 mailbox 啦!
       
    • 設定檢查郵件的間隔時間 MAILCHECK:

    • 如果在你的 Shell 環境下有新信進來時,通常我們的 bash 會很好心的告訴你有來信了!預設的條件中是 60 秒鐘檢查一次 /var/spool/mail 當中是否有新信!如果想要改成 30 秒呢?可以的!直接設定『 MAILCHECK 』(大寫字母)這個變數即可!
      [vbird@test vbird]# MAILCHECK=30
      或者直接將該變數寫入你的 ~/.bashrc 當中亦可!
       
    • 用 mail 夾帶檔案寄信與收信:

    • 上面的方法都僅提供『純文字』的寄件而已,如果我想要『夾帶檔案』在郵件當中呢?可以使用 mail 這個指令來達成嗎?呼呼!確實是可行的!不過,單純的 mail 無法達到這個目的,我們還必需要使用檔案譯碼 ( encode ) 的功能才能達到這個夾帶檔案的目的喔!不過,要使用 uuencode 的功能,就得要安裝 sharutils 這個套件! 如何安裝吶?!很簡單啊!拿出光碟,直接安裝,或者使用 APT 或 YUM 來安裝!都可以啦!例如:
      apt-get install sharutils
      yum install sharutils
      寄信:
      [vbird@test vbird]# uuencode 欲夾帶的檔案檔名 編碼的標題 | mail -s 'title' 收件者
      範例:
      [vbird@test vbird]# uuencode ~/.bashrc bashrc | mail -s 'test uuencode' \
      > vbird@tsai.adsldns.org
      這樣信件就送出去啦!而且是附件夾帶喔!你可以使用 Netscape 或者 Outlook 之類的軟體直接收受該檔案,如果是在 shell 環境中,你可以這樣做:
      1. 儲存該郵件使成為檔案:
      [vbird@test vbird]# mail
      Mail version 8.1.1 6/6/93.  Type ? for help.
      "/var/spool/mail/vbird": 2 messages 2 new
      >N  1 root@vbird.adsldns.o  Sat Feb 22 13:01  24/945   "test uuencode"
      & s 1 testfile
      目前的目錄下會產生一個 testfile 的新檔案

      2. 將捉下來的檔案解碼
      [vbird@test vbird]# uudecode testfile -o outfile
                uudecode 讀入檔案    輸出的檔案

      如此一來, outfile 就是解碼後的檔案內容啦!至於 testfile 內容有點像這樣:
      From root@vbird.adsldns.org  Sat Feb 22 13:01:05 2003
      Return-Path: <root@vbird.adsldns.org>
      Received: from vbird.adsldns.org (localhost [127.0.0.1])
              by vbird.adsldns.org (8.12.7/8.12.7) with ESMTP id h1M514Jc022610
              for <vbird@vbird.adsldns.org>; Sat, 22 Feb 2003 13:01:05 +0800
      Received: (from root@localhost)
              by vbird.adsldns.org (8.12.7/8.12.7/Submit) id h1M514dg022608
              for vbird; Sat, 22 Feb 2003 13:01:04 +0800
      Date: Sat, 22 Feb 2003 13:01:04 +0800
      From: root <root@vbird.adsldns.org>
      Message-Id: <200302220501.h1M514dg022608@vbird.adsldns.org>
      To: vbird@vbird.adsldns.org
      Subject: test uuencode
      Status: R

      begin 666 bashrc
      M(R`N8F%S:')C"@HC(%-O=7)C92!G;&]B86P@9&5F:6YI=&EO;G,*:68@6R`M
      M9B`O971C+V)A<VAR8R!=.R!T:&5N"@DN("]E=&,O8F%S:')C"F9I"@I0051(
      M/2]S8FEN.B]U<W(O<V)I;CHO8FEN.B]U<W(O8FEN.B]U<W(O6#$Q4C8O8FEN
      M.B]U<W(O;&]C86PO8FEN.B]U<W(O;&]C86PO<V)I;CHO=7-R+VQO8V%L+V%P
      M86-H93(O8FEN"F5X<&]R="!0051("@IA;&EA<R!L;3TG;',@+6%L?&UO<F4G
      ""@H`
      `
      end

      真正的檔案內容是 begin 到 end 的那些粗體字!使用 uudecode 時, uudecode 會主動的分析 begin 開始的欄位,然後將 begin 後面的內容解譯還原成為原來的檔案內容!呵呵!恭喜您!
     

  • Linux 下使用 telnet 功能

  • 我們上面提到的是 mail 使用 sendmail 的預設功能,那是屬於 local mailer 的功用!那麼我是否可以藉由 smtp 來寄信呢?亦即使用 SMTP 這個服務來寄信!可以的啦,那就必需要使用 telnet 的功能囉!
    1. 寄信:
    [vbird@test vbird]# telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost (127.0.0.1).
    Escape character is '^]'.
    220 vbird.adsldns.org ESMTP Sendmail 8.12.7/8.12.7; Sat, 22 Feb 2003 13:52:52 +0800
    ehlo localhost <==必需先跟主機打招呼喔!
    250-vbird.adsldns.org Hello localhost [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
    mail from: "Myname"<vbird@vbird.adsldns.org> 
    這裡輸入我要寄信的來源郵件地址,請記住,前面""裡頭是顯示在信件表頭的說明,
    後面< >裡面接的才是你真正的郵件地址喔!
    250 2.1.0 vbird@vbird.adsldns.org... Sender ok
    rcpt to: <root@vbird.adsldns.org> <==輸入郵件送達的目的端郵件地址
    250 2.1.5 root@vbird.adsldns.org... Recipient ok
    data <==要開始寫信了喔!告知 data !
    354 Enter mail, end with "." on a line by itself
    This is just testing
    .       <==這兩行是內容!不要忘記 . 這個咚咚!
    250 2.0.0 h1M5qqJc022990 Message accepted for delivery
    quit<==離開 telnet 程式!
    這樣信件就寄出去啦!
    這樣就 OK 啦! ^_^!
    註:Linux 下使用 telnet 功能,在 MAIL FROM、RCPT TO 內,後面接的項目若是 e-mail 的話,應該使用 "< >" 包起來,這樣子才正確。
      MAIL FROM: usersname<userid@hostname.domainname>
      MAIL FROM: "users  name"<userid@hostname.domainname>
    另外許多 MTA 目前都會限制再使用 MAIL FROM 時要先使用 HELO或者是 EHLO 先打招呼過,要不然會不允許進行後續溝通。
     

  • X-Window 與 Windows 的 MUA 功能

  • Outlook 與 Netscape 會用吧?!由於是全圖形介面,所以也沒有什麼好特別說明的地方,底下就來說一說關於 outlook 的設定方法,其他的 MUA 介面設定的方法都差不多啦!仔細參考一下即可囉!

關於郵件主機安全的設定

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

    sendmail 本身的安全設定項目( Sendmail 官方的建議 )
     
    sendmail 本身已經提供相當多的安全項目建議,其中,大部分是在於『目錄與檔案權限』的設定要求上面!
     
    • 請確定 aliases 這個檔案的權限,僅能系統信任的 User 可以存取,通常其權限為 644 ;
    • 請確定 sendmail 讀取的資料庫 ( 多半在 /etc/mail 底下的 *.db 檔案 ),例如 mailertable, access, virtusertable 等等,僅能由系統信任的使用者讀取,其他一概不能讀取,通常權限為 640 ;
    • 系統的佇列目錄 ( /var/spool/mqueue ) 僅允許系統讀取,通常權限為 700 ;
    • 請確定 .forward 這個檔案的權限也不能設定成為任何人均可查閱的權限,否則您的 e-mail 資料可能會被竊取~
    • 總之,一般用戶能夠不用 .forward 與 aliases 的功能,就不要使用!
     
    不過,這樣的設定自然不夠安全的啦!在 Sendmail 8.12 版本以後,甚至嚴格的規定系統的操作者為 smmsp 這個使用者呢!會更加的安全一些~如果您有興趣的話,不妨將您的 sendmail 以底下介紹的 Tarball 的方式升級更新到 sendmail 8.12 版喔!
     

    SMTP 認證
     
    由前面的 Sendmail 的設定說明當中,您是否覺得上面所設定的 Sendmail 已經夠用了呢?呵呵!想必是不夠的!鳥哥我就覺得,嗯!還是有待加強!怎麼說呢?想個例子好了,由於我的 sendmail 為了 Open Relay 的問題,所以勢必要關閉所有的 relay ,而僅開放 Mail 本機以及部分網域或者主機的 Relay 使用權!不過,我總有在外面工作的時候吧!我總是有使用計時制 ADSL 這種非固定 IP 的連線模式來上網的時候吧!我的 Mail Server 上面的用戶總有使用 notebook 而到處跑得吧!如此一來,這個 /etc/mail/access 的設定勢必是不夠的~那要怎麼辦呢?
     
    想像一下,如果我的 sendmail 也跟 pop3 這個收信服務一樣,在要求傳信的時候,必須提供帳號與密碼讓 Mail 主機來認證,如此一來,不就可以藉由這帳號、密碼的機制來限制使用者的使用了嗎?!呵呵!好樣的!沒錯,確實可以使用這樣的機制。事實上,目前較常被使用的這種認證機制為 SMTP 郵件認證機制 ( SMTP Authorization ) ,主要透過 cyrus sasl 這個套件來達成郵件的認證動作,那麼到底他是如何達到認證的呢?
       

    • Cyrus SASL 的動作:

    • Cyrus Simple Authentication and Security Layer 簡稱為 Cyrus-SASL ,他最大的功能在提供一些應用程式所使用的認證函式庫!這裡頭最有名的例如 Sendmail 這個郵件伺服器了! 應用程式可以透過 SASL 所提供的函式庫功能,並且定義出認證的方式,讓 SASL 透過與主機的溝通動作,提供應用程式來達到認證的目的!舉個例子來說,如果我的 sendmail 已經提供了 SMTP 認證的功能,那當使用者進入認證階段時:
       
      1. 首先, sendmail 會去取用 SASL 的函式庫資料;
      2. 此外,由於 SASL 可以進行的認證機制相當的多,所以 sendmail 必須要指定 SASL 的認證方式,一般而言,我們都會直接以 /etc/shadow 裡面的帳號密碼來進行認證!至於針對 sendmail 的 SASL 認證方法則預設設定在 /usr/lib/sasl/Sendmail.conf 或 /usr/lib/sasl2/Sendmail.conf (根據 cyrus SASL 版本的不同而異!)
      3. SASL 根據設定的方法去取用密碼與帳號內容,並且加以比對,回應給 sendmail 該次比對是否成功!
       
      基礎的流程是這樣,不過 SASL 除了 Sendmail 的認證模式之外,其實他還提供很多的功能啦!因為 SASL 主要就是一個函式庫,而這個函式庫還具有額外的提供『密碼認證檔案』的功能,所以,只要是能夠支援 SASL 的應用程式,就可以利用 SASL 所提供的這個認證功能來達到共享同一認證的好處!例如同一個 user 在 LDAP 與 Sendmail 這兩個軟體中,均可以使用同一組帳號與密碼!而不需要額外的針對不同的套件來設定額外的帳號與密碼!
       
      若單純的指 Sendmail 這個應用程式的話,那麼 SASL 至少可以提供使用 /etc/shadow 與 PAM 這兩個密碼驗證機制,不過請特別留意的是, cyrus SASL 目前已經出到第二版了,而現今的 sendmail 大部分還是以 1.5.xx 版本進行設定的。實際上,這兩個版本的認證原理與方法雖然一樣,但是認證使用的執行檔已經不同了!所以在 /usr/lib/sasl2/Sendmail.conf 這個檔案當中的設定內容也不一樣了!如果您要設定 SMTP 的 AUTH 的話,請特別留意這個不同點喔!
       

    • 實作的流程說明:

    • 由前面的介紹我們知道,要使用 SMTP AUTH 這個功能,你必須要:
       
      1. 你的 Linux Server 必須要已經安裝 Cyrus SASL 函式庫;
      2. 你的 /usr/sbin/sendmail 這支程式必須要將 SASL 的函式庫功能編譯在內;
      3. sendmail 設定檔 ( sendmail.cf ) 必須要將 SASL 的功能啟動 ( 註:/usr/sbin/sendmail 雖然已經將 SASL 函式庫編譯在內,但是 sendmail.cf 這個檔案仍然要將 SASL 的支援啟動之後,才能使用 SMTP );
      4. 必須指定 sendmail 的 SASL 認證模式,通常有 pam 與 shadow 兩種模式,在 SASL version 1 當中, sendmail 的 SASL 認證模式設定檔為 /usr/lib/sasl/Sendmail.conf ( S 為大寫 ),若為 SASL version 2 則在 /usr/lib/sasl2/Sendmail.conf !而如果 Sendmail 裡面設定為 pam 的話,那麼 /etc/pam.d 裡面亦需存在 smtp 這個檔案才行!(所以我們通常都使用 shadow 而已~)
      5. 重新啟動 sendmail 即可!
       
      可以看得出來,要讓你的 Sendmail 由無到有的支援 SMTP AUTH 的話,那麼就必須要重新編譯 /usr/sbin/sendmail 這個執行檔!哇!那就必須要使用 Tarball 的方式,並且依照上面的動作,一步一步的進行啦!過程還頗為繁複呢!這個動作我們在底下 以 Tarball 完整安裝具有 SMTP 的 sendmail 部分再來講解,如果您的 sendmail 並非為 Red Hat 的話,就得前往 Tarball 安裝 sendmail 的章節了,不過,如果是 Red Hat 呢?恭喜您啦!因為 Red Hat 的 Sendmail 預設已經包含了 SASL 的函式庫功能,只是預設的參數設定檔 ( sendmail.cf ) 並沒有啟用這個功能而已~底下我們就先以簡單的 Red Hat 的 sendmail 來說明啟動 SMTP AUTH 的流程吧!
       

    • Red Hat 的 SMTP 認證啟用流程:

    • 很棒的是, Red Hat 的 sendmail ( /usr/sbin/sendmail 執行檔 ) 已經支援 Cyrus SASL 了,只要將 sendmail.cf 裡面關於 SMTP 認證的功能啟動即可!所以,只要去編輯 /etc/mail/sendmail.mc 即可 ( 註:這個檔案在不同的版本中,也會有被放在 /usr/share/sendmail-cf/cf/redhat.mc的時候!反正只要找到 sendmail.mc 或 redhat.mc 就對啦! ) :
       
      1. 修改 m4 script :
      [root@test root]# cd /etc/mail/
      [root@test mail]# vi sendmail.mc
      # 找到這幾行:
      dnl TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      dnl define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA') 
      # 將他修改成底下這樣:
      TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')

      2. 開始製作 sendmail.cf 檔案:
      [root@test mail]# m4 sendmail.mc > redhat.cf
      [root@test mail]# mv /etc/mail/sendmail.cf /etc/mail/sendmail.cf.bak
      [root@test mail]# cp redhat.cf /etc/mail/sendmail.cf

      3. 啟動 sendmail 與測試 SMTP AUTH
      [root@test mail]# /etc/rc.d/init.d/sendmail restart
      Shutting down sendmail:                                    [  OK  ]
      Starting sendmail:                                         [  OK  ]

      [root@test mail]# telnet localhost 25
      Trying 127.0.0.1...
      Connected to localhost.
      Escape character is '^]'.
      220 test.adsldns.org ESMTP Sendmail 8.11.6/8.11.6; Mon, 24 Feb 2003 11:51:04 +0800
      ehlo localhost  <==輸入本機狀態的測試
      250-test.adsldns.org Hello tsai.adsldns.org [127.0.0.1], pleased to meet you
      250-ENHANCEDSTATUSCODES
      250-8BITMIME
      250-SIZE
      250-DSN
      250-ONEX
      250-ETRN
      250-XUSR
      250-AUTH LOGIN PLAIN  <==出現這行就對啦!
      250 HELP
      quit

       
      如果出現上面的 AUTH LOGIN PLAIN 那一行的話,就表示 SMTP AUTH 已經正確的啟用啦!這個時候,你就可以將 /etc/mail/access 這個檔案裡面的相關設定給他取消掉!直接以 SMTP 來抵擋囉!不過,無論如何,如果是內部的信件,使用 /etc/mail/access 的設定還是比較簡單啦! ^_^
       

    • 用戶端 Client 的設定:

    • 既然 SMTP AUTH 是使用使用者提供的帳號密碼來進行身份的確認,那麼自然我們就得在 Client 的 MUA 上面進行帳號密碼的設定囉!如果你的系統是 Windows ,使用的 OutLook 的話,那麼應該要勾選底下這個咚咚:
       

       
      如果是 Netscape 的話,那就需要填寫發信者姓名囉:
       

       
      這樣您就可以使用 SMTP AUTH 帶來的方便性囉!
       

     
    那麼 SMTP 到底在那個步驟生效的呢?如果我們以前面提到的 一封郵件的收受流程 當中,再加入這個帳號與密碼的功能時,那信件會變成怎麼跑呢?
     
    1. 還是會先判斷是否有收件人在本機帳號中,若有則收,沒有則下一步;
    2. 還是會判斷 /etc/mail/access.db 的動作設定,若有則作動作,否則下一步;
    3. 開始啟動帳號密碼的機制判斷,若使用者提供的帳號密碼可以通過這個機制,則信件開始 relay ,否則下一步;
    4. 將原信件退給發信者!
     
    大致的流程就是這樣啦!所以囉, /etc/mail/access 還是有存在的價值喔!尤其針對內部網域而言~
     
    關於 ORDB 抵擋 open relay 郵件主機之機制說明與實作
     
    什麼是 Open Relay 呢?我們還記得在原理說明的地方曾經提過 Relay 這個玩意吧!目前預設的 Mail Server 都已經將 Relay 關閉了,而僅開放部分的信任網域,或者是直接經由類似 SMTP AUTH 的認證機制來進行 Relay 的功能!而如果一個 Mail Server 對於 Client 端的 Relay 需求完全的接受,那就是 Open Relay 啦!如果你的 Mail Server 被測試出有 Open Relay 的情況,那麼你的郵件主機將會被當成是『黑名單』的一員,情節較輕者,可能會被停止使用 mail 的權力,情節較重者,則可能被完全停止使用網路的權力!關於台灣地區『學術網路黑名單』的 IP 資料,您可以在底下的網址查詢到:
     
    http://140.111.1.22/tanet/spam.html
     
    我們上面介紹了很多的 Sendmail 相關的技巧與設定,可以讓我們的主機不至於被當成『黑名單』的一員,不過,由於開放 Open Relay 的郵件主機對於網域內的網路具有相當大的破壞力,因為頻寬會被吃光光,所以,如果我們發現有 Open Relay 的主機,其實也可以抵制我們的用戶將信送到對方的主機的,以提醒我們的用戶端『咦!應該要強迫對方郵件主機管理員進行維護了!』
     
    可不可能達到這樣的目的呢?可以的,就使用 Internet 上面提供的 Open Relay 名單資料庫來進行『校閱』的動作啦!那麼這個方法是如何工作的呢?是這樣的:『當我們的 Sendmail 要傳送信件到下一個 MTA 時,會先到 Open Relay 黑名單資料庫查詢該主機 IP 或主機名稱是否在黑名單中,若不在黑名單中,則進行 Relay ,若在黑名單當中,則停止 Relay 的動作,並將信件退回,且在退回的信件上面註明此信被退回的原因,以提供使用者向網站管理員申訴的意見之用!』那麼那個網路黑名單資料庫在哪裡呢?目前有很多黑名單資料庫,鳥哥我使用的是 http://www.ordb.org 這個網站提供的資料庫確認喔!
     
    註:如果您以瀏覽器(Netscape 或 IE)進行 http://www.ordb.org 的瀏覽時,卻出現一片白白的畫面,這是編碼的問題!請在您的瀏覽器上面選擇編碼為『繁體中文(Big5)』就可以看到該網站的內容咯!
       

    • 如何確認一部主機是否具有 Open Relay 的問題?

    • 有 Open Relay 可是很危險的呢!那麼如何確定我自己的主機有 Open Relay 呢?
      1. 是否已在黑名單資料庫中:確認的方法很簡單,直接到『http://www.ordb.org/lookup/』輸入您的主機名稱或者是 IP ,就可以檢查是否已經在黑名單當中;
      2. 是否具有 Open Relay :如果要測試你的主機有沒有 Open Relay ,直接到『http://www.ordb.org/submit/』這個網頁,同樣輸入主機或者 IP ,就可以將你的 IP 加入 Open Relay 的排程中,此時 ORDB 會主動的寄信給你的 Mail Server ,以確認該主機是否為 Open Relay 呢!
      3. 如何移除:如果被檢查出,您的主機已經在黑名單當中,那麼請立刻將 Open Relay 的功能關閉,改善你的 Mail Server 之後,再以移除的方法『http://www.ordb.org/submit/』進行檢查,如果檢查出已經改善了,那就會自動將該黑名單資料庫中移除!


       
    在 Sendmail 上面啟用 ORDB 網站提供的功能實在很簡單,請依照底下的步驟進行即可:
     
    1. 修改 m4 script :
    [root@test root]# cd /etc/mail
    [root@test mail]# vi sendmail.mc
    # 在 MAILER 之前加入這一行,請注意,底下是『同一行』:
    FEATURE(`dnsbl', `relays.ordb.org', `"Email blocked using ORDB.org - see <http://ORDB.org/lookup/?host="$&{client_addr}">"')

    2. 開始製作 sendmail.cf 檔案並啟動 sendmail:
    [root@test mail]# m4 sendmail.mc > redhat.cf
    [root@test mail]# mv /etc/mail/sendmail.cf /etc/mail/sendmail.cf.bak
    [root@test mail]# cp redhat.cf /etc/sendmail.cf
    [root@test mail]# /etc/rc.d/init.d/sendmail restart
    Shutting down sendmail:                                    [  OK  ]
    Starting sendmail:                                         [  OK  ]

     
    千萬不要懷疑,這樣即刻生效了啦! ^_^
     
    Procmail 相關說明
     
    什麼是 Procmail
    什麼是 procmail 呢?簡單的說, Procmail 可以被視為一個 MDA 啦,也就是說,當 mail server 取得了自家的信之後,會將該封信件交給 procmail 來進行處理,而 procmail 會經由分析該郵件的內容,以及使用者設定的相對應狀態,來將信件進一步過濾 ( filter )!舉個例子來說,你曉得有一個以『AV情色』為郵件主旨的信件,其實他是一個廣告信,那麼你想讓 mail server 主動的將這種信件『丟掉』的話,那麼可以在 procmail 的設定檔當中,加入分析此一郵件主旨,以後,若來信符合這個設定時,就會被 procmail 丟棄了!當然 procmail 的功能還不止於此,這僅是最簡單的功能而已~
     
    啟用 Procmail 的支援
    基本上,如果你要啟動 procmail 的話,就必需要再次的修改您的 m4 scripts 檔案,也就是 redhat.mc 那個檔案啦!不過, Red Hat 各個版本的 sendmail 預設都已經啟動 procmail 啦!所以你可以不需要修改呢!無論如何,我們還是來看一下 與 procmail 有關的 m4 script 設定內容吧!
     
    [root@test root]# cd /etc/mail
    [root@test mail]# vi sendmail.mc
    # 底下僅列出與 procmail 有關的設定
    define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl <==procmail 的執行檔完整檔名
    FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')dnl <==加入 procmail 之設定
    MAILER(smtp)dnl
    MAILER(procmail)dnl  <==procmail 請放置在 smtp 後面喔!
     
    是的,就是這幾行而已,你的 procmail 就已經被支援成為 MDA 啦!如果您是以 Tarball 安裝 Procmail 的話,那麼請記得將上面那幾行對應到你的系統當中喔!切記切記!
     
    開始設定 Procmail 的過濾規則
    剛剛說過, Procmail 是利用『使用者定義出的過濾規則』來進行郵件的過濾的,那麼這個檔案預設放在哪裡呢?預設就是放在 /etc/procmailrc 這個檔案啦!不過,這個檔案預設是不存在的,也就是說,雖然你啟動的 procmail 的 MDA 功能,但是你並沒有啟用任何的規則,所以當然進入 mail server 的郵件,就不需要被『過濾』啦!而如果你定義出規則在 /etc/procmailrc 之後,以後信件就會拿該規則來進行過濾囉!在此需要先介紹一下,一封郵件的內容主要分為兩部分:
    1. 表頭 ( Header ) 一些基本資訊如寄件者、標題等等;
    2. 主要內文 ( Body ) 部分
    至於 Procmail 過濾規則的設定方法是這樣的:
     
    一組規則設定至少共含有三行:
    :0 [flags] [ : [locallockfile] ]  <==設定要被過濾郵件的檢查地方
    <zero or more conditions (one per line)>  <==被檢查的規則內容
    <exactly one action line>  <==若符合所定義的規則內容,則郵件要進行的動作!

    參數說明:
    a. 關於檢查郵件的部分(第一行),flags 包含有:
      H : Header 的檢查
      B : Body 的檢查
      h : 提供 Header 的資料,進入 pipe 、 file 及 mail 等的檢查
      b : 提供 Body 的資料進入 pipe, file 及 mail 等的檢查!
    b. 關於檢查內容的部分:
      ! : 這是反向選擇的意思
      < : 檢查 mail 的總長度是否小於設定值 ( bytes )
      > : 與 < 相反的選擇囉!
    c. 關於動作的部分
      | : 開始啟用後續的 shell 程式工作!
    d. 其他的環境變數部分:
      PATH    搜尋執行檔的路徑
      SENDMAIL  那個 /usr/sbin/sendmail 囉!
      LOGFILE   登錄檔!通常設定在 /var/log/procmail.log
    e. 與 Regular express 相關的部分:
      ^ : 開始(同一行最左邊)字元
      $ : 本行的結束字元(最右邊)的比對
      . : 除了新增一行之外的任何字元!
      \ : 跳脫字元
    更詳細的內容請務必參考:
    man procmailrc
    man procmailex

     
    如果有興趣的話,可以參考我設定的 /etc/procmailrc 的檔案內容喔!你也可以下載(http://linux.vbird.org/download/index.php#sendmail_sendmail)喔!
     
    # History of procmail RC file, 
    # Written by VBird 
    ############ History ############################################
    # Day  Who What
    # ---------- ------ ---------------------------------------
    # 2002/05/04 VBird First build, all is the same with
    #   臥龍小三 ftp://ftp.tnc.edu.tw/pub/Sysop/MAIL/procmailrc
    #   林克敏   http://freebsd.lab.mlc.edu.tw/procmail.htm
    # 2002/05/04 VBird 新增廣告信件移除兩個!
    # 2002/05/06    VBird   新增 Klez.W32 病毒的針測
    # 2003/09/05 VBird 新增 Sobig 與 MiMail 病毒抵擋!
    #################################################################
    ############ Globle settings ####################################
    LOGFILE=/var/log/procmail.log
    UMASK=000

    ################ Virus scanner ##################################
    ############# 1. KLEZ.G Virus ###################################
    :0b
    * ^Subject:.*(Let's be friends)
    /dev/null

    :0b
    * ^Subject:.*A funny game
    /dev/null

    :0b
    * ^Subject:.*Hello\,.*\,how are you.*
    /dev/null

    :0 B
    * ^Content-Type:.*audio/x-wav.*
    * ^.*name=.*\.(scr|SCR)
    /dev/null

    :0 B
    * ^Content-Type:.*audio/x-midi.*
    * ^.*name=.*\.(scr|SCR)
    /dev/null

    :0 B
    * ^Content-Type:.*application/octet-stream.*
    * ^.*name=.*\.(scr|SCR)
    /dev/null

    :0 Bb
    * ^This game is my first work.*
    * ^You\'re the first player.*
    * I.*you would .* it.*
    /dev/null

    :0 Bb
    * Hello,This is a.*
    * I.*you would.*it.*
    /dev/null

    :0 Bb
    * ^This is a.*
    * ^I.*you would.*it.*
    /dev/null

    :0 Bb
    * .*This is a.*patch.*
    * ^I .* you would.*it.*
    /dev/null

    :0 B
    * ^Content-Type:.*multipart/mixed.*
    * name="ANTI_CIH.EXE"
    /dev/null

    :0b
    * ^Subject:.*W32.*removal tools$
    /dev/null

    :0b
    * ^Subject:.*Worm Klez.*immunity.*
    /dev/null

    ############# 2. Nimda Virus ####################################
    :0 Bh
    * ^Content-Type:.*audio/x-wav.*
    * name="readme.exe"
    /dev/null

    :0 Bh
    * ^Content-Type:.*audio/x-wav.*
    * name="sample.exe"
    /dev/null

    :0 B
    * ^Content-Type:.*multipart/mixed.*
    * name="readme.exe"
    /dev/null

    :0 B
    * ^Content-Type:.*multipart/mixed.*
    * name="sample.exe"
    /dev/null

    :0 B
    * ^Content-Type:.*application.*
    * name="readme.exe"
    /dev/null

    :0 B
    * ^Content-Type:.*application.*
    * name="sample.exe"
    /dev/null

    :0 Bh
    * charset="iso-8859-1"
    * name=.*bat
    /dev/null

    :0 Bh
    * charset="iso-8859-1"
    * name=1.*zip
    /dev/null

    ############# 3. SirCam Virus ###################################
    :0 Bh
    * I send you this file in order to have your advice 
    /dev/null

    ############# 4. MMail  Virus ###################################
    :0 Bh
    * name=.*message.zip
    /dev/null

    ############# 5. Sobig  Virus ###################################
    :0 Bh
    * name=.*pif
    /dev/null
     

    #################################################################
    ############# 廣告信  ###########################################

    # 來自奇摩與 PCHOME 的都擋掉!
    :0 Bh
    * href\=.*http:\/\/home\.kimo\.com\.tw
    /dev/null

    :0 Bh
    * href\=.*http:\/\/home\.pchome\.com\.tw
    /dev/null

    :0 Bh
    * Subject:.*AV66情色派
    /dev/null

    :0 Bh
    * From:.*創意行銷
    /dev/null

    :0 Bh
    * http:\/\/.*etl\.com\.tw
    /dev/null

    :0 BhH
    * http:\/\/f2m\.aac\.com\.tw
    /dev/null

    :0 BhH
    * http:\/\/www\.9895\.com
    /dev/null

    :0 BhH
    * http:\/\/88\.to
    /dev/null

    :0 BhH
    * http:\/\/fly\.to
    /dev/null

    :0 BhH
    * http:\/\/china\.kyodo\.co\.jp
    /dev/null

    :0 BhH
    * http:\/\/.*\.openmybiz\.com
    /dev/null

    :0 BhH
    * http:\/\/.*\.pufan\.com
    /dev/null

    :0 BhH
    * http:\/\/.*\.buyy\.biz
    /dev/null

    :0 BhH
    * http:\/\/.*\.tw886\.to
    /dev/null

    :0 BhH
    * http:\/\/.*\.hala\.idv\.tw
    /dev/null

    # 底下是最近的一些發信軟體所發送的幾個 Keyword. 2003/09/05
    :0 Bh
    * http:\/\/.*\.wantclick\.com
    /dev/null

    :0 Bh
    * http:\/\/fastcounter\.bcentral\.com
    /dev/null

     
    此外,您還要新增一個檔案在 /etc/logrotate.d 裡面才行!因為你會多一個 /var/log/procmail.log 的檔案啊!
     
    [root@test root]# vi /etc/logrotate.d/procmail
    /var/log/procmail.log {
            monthly
            rotate 5
            nocompress
    }
     
    其他 Procmail 相關的資訊可以查詢底下的網站喔!
    http://www.procmail.org
    http://www.sektorn.mooo.com/era/procmail/mini-faq.html

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 對於安全的要求越來越嚴格,所以你必須針對每個目錄或檔案進行檢查才行!通常檢查的目錄為:
    • /etc/mail :裡面的檔案至少都為 644 或 640 的權限!
    • /var/spool/mqueue :務必為 700 的權限
    • /var/spool/clientmqueue:這在 8.12 才有,所有人與群組務必為 smmsp ,而權限務必為 770 ;
    • 每個 ./forward 的檔案需要控制其權限喔!在 8.12 版本中, .forward 的『擁有群組』必須要為 smmsp ,並且其權限必須要為 640 才行喔!
  8. 關於使用者的設定問題:一般而言,如果使用者不登入 sendmail 主機進行寄信的動作( local mailer ),那麼 /etc/passwd 裡面的設定就無關緊要了!不過,如果該使用者想要在 sendmail 本機上面使用 mail 的功能,那麼在 8.12 版本當中,您就必須要:
    • 使用者的 primary 群組必須要為 smmsp !
    • 使用者的 shell 必須要可以登入才行!
    • 其他使用者的相關檔案當中,最明顯的 .forward 權限必須設定正確!
  9. 其他檔案的設定問題:
    • 如果發現只有某個 domain 可以寄信,其他的同一主機的 domain 無法寄信,需要檢查 local-host-names 這個檔案的設定;
    • 如果發現郵件被擋下來了!而且老是顯示 reject 的字樣,那麼可能被 /etc/mail/access 擋住了;
    • 如果發現郵件佇列 (mailq) 存在很多的郵件,可能是 DNS 死掉了,請檢查 /etc/resolv.conf 的設定是否正確!
  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 私房菜 -- 基礎學習篇』裡面介紹過了,這裡不再重複介紹,要介紹的是幾個可能會發生在實際的案例中的一些小技巧:
  • 郵件信箱所在的磁碟空間不足了:

  • 這是很可能會發生的問題啊!尤其是在用量很大的網站上面!這個時候你的解決方法主要有:
    1. 新增加一顆硬碟,格式化好之後將他 mount 到 /var/spool/mail 這個目錄下;
    2. 如果主機裡面還有其他目錄具有很大的空間,例如 /home 這個地方,那麼就可以:

    3. cd /var/spool
      mv mail /home
      ln -s /home/mail mail
     
  • 使用 quota 設定:

  • 一般而言,我們通常會將 /home 做為 quota 的 partition ,那麼 /var/spool/mail 其實也可以依附在 /home 這個 partition 之下,來達到 quota 對於使用者的規範喔!達成的方法很簡單啦:
    1. 先在主機規劃與安裝的時候,讓 /home 獨立於一個 partition 當中;
    2. 以『鳥哥的 Linux 私房菜 -- 基礎學習篇』的 quota 內容為範例,建立好 /home 的 quota 限額;
    3. 將 /var/spool/mail 整個搬到 /home 底下,並做好連結的動作就可以立即生效啦:

    4. cd /var/spool
      mv mail /home
      ln -s /home/mail mail
     
  • 關於使用者郵件的放置地點:

  • 很多的讀者可能喜歡讓每個使用者去到自己的家目錄讀取 mail box 的咚咚,亦即是將 /var/spool/mail 的內容給他搬到個別的家目錄去!例如 vbird 的 mail box 變成的 /home/vbird/vbird 這個檔案!不過,如此一來的話, sendmail 與 pop 都將需要改寫其 source code !所以『不建議這麼搞喔!』

本章與 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 才行!』至於會考的檔案與指令可能有這些:

參考資源:


本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看)

  • 我在使用 Sendmail 寄信時,卻發生底下這個問題,請問可能的發生原因為何?
  • 請列出四個 Mail Server 的相關的元件,以及其功用為何?
  • POP3 與 SMTP 的功能為何?
  • 請簡單的說明 DNS 裡面 MX 標誌與 Mail 的關係為何?
  • 今天我突然興起,想要修改我的 sendmail ,請問, sendmail 的設定檔在哪裡?而我要以什麼程式修改 sendmail 呢?
  • 什麼是 mailling list ?在 sendmail 底下有什麼方法可以不藉由其他的軟體達到 mailling list 的功能?
  • 如何察看郵件佇列的內容,以及郵件佇列內容放置在何方?
  • 若我的 sendmail 主機有很多名稱,我想讓這些名稱都可以進行 mail 的接收,應該修改什麼檔案?
  • 什麼是 Open Relay?

  • 前往參考用解答
修改歷史:
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以來統計人數
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計