廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 9208 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
steve062
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x1 鮮花 x10
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[Linux] 如何架設MAIL SERVER
一直以來﹐電子郵件系統就是網路管理中一個大題目﹐其複雜性不亞於管理一個現行網路﹐甚至有些公司還專門有人負責郵件系統的管理工作呢。

認識郵件系統

在我們真正動手設定 Linux 的email 系統之前﹐最好先了解一些關於 email 系統的術語和功能。

先讓我們認識兩個詞﹕MUA 和 MTA ﹐它們分別是 Mail User Agent 和 Mail Transfer Agent 的意思。MUA 從字面上看似乎好容易給它嚇死﹐但說穿了您可能會笑耶﹕我們平時用的 Outlook Express﹑Netscape Mail﹑或是 Linux 上面的 pine ﹐它們都是 MUA 。簡單說﹐MUA 是用來給使用者流覽郵件和書寫郵件的程式。

MTA 呢﹖我們管它叫郵件伺服器好了﹐它負責 MUA 的請求﹐也負責將郵件從一個 MTA 傳到另一個 MTA 。通常一個 MTA 都可以支持好幾種郵件協定﹐例如﹕ UUCP﹑SMTP﹑POP 等。 UUCP (Unix to Unix Communication Protocol) 現在已經比較少用了﹐取而代之的是 SMTP (Simple Mail Transfer Protocol) 和 POP (Post Office Protocol) 這兩個協定。 SMTP 負責的將郵件從 MUA 上傳給 MTA﹐也是 MTA 和 MTA 之間的郵件傳遞協定﹔ 而在沒有 POP 之前﹐email 的使用者一般都要用 telnet 或其它遠端控制程式連上 MTA 那裡﹐然後在那裡閱讀郵件﹐而有了 POP 之後﹐ MTA 可以將使用者的郵件存在一個檔案裡﹐然後使用者通過 MUA 連到 MTA ﹐再將信件下載回本地機器閱讀。另外﹐ MUA 和 MTA 都無需是同一個廠家的軟體﹐只要雙方都支持 POP 協定就可以了﹐其靈活性是不言而喻的了。有些程式﹐如 sendmail ﹐表面來說﹐就同時具備 MUA 和 MTA 功能了。

我們用 MUA 撰寫郵件之後﹐是通過 SMTP 協定上傳給 MTA 的﹔而閱讀郵件則是通過 POP 從 MTA 那裡下載回來。所以﹐當您設定 MUA 的時候﹐就要分別指定 SMTP 和 POP 伺服器的位址了﹐雖然﹐大多數情況之下都可能會是同一台機器。如果您看一看 Linux 的 /etc/services 這個檔案﹐您會發現如下這幾行﹕ smtp         25/tcp       mail                            
pop-2       109/tcp       postoffice     # POP version 2
pop-2       109/udp
pop-3       110/tcp                 # POP version 3
pop-3       110/udp                                    




它們分別指定了郵件伺服器和外面聯係所使用的 Port 。您會看到 POP 也有兩個版本﹕2 和 3 ﹐分別使用 109 和 110 這兩個 port。

或許您已經留意到 IMAP (Internet Message Access Protocol) 這個協定吧﹕ imap2       143/tcp       imap         # Interim Mail Access Proto v2
imap2       143/udp       imap                            




這個 IMAP 是目前新的郵件協定﹐通過 IMAP﹐ 使用者在 MUA 那端就無需分別指定 SMTP 和 POP 作為上傳和下載協定了﹐而只一個 IMAP 協定就可以﹐而且 IMAP 還可以讓不同的使用者共用一個 MUA﹐非常方便哦。

現在我們對郵件系統應該有了初步的概念了吧。讓我們簡單的看一看一封郵件的傳遞流程﹕

使用者 A 使用 MUA 撰寫了一封郵件給另一個網路的使用者 B。
通過 SMTP 上傳給 MTA。
然後 MTA 通過 SMTP 再傳給對方網路的 MTA。
最後使用者 B 通過其自己的 MUA 用 POP 連上 MTA 將郵件下載回來閱讀。
為了加深我們對流程的理解﹐不如讓我們用 telnet 連接一下 Linux 機器﹐來一番完全的手工操作﹕

先建立連接﹕ telnet redhat52 25


您會看到這樣的回應﹕

Trying 192.168.0.17...
Connected to redhat52.siyongc.domain.
Escape character is '^]'.
220 redhat52.siyongc.domain ESMTP Sendmail 8.9.3/8.9.3; Sun, 5 Dec 1999 21:59:57 +1100

然後我們得先介紹一下自己的所在地﹕ HELO redhat52.siyongc.domain

250 redhat52.siyongc.domain Hello IDENT:root@redhat52.siyongc.domain
[192.168.0.17], pleased to meet you

正如您看到的回應﹐MTA 會非常友善的跟您打個招呼。
如果您要寄信的話﹐先把自己的地址寫在信封上(這是按照西方的信封書寫習慣啦)﹕ MAIL FROM: root@redhate52.siyongc.domain

250 root@redhate52.siyongc.domain... Sender ok

如果您的地址沒問題﹐然後輸入收信人地址﹕ RCPT TO: kenny@siyongc.domain

250 kenny@siyongc.domain... Recipient ok

如果收件人的地址沒問題的話(嘿﹗他們的效率還真快哦﹐不像我們的郵差﹐要等差不多一個星期才知道收信人地址不對)﹐接著您就可以輸入﹕ DATA

354 Enter mail, end with "." on a line by itself

以下就是寫信的內容了﹕ TO: kenny@siyongc.domain
Subject: Test Only

Hello Kenny,
This is a test only.
.


250 WAA02035 Message accepted for delivery


在開頭的兩行﹐我們稱之為 Header﹐我們使用 MUA 寫信的時候也是要輸入的。然後接一空白行(這行不能省)﹐再寫信肉。當您要完成信肉的話﹐另起一新行﹐只帶一個“.”符號就可以了。

最後﹐我們結束 SMTP 連線﹕ QUIT

221 redhat52.siyongc.domain closing connection
Connection closed by foreign host.



