Sendmail - 建立 Mail Server

1、前言

本篇實作為使用 Sendmail 來當您的 MTA,E-Mail 與 DNS 設定息息相關,因此當 Mail 寄不出去或收不到時除了檢查 Mail 的設定及 maillog 之外,也別忘了 DNS 中 MX 設定是否正常,且 DNS Server 設定後最好開機等 24 小時之後,等大家都更新對您的 DNS Record 之後這樣信件的解析才能運作順暢哦。






文章目錄

1、前言
2、實作環境
3、安裝及設定
         步驟1.修改 /etc/mail/access
         步驟2.產生 access.db
         步驟3.安裝 POP3 套件
         步驟4.修改 Inetd 設定檔 (/etc/inetd.conf)
         步驟5.建立 /etc/mail/local-host-names
         步驟6.重新啟動相關服務
4、補充1.相關檔案功能說明
5、補充2.在伺服器上手動寄信
6、參考
7、Me FAQ
         Q1.如何快速清除 Sendmail Queue?
         Q2.sm-mta[29616]: gethostbyaddr?
         Q3.發信時 Log 顯示 host name lookup failure?





2、實作環境

  • FreeBSD 4.8-RELEASE





3、安裝及設定

步驟1.修改 /etc/mail/access

Sendmail 一般皆內建於 FreeBSD 中不必另外安裝,您可複製 access.sample 範例檔案來進行修改,access 為一般文字檔案主要功能為設定限制條件。
vi /etc/mail/access
 weithenn.org             RELAY      //允許此網域名稱能寄信
 192.168.1                RELAY      //允許內部網段能寄信 




步驟2.產生 access.db

修改完剛才的 access 檔案後,請執行下列二行指令來產生 Sendmail 資料庫檔案 (實際上 Sendmail 所能讀取的檔案),產生完成後請重新啟動 Sendmail 服務即可 (請依個人喜好自行擇一)。
makemap hash /etc/mail/access < /etc/mail/access   //產生方法 1
cd /etc/mail ; make                                    //產生方法 2




步驟3.安裝 POP3 套件

請鍵入下列指令來安裝 POP3 套件,本次實作 POP3 為安裝 popa3d 套件 (或依您個人喜好安裝即可)。
cd /usr/ports/mail/popa3d             //切換至安裝路徑
make install clean                     //安裝 popa3d 套件 




步驟4.修改 Inetd 設定檔 (/etc/inetd.conf)

修改 /etc/inetd.conf 設定檔內容,因為 pop3 為透過 Inetd 服務而啟動,因此請修改 Inetd 服務設定檔內容。
vi /etc/inetd.conf
 pop3  stream  tcp  nowait  root  /usr/local/libexec/popper  popper   //預設值
 pop3  stream  tcp  nowait  root  /usr/local/libexec/popa3d  popa3d   //修改後




步驟5.建立 /etc/mail/local-host-names

請自行建立 /etc/mail/local-host-names 檔案,內容如下:
vi /etc/mail/local-host-names
 weithenn.org             //允許此網域名稱能寄信

並檢查 /etc/mail/sendmail.cf 裡面是否有如下三行內容存在。
less /etc/mail/sendmail.cf
 Cwlocalhost
 # file containing names of hosts for which we receive email
 Fw-o /etc/mail/local-host-names




步驟6.重新啟動相關服務

鍵入指令 ps ax|more 找出 inetd 及 sendmail 服務的 pid,然後使用指令 kill -1 pid 即可重新啟動 Inetd 及 Sendmail 服務。服務重新啟動完成後即可寄一封信給自己,如果成功就表示完成設定。





4、補充1.相關檔案功能說明

/etc/mail/access: 指定哪些來源 IP 或 Domain 是否可以經由我們的伺服器寄信。
 weithenn.org             RELAY       //允許此 Domain 能寄信 (不需認證)
 192.168.1                RELAY       //允許內部 IP 網段能寄信 (不需認證)
 another.source.of.spam   REJECT      //禁止此 Domain 能寄信
 somespammer.com          DISCARD     //此 Domain 寄來的信收下後直接刪除
 cyberspammer.com         550 We don't accept mail from spammers   //回應給寄件者

/etc/mail/local-host-names: 填入 Localhost 及相關 Hostname (如 mail.weithenn.org) 當收到信的收件者不是給 mail.weithenn.org 時便會拒絕,此檔案內所列的 Host 都會被視為 Local (所以信會收下來) 通常和 DNS 的 MX 搭配使用。
 weithenn.org
 mail.weithenn.org
 dns.weithenn.org

所以 DNS 內應該要有如下幾筆記錄。
 weithenn.org.    IN MX 10 mail.weithenn.org.
 mail                  IN A     61.60.59.58
 dns                   IN A     61.60.59.58