剛才是手工的寫一封信﹐下面﹐讓我們手工地收一封信﹕

telnet redhat52 110
您會看到這樣的回應﹕

Trying 192.168.0.17...
Connected to redhat52.siyongc.domain.
Escape character is '^]'.
+OK POP3 redhat52.siyongc.domain v7.59 server ready

然後您輸入POP 使用者名稱﹕ USER kenny

+OK User name accepted, password please

再輸入密碼﹕ PASS lw94&TC0

+OK Mailbox open, 1 messages

然後﹐您輸入﹕ LIST

+OK Mailbox scan listing follows
1 334
.

我們這裡可以看到使用者目前有一封郵件待取﹐如果您要看一看郵件內容﹐請輸入﹕ RETR 1
後面的數字表示郵件的排列號碼﹐如果有您有兩封郵件的話﹐可以輸入‘RETR 2’來看第二封。然後您就會看到郵件的內容﹕
+OK 334 octets
Return-Path:
Received: (from root@redhate52.siyongc.domain)
    by redhat52.siyongc.domain (8.9.3/8.9.3) id VAA01951;
    Sun, 5 Dec 1999 21:44:16 +1100
Date: Sun, 5 Dec 1999 21:44:16 +1100
From: root
Message-Id: <199912051044.VAA01951@redhat52.siyongc.domain>
To: kenny@siyongc.domain
Subject: test only
Status:

Hello kenny,
This is a test only.
.

如果您認為郵件1沒必要再留在 MTA 上面了﹐那麼您可以將之刪除掉﹕ DELE 1

+OK Message deleted

如果您完成了所有事情﹐要離開的話﹐可以輸入﹕ QUIT

+OK Sayonara
Connection closed by foreign host.

嘿﹗真給它氣死啦﹕居然來了句日本話呢﹗

如果您不能用 POP 連上您的 Linux 伺服器﹐可能您還沒開放 pop/imap 的daemon (還記得這個東東用來做什麼的﹖)﹐請修改您的 /etc/inetd.conf ﹐找到下面幾行﹐將之修改過來﹕ # Pop and imap mail services et al
#
pop-2   stream tcp   nowait root   /usr/sbin/tcpd ipop2d
pop-3   stream tcp   nowait root   /usr/sbin/tcpd ipop3d
imap   stream tcp   nowait root   /usr/sbin/tcpd imapd
#




然後﹐您還要讓 inetd 重新讀取設定哦﹕ /etc/rc.d/init.d/inet reload


如果狀況依然不能連上 POP ﹐您就要確定 imap 這套軟體是否已經安裝好﹐輸入﹕ rpm -qa | grep imap


如果得出來的結果什麼也沒有﹐那趕快先把 imap 裝好吧。 rpm -ivh /mnt/cdrom/RedHat/RPMS/imap*


到這裡﹐您就會發現﹕哦~~~原來 MUA 只不過幫我們輸入了那些命令罷了。在這一個過程中﹐關鍵的角色是 MTA 如何判斷郵件的路由﹐和如何將郵件傳給對方的 MTA。如果您還沒忘記我們在設定 DNS 裡面關於 MX 記錄的設定﹐或許應該略為知道 MTA 是如何通過 DNS 系統來找到對方網路的 MTA。但要 MTA 判斷出究竟將郵件傳給哪一個 MTA 卻是非常複雜的事情﹐恐怕已經超出這裡要說的範圍了。

不過﹐我非常推薦您看一下 http://turtle.ee.ncku.ed.../mailsys/ 這個網頁。相信對理解郵件系統的運作﹐非常有幫助。

設定sendmail

在 Redhat 6.0 裡面﹐已經自帶了一個 MTA﹐它就是聞名遐邇的 sendmail 系統了。如果說要設定 sendmail ﹐看一看它的設定檔 /etc/sendmail.cf 就像天書一樣﹗ 的確不是件容易的事情﹐如果要想弄懂它﹐有一本 1021 頁的 O'Reilly Sendmail可以看看。

我當然也沒這能力教你設定好一個完全的 sendmail 系統﹐不過﹐如果您只想 sendmail 幫您寄信的話﹐無需設定任何檔案。但條件是您的 DNS 要設好﹐而且對方也能反查得到您的 domain ﹐也就是說﹐最好您的domain 是一個註冊域名。因為當對方的郵件伺服器接到您的郵件請求之後﹐會看看寄信人地址是否可以回郵﹐否則會告訴您諸如“Sender domain must resolve”或“cannot route to sender” 這樣的信息。

換句話說﹐如果您的 DNS 沒有經過註冊﹐人們又怎樣寄信給您呢﹖有一個簡單的辦法是在 MAU 下面設定 repply address 到您的 ISP 或其它合法信箱。要完成一個順利的郵件傳遞﹐最好雙方都可以知道如何回郵﹐使用 DNS 是最普遍的做法。當然﹐您也可以使用 UUCP 或 static mapping 的方法啦﹐但別忘記設定是雙向的。

好了﹐現在假設您已經成功的註冊好 DNS 了﹐寄信應該沒問題了吧﹖但您有否發現﹐從您的 Linux 主機幾出去的郵件﹐其回郵地址格式是這樣的︴email]Ruser@host.your.domain.name[/email] 呢﹖如果您按 Repply 回復到這個地址﹐應該沒問題的﹐但您有試過使用 user@your.domain.name 這樣的格式嗎﹖試試就知道了﹕如果您沒做任何設定﹐這樣的地址是寄不到使用者信箱的。

有辦法解決嗎﹖當然有啦﹐而且很簡單呢﹗您只要將 your.domain.name 放進 /etc/sendmail.cw這個檔案就可以了﹐這是用來設定郵件伺服器別名的檔案。如果您有多個別名(或曰 domain )要這台主機接收﹐那麼將它們全部寫進這個檔案﹐一個名稱佔一行。然後﹐您竟然無需重新啟動 sendmail 或任何服務﹐設定就已經生效了﹗