/etc/mail/relay-domain: 允許 Relay 的 Domain (也可填入 IP 網段) 通常填入使用的 Domain 或內部 IP 網段。
 mail.weithenn.org
 192.168.1.

/etc/mail/sendmail.cf 內的 DS 功能: Smart Relay Host 此項目是指定請 誰 幫我寄信 (Relay) 預設值是空的。
# "Smart" relay host (may be null)
 DS                          //預設值
 DSedm.weithenn.org          //修改後

上列設定是說當要我寄信出去時,就會寄到 edm.weithenn.org 主機,請它幫我寄信當然前提是 edm.weithenn.org 主機允許 Relay 你這台主機,你可以手動發信後觀察 maillog 就可知設定是否成功,應該要看到 relay 主機就是你設定的那台。
 Jul 20 11:06:34 mail sm-mta14118: l6K36YV0014116: to=<weithenn@gmail.com>, delay=00:00:00, xdelay=00:00:00,
 mailer=relay, pri=30464,relay=edm.weithenn.org. 192.168.1.4, dsn=2.0.0, stat=Sent (l6K36rNV013042 Message accepted for delivery)

/etc/mail/aliases: 郵件別名,如下列設定的話則寄給 Service 這個帳戶時就會轉寄到 weithenn@gmail.com 了。
 service: weithenn@gmail.com
當修改完後記得鍵入下列指令來更新 aliases.db 檔案。
newaliases                  //更新 aliases.db 內容
 /etc/mail/aliases: 29 aliases, longest 25 bytes, 329 bytes total

若想知道會轉寄給誰也可下指令來了解別名設定最後會寄到那個 Mail Account。
#sendmail -bv service        //查看別名 service 最後是寄給誰
 weithenn@gmail.com... deliverable: mailer relay, host mail.weithenn.org, user weithenn@gmail.com






5、補充2.在伺服器上手動寄信

當設定完成後你可以在郵件伺服器依如下步驟手動寄信。
telnet localhost 25      //連結至本機 SMTP
 Trying ::1...
 Connected to localhost.weithenn.org.
 Escape character is '^'.
 220 mail.weithenn.org ESMTP Sendmail 8.13.8/8.13.8; Thu, 19 Jul 2007 17:16:00 +0800 (CST)
 ehlo localhost           //跟郵件伺服器 Say Hello
 250-mail.weithenn.org Hello localhost.weithenn.org IPv6:::1, pleased  to meet you
 250-ENHANCEDSTATUSCODES
 250-PIPELINING
 250-8BITMIME
 250-SIZE
 250-DSN
 250-ETRN
 250-DELIVERBY
 250 HELP
 mail from: web@weithenn.org                      //寄件人郵件位址
 250 2.1.0 web@weithenn.org... Sender ok
 rcpt to: weithenn@gmail.com                      //收件人郵件位址
 250 2.1.5 weithenn@gmail.com... Recipient ok
 DATA                                             //此行為自行輸入
 354 Enter mail, end with "." on a line by itself
 Subject: test1                                   //郵件主旨
 asdlfasdf                                        //郵件內容
 .                                                //內容結束符號
 250 2.0.0 l6J9G0H1002194 Message accepted for delivery
 quit                                             //離開
 221 2.0.0 mail.weithenn.org closing connection
 Connection closed by foreign host.
 You have new mail.






6、參考






7、Me FAQ

Q1.如何快速清除 Sendmail Queue?

Error Message:
當我使用 Sendmail 當 MTA 時,mailq 了一堆使用 rm 卻說太多無法清除,該如何才能快速清除 mailq呢?

Ans:
簡單來說就是到 sendmail queue目錄去幹掉他們。
cd /var/spool/mqueue;find ./ -delete
另一個解法是今天在 4wei-diary: FBSD Argument list too long 上看到的。
cd /var/spool/mqueue;find ./ | xargs rm



Q2.sm-mta[29616]: gethostbyaddr?

Error Message:
一直跳出類似如下的訊息?
 sm-mta[29616]: gethostbyaddr
Ans:
修改 sendmail.cf 檔的內容,參考 Re: sendmail gethostbyaddr error
 #O DontProbeInterfaces=False      //預設值
 O DontProbeInterfaces=True        //修改後




Q3.發信時 Log 顯示 host name lookup failure?

Error Message:
當我使用 Sendmail 當 MTA 時,發信後別人都收不到看一下 /var/log/maillog 有如下內容並有一段 keyword host name lookup failure。
 stat=Deferred: Name server: mail.weithenn.org.: host name lookup failure
Ans:
參考這篇 sendmail问题)hosts已设置,但无法解析 - ChinaUnix.net 照做就搞定了,建立 /etc/mail/service.switch 然後加入如下二行然後重啟 sendmail service 後就可發信且無錯誤訊息
 hosts   files
 aliases files