呵呵~~~是否很開心呢﹖不過﹐您有沒有意識到一個問題﹕您使用的 intertnet 連線是固定的還是間斷的呢﹖如果您使用 modem 撥接的話﹐當您下線後﹐如何進行郵件交換呢﹖在預設情況下﹐如果 sendmail 收到郵件傳遞請求之後﹐會即時進行﹐如果因為其它原因(包括離線)而不能即時傳遞的話﹐會將郵件存列於 /var/spool/mqueue 目錄之下﹐然後每隔 1 小時(視乎設定)嘗試重遞﹐如果 4 小時之後還未能送出﹐會發出一封警告信給寄信者﹔如果5 天之後還在 queue 裡面﹐那麼這封信就會退回寄信者了。

假如別人也是用 sendmail 來寄信給您的 domain 的話﹐如果您的伺服器下線了﹐對方也會將信存在 queue 裡面。由此可見﹐使用 ppp 連線並不是理想的郵件傳遞方式。如果您不能建立一條固定的 internet 連線﹐那麼﹐將 DNS 和 Mail 都交由您的 ISP 保管好了。如果是這樣的話﹐您只要在 /etc/sendmail.cf 這個檔案裡面﹐找到這行(大約在 97 行的位置)﹐將之修改為﹕ DSmailserver.isp.net




(注意句子沒有空白鍵)。這樣的話﹐當您的伺服器在線的時候﹐那些不能即時傳遞而存在 queue 的郵件﹐或那些伺服器本身不知道如何傳遞的郵件(如那些非本地郵件)﹐就會第一時間傳給 ISP 的郵件伺服器﹐讓他們代理您的傳遞﹐而您呢﹖Sit back & relax!

設定 fetchmail

哈哈﹐別高興得太早啦~~~ 收信呢﹖﹖是哦~~~ 怎麼收﹖您大可叫您的 ISP 為每一個使用者建立信箱﹐然後讓他們通過 POP 去取信。但這樣的話﹐費用顯然會比較高﹐而且如果以後人員更換的話﹐還得勞煩上頭幫您修改。為何不這樣﹕只需在 ISP 建立一個帳號﹐然後所有的使用者都可以收信呢﹖

可以造到嗎﹖

沒問題﹗

不過﹐除了 sendmail 之外﹐您還得使用另一個程式﹐叫做 fetchmail 的東東。不過﹐條件是 DNS 交由 ISP 管理﹐或從外面透過 DNS 查詢到的 MX 記錄指向 ISP 的伺服器﹔也就是說﹐他們會幫您代收所有傳給您 domain 的郵件﹔同時 ISP 還必須會將所有傳給您 domain 的郵件餵進那個單一信箱去。如果他們不會做﹐只要他們也使用 sendmail ﹐您教他們修改一個檔案﹕/etc/mail/virtusertable ﹐加入﹕

@your.domain.name      isp_account@isp.net




跟著執行﹕ makemap -r hash /etc/mail/virtusertable.db < /etc/mail/virtusertable


這裡假設他們在設定 sendmail 的時候已經定義出‘FEATURE(virtusertable)’這個功能。而且﹐使用的資料庫格式為‘hash’﹐如果他們使用 dbm 格式的話﹐將 hash 改成 dmb 就可以了。

然後﹐您自己還要修改/etc/sendmail.cf 這個檔案(大約在 91 ﹑136﹑141 和 1032 行)﹕ ......
Dj$w.your.domain.name
......
#CL root
#CE root
CM root
......
DMyour.domain.name
......
R$*               $#error $@ 5.7.1 $: "550 Relaying denied"
......




(在修改 /etc/sendmail.cf 的時候務必注意﹕句子開頭帶空白鍵﹐或 Tab﹐或是沒有空白﹐效果都不一樣。以上所舉的句子都是直接用字母開頭的﹗)

修改好之後﹐重新啟動 sendmail : /etc/rc.d/init.d/sendmail restart


接著﹐我們在 root 的家目錄 /etc/root 裡面﹐建立這樣一個檔案﹕.fetchmailrc (別少了前面的‘.’﹗) ﹕ set postmaster "postmaster"
poll mail.isp.net with proto POP3
localdomains your.domain.name
    user "isp_account" there with password "hBg7-rE10" is * here options fetchall




如果您能進入 X Windows﹐可以執行 fetchmailconf 用 GUI 來設定這個檔案。因為在這個檔案裡面﹐包含了您的 ISP 帳號和密碼﹐為避免其它使用者看到﹐請執行﹕ chmod 0600 .fetchmailrc


這樣設定基本已經完成了﹐以 root 的身份執行fetchmail -d 300﹐這樣每隔 5 分鐘﹐fetchmail 就會幫您從 mail.isp.net 的 isp_account 帳號下載郵件﹐同時還會分發到各個使用者的本地郵箱中去。但您也可以使用定時器來設定 fetchmail 的執行動作。例如﹐執行﹕ crontab -e


然後加入這行﹕ 0,20,40 * * * * /usr/bin/fetchmail -v




這樣系統每隔 20 分鐘就會幫您執行 fetchmail 了﹐當然﹐您的連線也要設定好啦。例如﹐您可以使用 Diald 來實現自動連線﹐不過﹐我這裡略過這部份的討論﹐因為我還沒實際設定過。如果您設定 diald 成功﹐可否將步驟寄來給我呢﹖或許有空我測試出來再和大家分享吧。

設定轉遞 (aliases)

如果您不善忘的話﹐我們在設定 httpd ﹑news﹑fetchmail 等服務的時候﹐都常會指定一個管理者的信箱名稱(也可以是地址)﹐例如﹕webmastet﹑postmaster 等等。您或許知道這些使用者其實並沒有出現在 /etc/passwd 中﹐那麼傳給他們的郵件又會寄哪裡去了呢﹖這個秘密﹐就是郵件伺服器的 alias 功能啦﹐也有人稱之為‘mail list’。說穿了其實只是一個檔案﹕/etc/aliases 。如果您用 vi 去開啟這個檔案﹐多看兩遍您就知道是怎麼回事了。

在 /etc/aliases 這個檔案中﹐您會發現沒有“#”註解的每一行﹐開始都是一個名稱﹐然後跟著一個“﹕”符號﹐然後在其右邊又有其它的名稱。其工作原理是﹕當 sendmail 收到一個本地郵件的時候﹐會檢查這個 /etc/aliase 檔案﹐如果發現“﹕”左邊的名字跟接收者名稱吻合﹐就會將郵件轉遞給“﹕”右邊的名稱。在右邊的名稱﹐可以多過一個﹔也可以是另一個郵件地址﹔也可以指向一個檔案或程式。當郵件轉給右邊之後﹐又重新找一遍這個 /etc/alias 裡面的設定﹐直到再找不到左邊名稱為止。例如下面這個例子﹕ MAILER-DAEMON: postmaster
postmaster:   root
daemon:       root
root:       netman, kenny
kenny: "| sendmail kenny@other.mail.net"
sales:      sales-list
sales-list: ":include:/etc/sales.list"




這樣﹐凡是傳給 MAILER-DAEMON 的就會轉給 postmaster ﹐然後再轉給 root﹐另外 daemon 也會轉給 root﹐而 root 呢﹐又分別轉給 netman 和 kenny﹐最後 natman 再也找不到名稱了﹐直接送到 netman 的信箱去﹔而 kenny 呢﹖則通過 sendmail 轉到 kenny@other.mail.net 那個地址去。另外﹐我們只需建立一個 /etc/sales.list 這樣的檔案﹐在裡面寫上所有 sales 的名稱﹐可以全部為一行﹐用‘﹐’和一個空白鍵分隔﹔這樣﹐所有 salse 都會收到寄給 sales 的郵件了。

不過﹐剛才稍微騙了您一下﹐sendmail 真正讀取的並不是 /etc/aliases 這個檔案﹐而是另一個經過資料庫格式過的檔案﹐我們無需知道它叫什麼﹐只要您滿意您的 /etc/aliases 檔案之後﹐馬上執行﹕ newaliases
注意一下有沒有錯誤信息﹐有則重複修改檔案和執行 newaliases ﹐直到再沒錯誤為止。

進一步修改

到此為止﹐您的 sendmail 已經足以應付日常需要了﹐但有時候您還可能進行額外的設定﹐以符合實際的需求。如果您懂得直接修改 sendmail 的設定檔的話﹐您可以直接修改﹐例如 /etc/sendmail.* ﹐而 /etc/mail/* 的檔案呢﹐您會發現它們大多數都是配對的﹐每個檔案都會對著一個 *.db 的檔案。您可對那些沒有 .db 的檔案修改﹐然後執行﹕ makemap -r hash /etc/mail/file.db < /etc/mail/file


就可以將之編譯成指定的數據庫格式了(通常會是 hash 或 dmb 兩種)﹐因為 sendmail 只會去讀取經過格式化的數據庫啦。例如﹐sendmail 在預設情況下是將 RELAY 功能關閉了﹐也就是說﹐除非指定的主機(或 domain)﹐別的郵件伺服器是不能通過您的 sendmail 傳遞郵件的。如果您要開放 RELAY 給某些主機(或 domain)﹐您可以先修改 /etc/mail/access 這個檔案:

debian            RELAY
debian.home      RELAY
home            RELAY
192.168.1      RELAY




然後執行下列命令就可以了﹕ makemap -r hash /etc/mail/access.db < /etc/mail/access


但還有一個更簡單的方法﹐就是確定 /etc/sendmail.cf 檔案有這樣一行(大約在 123 行附近吧)﹕ FR-o /etc/mail/relay-domains




然後建立起 /etc/mail/relay-domains 這個檔案﹐將所有要 relay 的機器(或 domain ) 寫進這個檔案﹐每個名稱佔一行﹐這樣就可以了。

其實﹐來來去去這些設定﹐無非都在 /etc/sendmail.cf 這個檔案中﹐但要修改這個一千多行的檔案可不容易哦﹐搞不好您的 sendmail 就不工作了呢。如果您要手工修改它﹐一定要備份一個 copy 哦~~~。

那麼﹐有沒有容易些的設定呢﹖有的﹐就是使用 M4 啦。不過﹐我不打算詳細教您怎樣用 M4 來設定 sendmail.cf ﹐但您可以從下面的案例中看看如何使用 M4 這個程式。

架設Mail Proxy

我們都知道﹐如果使用郵件伺服器﹐最好有自註冊了的 domain ﹐否則充其量只能用在內部網路之上。難道這是縮命嗎﹖非也﹗在下面的案例中﹐我主要參考 http://www.linuxgazette.co...tumpel.html 這篇文章﹐成功讓沒有註冊的 domain 使用者分享一個 ISP 郵件信箱。準確來說﹐還不是 100% 成功啦。例如﹐我暫時不能使用同一台主機同時負責 SMTP 和 POP 的服務﹐同時﹐還得裝一台 Debian 2.1機器(請參考﹕http://www.linpus.com.tw/manual/debian2.1/index.htm 進行安裝)﹐在 Debian 上不能跑 sendmail﹐而是用 Exim 代替﹔最缺陷的是﹐在回郵地址中﹐必須使用‘ user<isp_account@isp.net>’的格式﹐缺一不可。

如果您對這樣的一個系統有興趣﹐可以繼續往下看﹐也歡迎共同研究研究。

1﹐首先﹐修改您的 /etc/sendmail.mc divert(-1)
dnl This is the macro config file used to generate the /etc/sendmail.cf
dnl file. If you modify thei file you will have to regenerate the
dnl /etc/sendmail.cf by running this macro config through the m4
dnl preprocessor:
dnl
dnl     m4 /etc/sendmail.mc > /etc/sendmail/cf
dnl
dnl You will need to have the sendmail-cf package installed for this to
dnl work.
include(`/usr/lib/sendmail-cf/m4/cf.m4')
define(`confDEF_USER_ID',``8:12'')
OSTYPE(`linux')
define(`ALIAS_FILE',`/etc/aliases')
undefine(`UUCP_RELAY')
undefine(`BITNET_RELAY')
define(`confAUTO_REBUILD')
define(`confTO_CONNECT', `1m')
define(`confTRY_NULL_MX_LIST',true)
define(`confDONT_PROBE_INTERFACES',true)
define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')
FEATURE(masquerade_envelope)
FEATURE(genericstable, `hash -o /etc/mail/genericstable')
GENERICS_DOMAIN_FILE(`/etc/mail/genericsdomain')
define(`SMART_HOST',`mail.isp.net')
FEATURE(`smrsh',`/usr/sbin/smrsh')
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable')
FEATURE(redirect)
dnl FEATURE(always_add_domain)
FEATURE(use_cw_file)
FEATURE(local_procmail)
MAILER(procmail)
MAILER(local)
MAILER(smtp)
FEATURE(`access_db')
FEATURE(`blacklist_recipients')
dnl We strongly recommend to comment this one out if you want to protect
dnl yourself from spam. However, the laptop and users on computers that do
dnl not hav 24x7 DNS do need this.
dnl FEATURE(`accept_unresolvable_domains')
dnl FEATURE(`relay_based_on_MX')




注意﹕請將 SMART_HOST 改成您自己的 ISP 郵件主機。

2﹐然後備份好 /etc/sendmail.cf 再執行 m4﹕ cp /etc/sendmail.cf /etc/sendmail.cf.orig
m4 /etc/sendmail.mc > /etc/sendmail.cf


3﹐將您的郵件主機名稱和本地 domain 名稱 加進 /etc/mail/genericsdomain裡面去(一個名稱一行)。

4﹐ 設定好使用者的郵件地址轉換﹐請修改/etc/mail/genericstable﹐其內容類似如下(請參照自己的實際情形修改)﹕netman     isp_account@isp.net
kenny       isp_account@isp.net
user1       isp_account@isp.net




其中﹕左邊為本地使用者﹐右邊為 ISP 的郵件帳號地址。

5﹐產生genericstable.db﹐請執行﹕ makemap -r hash /etc/mail/genericstable.db < /etc/mail/genericstable
/etc/rc.d/init.d/sendmail restart


6﹐然後轉到在 Debian 2.1 機器上面﹐進入 X Windows 裡面執行 fetchmailconf 來設定﹐或直接修改 .fetchmailrc 檔案(在執行下載任務之使用者家目錄之下) ﹐其內容類似如下﹕ # Configuration created Mon Sep 27 00:37:13 1999 by fetchmailconf
set postmaster "postmaster"
poll mail.isp.net with proto POP3
    user "isp_account" there with password "hBg7-rE10" is netman here
options fetchall warnings 3600




(注意﹐這個檔案比前面的例子略有不同。)

7﹐在 netman (或是在 fetchmailrc 指定的本地接收者) 的家目錄裡面修改 .forward 檔案﹐讓其內容類似如下﹕ #Exim filter
if $header_to: contans netman then deliver netman endif
if $header_to: contans kent then deliver kent endif
if $header_to: contans usr1 then deliver user1 endif




(注意﹕如果使用 sendmail 來執行本地郵件的話則會出現錯誤。)

設定基本如此﹐您只需在 MUA 那端將 SMTP 指向 Redhat 機器﹐而將 POP 指向 Debian 機器就可以了﹐且 ‘Identity’那裡一定要輸入使用者名稱(和本地郵件帳號名稱一至) 。通過 Redhat 傳出去的信件都會自動將回郵地址改成 user<isp_account@isp.net> 的地址﹐所以對方只要按 Repply 就可以了。但是如果對方要新撰寫郵件給您的本地用戶﹐必須也要依照上述格式才可。否則所有郵件都只能下載到 fetchmail 指定的使用者那裡﹐而不會再分發出去了。

架設虛擬郵件主機

相信您已經知道如何修改 sendmail.cw 讓 sendmail 接收不同 domain 的郵件了。而且﹐從前面的 virtusertable (也就是“ 設定 fetchmail ”那裡)的設定例子來看﹐也知道如何讓 sendmail 將一個地址轉寄到另外一個地址去。但無論如何設定﹐如果目的地的信箱是在本 sendmail 機器上的話﹐所使用的帳號將會是 Linux 的系統帳號。舉個例子說﹕

我們修改 /etc/sendmail.cw 讓 sendmail 可以接收另外兩個 domain 的郵件﹕

#
#--- 下面是虛擬 domain: ---
v1.test.domain
v2.test.domain




負責這兩 domain 的郵件主機分別為 mail.v1.test.domain 和 mail.v2.test.domain。這裡﹐我們假設這兩台虛擬主機的 IP Alias 和路由都已經設定好了。同時 DNS 那邊也已經設定好這兩個 domain 了(DNS 的設定方法請參考“ 架設 DNS ”)﹐MX 和 A 記錄都指向本主機。

然後﹐我們建立兩個帳號﹕v1test1 和 v2test2 。當 sendmail 接收到 v1test1@v1.test.domain 和 v2test2@v2.test.domain 這樣的郵件時﹐它可以輕鬆的將郵件分寄給 v1test1 和 v2test2 這兩位使用者。他們只要將 POP server 分別設為 mail.v1.test.domain 或 mail.v2.test.domain ﹐或干脆用本機的真實名稱﹕ redhat52.siyongc.domain ﹐就可以將信件取回去閱讀。Tips: 如果您想讓帳號只能上來收 email 的話﹐可以直接修改 /etc/passwd﹐將使用者的 GID 設為 45 ﹐同時將 shell 改為 /bin/false 。假如 GID 45 還沒存在於 /etc/group 中的話﹐可以用這個命令設定﹕ groupadd -g 45 popusers 。

但如果 v1.test.domain 和 v2.test.domain 都想有一個帳號 test 來接收各自的郵件呢﹖注意﹕他們可不是相同的人哦﹐怎麼辦呢﹖

方法之一是用 virtusertable 來做﹕修改 /etc/mail/virtusertable﹐讓它包括這兩行﹕

test@v1.test.domain      v1test1
test@v2.test.domain      v2test2




然後執行﹕ makemap -r hash /etc/mail/virtusertable.db < /etc/mail/virtusertable
service sendmail restart


這樣的話﹐v1test1 就可以收到 test@v1.test.domain 的郵件了﹐而 test@v2.test.domain 則會轉給 v2test2 這位使用者。這時候﹐v1test1 的 POP server 可以用 mail.v1.test.domain ﹐而 v2test2 則可以用 mail.v2.test.domain 。但有一個問題是﹕在 v1 和 v2 這兩 domain 下﹐他們不能共用 test 這個帳號來登錄﹕要麼將 test 給 v1 用﹐讓 v2 繼續用 v2test2 ﹔或者是相反。

假如 v1 和 v2 都堅持要用 test 這個帳號來取信﹐有辦法解決嗎﹖

哈哈﹐誠如您一直看下來的感覺﹕凡是網中人在 study-area 提出這樣的問題﹐大多數情形是已經備好答案的了。沒錯﹕可以﹗

做法是﹕將您的 Redhat 升級到 6.1 或以後的版本﹐同時確定下面的程式存在﹕

/usr/lib/linuxconf/lib/vpop3d

再來呢﹐參考 RUN PC 第 74 期刊 163 頁的介紹就可以做到。底下的步驟是網中人參考 RUN PC 的做法﹐在 Linpus6.4 (Redhat6.2)的實作經驗﹕



完成並確定 IP Alias﹑routing﹑DNS 等相關設定﹐我建議您為 domain 本身指定一個 A 記錄。下面是 v1.test.domain 的正解範例﹕

$TTL 86400
@ IN SOA linpus64.dmz.domain. root.linpus64.dmz.domain.
    ( 00071401 7200 3600 3600000 86400 )
@ IN NS linpus64.dmz.domain.
@ IN MX 10 mail.v1.test.domain.
@ IN A 203.30.35.132
mail   IN A 203.30.35.132
    IN MX 5 mail.v1.test.domain.





將 /etc/sendmail.cf 備份好﹕ cp /etc/sendmail.cf /etc/sendmail.cf.bak



修改 /etc/inetd.conf ﹐找到 pop-3 那句﹐將之修改如下﹕ pop-3 stream tcp nowait root /usr/sbin/tcpd /usr/lib/linuxconf/lib/vpop3d ipop3d


(注意﹕上面為一整句。)


接著執行﹕ service inet restart



再來執行﹕ linuxconf



在 Config 下選擇 Networking --> Server tasks --> Mail delivery system (sendmail) --> Basic --> Configure virtual email domain。


按 Tab 鍵跳到 Add ﹐在 Virtual domain (fqdn) 後面填上虛擬 郵件的 domain 名稱﹐如﹕ v1.test.domain。

這裡要注意的一個問題是﹕不建議您同時為 mail.v1.test.domain 和 v1.test.domain 設定虛擬 domain﹐僅用 domain name 就好了。因為﹐如果兩個都設定起來的話︴email]Mtest@mail.v1.test.doma[/email]in 和 test@v1.test.domain 將是不同的兩個帳號。只要 DNS 的 MX 設定好就行﹐反而 sendmail.cw 的設定卻與此無關。


按 Tab 鍵跳到 Accept ﹐並 Enter。


按 Tab 鍵跳到 Quit ﹐並 Enter。


當看到“ Generating /etc/sendmail.cf ”警告的時候﹐按 Tab 鍵跳到 Yes ﹐並 Enter。(如果再有警告字眼的話﹐也是按 Tab 鍵跳到 Yes)﹐最後 OK。


在 Config 下選擇 Users accounts --> Special accounts --> Virtual POP accounts (mail only)。


選擇剛才建立的虛擬郵件主機﹐並 Enter。


按 Tab 跳到 Add﹐在 Login name 輸入虛擬帳號名稱﹐如﹕ test 。


按 Tab 鍵跳到 Accept ﹐並 Enter。


輸入第一次密碼並 Enter﹐然後才輸入第二次密碼。如果您錯過了﹐多按幾次 Tab 就是了。


按 Tab 鍵跳到 Accept ﹐並 Enter。然後 OK。


按 Tab 鍵跳到 Quit ﹐並 Enter。連續三次﹐直至見到 “ Activate the changes ”字句﹐再直接 Enter。

到這裡﹐可以說已經完成了虛擬郵件主機的設定了。您只要將 client 的 POP server 指向虛擬郵件主機(mail.v1.test.domain)就可以將郵件下載回來。不過有一個地方要注意的是﹕不建議在 MUA 上使用 IP 來指定虛擬主機的地址﹐而應該用它的 FQDN 。而且﹐當虛擬主機架設起來後(使用 vpop3d)﹐原來真實的帳號反而用不了﹐您必須將真實 domain 虛擬化。其情形就像 Apache 的 Name-based Virtual Host 一樣。

到目前為止﹐我還找不出除了 linuxconf 之外的方法來建立虛擬郵件主機和帳號。只知道系統會去修改 /etc/sendmail.cf﹑/vhome﹑/etc/vmail﹑和 /var/spool/vmail 等地方。假如日後測試出來再和大家分享經驗吧。

設定 SMTP 認證

通過 POP 協定連接遠端郵件主機的時候﹐使用者要提供帳號和密碼﹐等通過認證後才能將郵件取回。但是﹐使用 SMTP 連接遠端郵件主機送信的話﹐卻無需使用認證﹐這完全取決於 sever 那端如何設定其 RELAY。雖然 sendmail 利用 RELAY 的限制來阻止了許多不必要的郵件轉遞﹐但是如果您想開放您的 sendmail 給那些從不同 ISP 上網的員工或有關人員的話﹐這樣的限制反而會變得非常的麻煩。

不過﹐如果您有打算將 sendmail 升級到 8.10 或以後的版本﹐您可以利用一個叫做“ SMTP 認證”的功能﹐讓那些通過認證的使用者解決 RELAY 的問題﹐而且還可以為系統提供更好的安全保護和追蹤。下面是我根據 http://beta.wsl.sinica.edu.tw/~ylchan...-auth/index.html 上面的文章而實作出來的。同時還用這隻 perl script 來架起 POP Before SMTP 這個方案﹐請參考http://poprelay.sourcefor...relay.html 一文。

步驟如下﹕


假如您已經裝有舊版的 cyrus-sasl ﹐那麼將 /usr/lib/sasl 和 /usr/local/lib/sasl 移除。


把 cyrus-sasl-1.5.21.tar.gz 和 sendmail-8.10.2.tar.gz 還有 poprelayd 下載至 /usr/src 目錄。(或請運用自自己的搜索能力尋找以上檔案)


然後依順序執行﹕ cd /usr/src
tar zxvf cyrus-sasl-1.5.21.tar.gz
tar zxvf sendmail-8.10.2.tar.gz
tar zxvf poprelayd.tgz
cd poprelayd
cp poprelayd /usr/local/sbin/
cd cyrus-sasl-1.5.21
sh ./configure --enable-login --enable-plain
make
make install
ln -s /usr/local/lib/sasl /usr/lib
ln -s /usr/local/lib/libsasl* /usr/lib
cat > /usr/lib/sasl/Sendmail.conf #(注﹕請留意大小寫)
pwcheck_method: shadow
(按 Enter 後按 ctrl+D)
cd sendmail-8.10.2/devtools/Site
cat > site.config.m4
PREPENDDEF(`confMAPDEF', `-DMAP_REGEX') dnl #(註﹕左邊的 ` 符號在 1 鍵左邊)
PREPENDDEF(`confOPTIMIZE', `-O6') dnl #(註﹕O為大寫英文字母 o )
APPENDDEF(`confENVDEF', `-DTCPWRAPPERS -DSASL')
APPENDDEF(`conf_sendmail_LIBS', `-lwrap -lsasl')
APPENDDEF(`confLIBDIRS', `-L/usr/local/lib')
APPENDDEF(`confINCDIRS', `-I/usr/local/include')
(按 Enter 後按 ctrl+D)
cd sendmail
sh Build
cd cf/cf
cp generic-linux.mc sendmail.mc
cat feature/access_db.m4 >> sendmail.mc
cat feature/delay_checks.m4 >> sendmail.mc
cat feature/virtusertable.m4 >> sendmail.mc
cat >> sendmail.mc
TRUST_AUTH_MECH(`LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `LOGIN PLAIN')dnl
(按 Enter 後按 ctrl+D)


然後將下面這個內容也加入剛纔建立的 sendmail.mc 檔內﹕ # We probably want the access_db feature enabled.
## FEATURE(access_db)dnl

# List of IP addresses we allow relaying from.
Klocalip hash -a<MATCH> /etc/mail/localip
Kpopip hash -a<MATCH> /etc/mail/popip


LOCAL_RULESETS


SLocal_check_rcpt
# Put the address into cannonical form (even if it doesn't resolve to an MX).
R$*                  $: $>Parse0 $>3 $1
R$* < $* > $*            $: $1 < $2 . > $3                        Pretend it's canonical.
R$* < $* . . > $*      $1 < $2 . > $3                              Remove extra dots.

# Allow relaying if the connected host is a local IP address.
R$*                  $: < $&{client_addr} >                  Get client IP address.
R<>                  $#OK                              Local is ok.
R< $* . $- > $*      $(localip $1.$2 $: < $1 > . $2 $)      Check last three octets.
R$* < MATCH >            $#OK
R< $- > $*            $: $(localip $1 $: < > $1 $2 $)            Check first octet.
R$* < MATCH >            $#OK

# Allow relaying if the connected host has recently POP3 authenticated.
R$*                  $: < $&{client_addr} >                  Get client IP address.
R< $* >            $(popip $1 $)                        Check full address.
R$* < MATCH >            $#OK

# IP address didn't match.




完成後﹐繼續下面的動作﹕ sh Build sendmail.cf
service sendmail stop
mv /etc/mail /etc/mail.bak
mv /etc/sendmail.cf /etc/sendmail.bak
mkdir /etc/mail
cp sendmail.cf /etc/mail
cd sendmail
sh Build
sh Build install
cd ..
sh Build install
cd /etc/mail
mv sendmail.cw ./local-host-names
ln -s /etc/mail/local-host-names /etc/sendmail.cw
cp /etc/mail.bak/access .
makemap -r hash access.db < access
makemap -r hash virtusertable.db < virtusertable
mv aliases* .
ln -s /etc/mail/aliases* /etc
newaliases
echo "192.168" > localip
makemap hash localip.db < localip
makemap hash popip < /dev/null



好了﹐到這裡﹐可以說已經完成任務了。然後輸入﹕ sendmail -O Loglevel=20 -bs
ehlo localhost
quit


假如您有看到其中有這樣的字眼﹕250-AUTH LOGIN PLAIN ﹐那就真的恭喜您了﹗否則的話﹐您應該從頭 debug 所有的步驟。假如您認為您的 /etc/mail/sendmail.cf (注意路徑) 可能有問題。

根據網友 阿丁 提供的參考﹐如果您按以上步驟安裝完還不能工作﹐可以考慮試試下這樣的命令﹕ chmod 755 -R /etc/mail
chmod 755 -R /usr/lib/sasl



當確定 sendmail 那邊已經測試成功之後﹐別忘了將 sendmail 重新啟動﹕ /usr/local/sbin/poprelayd -d
echo "/usr/local/sbin/poprelayd -d &" >> /etc/rc.d/rc.local
service sendmail start



再來就是設定您的 MUA﹐例如﹕


Outlook Express: 將“我的伺服器需要查驗身份”打勾。


Nescape Mail: 填上“Outgoing mail server user name:”。

另外﹐很感謝 曾文彥 兄<wayne@helios.com.tw> 的熱心回報﹐您可以 參考這裡 以確定您的 Outlook Express 設定。

如果您不想設定 MUA﹐那麼只要您先連線到郵件主機的 POP 服務﹐退出後就可以用該主機來寄信了﹐不管您在哪裡連上來都行。在 POP 登錄後﹐您有 15 分鐘時間將信寄出﹔而系統則預設則每 5 秒鐘檢查一次是否有人 POP 上來過﹐從而為之打開 RELAY 的大門。如果您想修改這些時間間隔﹐可以編輯 /usr/local/sbin/poprelayd 這個檔﹐分別修改如下兩行中的數字則可﹕

$timeout_minutes = 15;       # Minutes an entry lasts.
$log_wait_interval = 5;       # Number of seconds between checks





我必須在這裡指出一點是﹕我這裡用的系統是一個新裝的 Linpus6.4 Linux﹐其實就是 Redhat6.2﹐而且是從原已運作的 sendmail 升級上來的。如果您在編譯的過程中遇到 library 的問題(諸如: xxxxxx undeclared ...)﹐那就需要更多的努力先將套件所需的 library 裝好才能繼續。同時﹐編寫設定檔的時候也要格外小心鍵盤敲擊的準確性﹐就算由於拼寫錯誤而令設定檔有誤﹐安裝並不會因此而中斷﹐且較難察覺其中的不實。

假如您將 SMTP AUTH 和前面介紹的“虛擬郵件主機”混合在一起使用﹐在將來的修改過程中﹐可能會引至某些問題。而至於所引出的問題﹐恐怕已經超過這裡要說明的了。我建議同時保留 /etc/sendmail.cf 和 /etc/mail/sendmail.cf 兩份檔案﹐如果您會得將兩者的內容同步就更好不過。

其它

另外﹐有些公司或許會想到照顧離職的員工的轉信要求﹐但又不想將所有信件都轉到其新郵箱去﹐例如﹐和原工作相關的客戶郵件﹐那最好是讓系統自動回覆一封郵件給發信人﹐告知員工離職的消息﹐如果還有其新的信箱地址﹐也一並告知﹐然後讓發信人自己決定。完成如下的操作﹕


執行﹕ tar zxvf mailrtn.sh.tgz
cp mailrtn.sh /etc/smrsh
mkdir /etc/mail/disable



然後將離職員工的新郵件地址寫好﹕ echo "user_name@new.company.com" > /etc/mail/disable/user_name



修改 /etc/mail/aliases﹐參考如下格式﹕ user_name: "|/etc/smrsh/mailrtn.sh user_name"



更新 aliases 資料庫﹕ newaliases


這樣的所有寄到 user_name 這個賬號的郵件﹐都將產生一封回應給寄信人﹐告知員工離職的消息﹐同時把新的郵件地址也告訴對方。不過﹐要提醒一點的是﹐雖然我將 script 放在 /etc/smrsh 目錄下﹐但其實我的 sendmail 並沒有啟用 smrsh 功能。如果您使用 smrsh 的話﹐那就要先先花時間解決 smrsh 的問題了。

測試

如果您在測試過程中遇到困難﹐可以先查一查 /var/log/maillog 這個檔案﹐看看 server 傳遞是否完成(denied 或 accepted)﹐由此判斷出問題的原因﹕

如果您在寄信的時候會遇到 Relay denied 的問題﹐這可能是您的 MUA 所在的機器(或網域)不在 /etc/mail/access 或 /etc/mail/relay-domains 檔案裡面。(也可以參考下一提示內容)
如果您碰到“sender domain must exist”或“cannot route to sender” 的問題﹐那么要確定在 MUA 所填寫的 Repply Address 是一個合法地址﹐或是能夠被對方 route back 得到的。
如果可以寄信卻不能收信﹐那麼檢查一下 /etc/inetd.conf 裡面的 POP 和 IMAP 是否打開了。還要確定 imap 軟體已經裝好。
另據何金營網友提供的訊息﹐用這個動作或許有助哦﹕執行netconf → 點server tasks → 點Basic Services → 點servers → 點POP3 → 設Active,然後退出後儲存即可。
另外﹐和 sendmail 最緊密合作的莫過於 DNS 了﹐您一定要確定您的 DNS 要設定正確(完全正確﹗)。例如﹕如果您遇到 MX loop back 的問題﹐那麼查一下這台主機所有的別名,將它們全部加入到 /etc/sendmail.cw(或/etc/mail/local-host-names) 檔案內。
如果您設定好 sendmail.cw(或/etc/mail/local-host-names) 但仍然不能用 domain.name 收信﹐那麼請檢查 DNS 有沒有為 domain 指定 MX﹔同時也可以試試為 domain 自己指定一個 A 記錄(但我不鼓勵如此)﹐如﹕
@ IN MX 10 mail.server.domain.name.
@ IN A 192.168.0.1
如果您在啟動 sendmail 的時候會延遲很久﹐那麼請確定 /etc/hosts﹑/etc/HOSTNAME﹑ 和 DNS 關於這台機器的名稱設定正確。同時﹐手工輸入
hostname your.mail.server.name
也可以(暫時)解決問題。
還有﹐如果您使用 fetchmail 來下載郵件﹐要確定 .fetchmailrc 的執行權限﹐還有雙方的使用者(及密碼)要指定正確﹐以及各使用者的信箱要被建立好。
有時候﹐使用前面教的 telnet 方式連接﹐也有助於我們發現問題所在。
再有其它問題的話﹐還是到 BBS 或 NEWS 板問問吧﹐但問之前先把資料整理出來﹐越詳細越好。
假如您將 sendmail 升級到 8.10 版本以後﹐要留意一點是﹕sendmail 的設定檔都搬到 /etc/mail 目錄下面了﹐包括 sendmail.cf﹑aliases 等。而且﹐ sendmail.cw 已經改用 local-host-names 了。
善用 sendmail ﹐您可以做到許多意想不到的事情哦~~~﹐您自己慢慢發掘吧﹗



獻花 x0 回到頂端 [樓 主] From:台灣中華電信 | Posted:2005-10-23 20:28 |
mnbmnb5266
個人文章 個人相簿 個人日記 個人地圖
小有名氣
級別: 小有名氣 該用戶目前不上站
推文 x5 鮮花 x46
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

感謝大大詳細完整的教學,受益匪淺啊


我的收藏
https://pan.baidu.com/s/1QUJ9lr_VzxXKRJAlBJgUQA
提取码:am2c
獻花 x0 回到頂端 [1 樓] From:加拿大Rogers | Posted:2010-08-24 22:28 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.061338 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言