sendmail小技巧基本應用
這裡所講的僅是一些小小的應用:
我先說明一下『你知道SENDMAIL(上、下)冊二本書有多厚嗎?』因此我們不可能在短短
的本頁中就能完全說明清楚,所以在正常的學習中請請儘量使用輔助軟體如:WEBMIN、
LINUXCONF等,除非你要變成一個SENDMAIL的專家,才儘量使用手動來修改設定,在網
路上常看到不懂就隨便改結果就產生了大的問題,如果是自己的電腦還沒有關係,但是
若是公司的話那真的是自找麻煩....,我建議如果要比較熟悉SENDMAIL的話,請買個書
來看才是比較便宜的解決方法。
老問題,以下有一些老問題快要被問到爛了,我不知道為什麼人們一遇到問題不會先找           
howto、或是網站、或是bbs(news)裡先前別人問過的問題及答題就亂問
client 無法向sendmail收信
telnet ip 110 無法連線
我想問你,你知道?
  1. 收信是使用pop3協定 埠:110
  2. 送信是smtp協定 埠:25嗎?
sendmail是一個送信的代理,因此它只監聽25埠所以110與它無關
redhat是使用ipop3,請先確定該服務有打開
client無法透過sendmail送信 這裡要提到一個觀念是relay,這是說該伺服器是不是要忙你送信
由於垃圾郵件太多了,因此sendmail內定設定是不幫你送信
請先在/etc/access 類似下面
192.168.0.1 relay #用你的ip取代
192.168.0 relay #用你的網路區段取代
再執行 makemap hash access
網內可以收送信件但是網外不行 很明顯是dns設定的問題

aliases 別名
.forward 轉信
vacation 放假時信件處理
連線問題 收信緩慢
makemap(將文字檔轉為資料庫) 手動設定/etc/mail下資料庫
拒絕垃圾郵件 Anti-Spam
虛擬主機 一台主機接收不同網域的郵件
備援主機 當我的mail主機當了,別台可以代收
內部主機收送信 使用private ip建立的內部主機如何收寄信
m4 將文字設定檔(.mc)轉為sendmail可讀的巨集檔(.cf)
formail 一個郵件處理程式
procmail 郵件過濾程式
使用撥接(漫遊,非固定ip者)如何透過sendmail送信 drac

Aliases(別名):
是郵件伺服器sendmail所附屬的功能,目前其它的mail server 也相容, 只有root才有權設定,檔案在/etc/aliases,其功能如下:
  1. 建立群組郵件,我們可以以一個名稱來代表一個部門,如此可以減少重複輸入
  2. 直接寫入檔案
  3. 交由其它程式來處理收到的郵件
  4. 轉信
  5. 備份收到的郵件
  6. (那外送的呢好像不行)
                             
以下就/etc/aliase檔案其內容說明:
主要分成兩部份,利用':'分成兩邊
======== ==================================================
左邊: 右邊
假的名稱: 真實使用者的名稱(也有可能是另一別名)
======== ==================================================
name: addr_1, addr_2, addr_3, . . .
======== ==================================================
右邊可能的格式:
1. Local Username:本地的使用者帳號
ex: root: panda
2. Local Filename:本地的檔案(完整路徑)
ex: nobody: /dev/null
3. Command :命令
ex: ftphelp: |/usr/local/bin/sendhelp
4. Include File :以某檔案內的人員當作收件人
ex: contact: :include: /etc/mail/mailinglist
(要加上:include:後接完整檔案路徑)
5. E-Mail Address :遠端的e-mail位址(user@domain)
ex: root: panda@ks.edu.tw
=============================================================
經由測試結果當sendmail收到本地的郵件時會檢查/etc/aliases下有沒有合乎的名稱 如果有就根據名稱所對照的來遞送郵件,如果該使用者存在且別名也存在,則會以別名為主,略過真實的使用者 因此sendmail收到本地網域郵件的處理順序可簡代如下 aliases->使用者->.forward
  1. 找尋alias是否有合乎的使用者,若有則遞送,若無則執行步驟2
  2. 找尋本地是否有合乎的使用者,查詢該使用者的家目錄下的.forward
    1. 若內含其它位址,則遞送之
    2. 若無則直接寫入該使用者的郵件檔案/var/spool/mail/使用者名稱
實作:             
公司有4個人分別是A,B,C,D. A是主管想要看到所有進到公司的郵件,而B,C,D是職員只能收到自己的信
作法:
在aliases加入
B: A,B
C: A,C
D: A,D
另一種作法(如果為本地USER 建議使用本設定)
B: A,B
C: A,C
D: A,D

公司有個部份叫sales,其中包含了五個人,boss,amy,sophie,sherry,sam我們要有一個部門e-mail在
公司的網域下
在aliases加入
sales: boss,amy,sophie.sherry,sam

即可
●有一些人問為什麼自己寄給自己的信無法收到,原因如下:
sendmail怕有些人因設定錯誤產生無窮迴圈,使信件無限增生
如 b: c
c: b,a
產生了一個迴圈 b和c 的互相置換,因此sendmail的作法是當
信件者和收送者是同一個時會被刪除,自己無法送給自己,一種改良
的方式是使用,則會直接寫入/var/spool/mail下使用者的檔案
b: .,c

.forward(轉信):
 
當信件寄給某使用者時,sendmail會找尋使用者家目錄下的一個檔案為.forward
將信件寄給其中的使用者或是程式處理,其弁鉊穨O名一樣,但使用者可以自己管理,
其格式是以逗號分開不同的收件者或是程式
話雖如此,有一些ISP如hinet,seednet
將telnet關閉(hinet可以上其網站直接透過網站編寫),因此無法在主機上直接編寫,
但若FTP沒有被關閉,你可以在pc端寫好.forward再上傳到主機上
本地的USER在前面加一個 ->這種作法比較好會直接寫入使用者MAIL檔案中
本地的檔案在前面加一個/
交付別的程式處理加一個"|程式 參數"
.forward的內容如:
a,/b,c,"|/usr/bin/vacation a";

1.寫入本地使用者a
2.寫入檔案b
3.寄給c
4.執行程式




vacation
vacation 是一種人員放假時email收信的處理程式
它會使用到.forward檔的設定一般不需使用者手動設定
如果你設定了某個user 使用vacation則 ,如果收到信時
1.自動回覆一封信內容為使用者home目錄下的.vacation
2.根據.forward轉信給它人,及自己
其.forward
使用者名稱,"|usr/bin/vacation 使用者名稱",其它使用者;

1.使用者名稱 ,自己保留一份備份
2.|user/bin/vacation 使用者名稱,回覆送件者郵件
3.其它使用者,轉信給別人
我們深入了解
  1. 檔案的取得

  2. Vacation的網站http://vacation.sourceforge.net
  3. 其主要檔案為:
  4.   
    /usr/bin/vacation 主要程式
    /usr/bin/vaclook 查看vacation.db資料庫程式
    個人home 目錄下的
    .forward 利用本設定來啟動程式
    .vacation.msg 自動回覆的信件內容
    .vacation.db 記錄vacation的個人設定

如何使用?
使用者登入執行vacation
會進入一個編輯自動回覆的訊息
結束後凡是此帳號收到e-mail
均會保留一份,並自動回覆上述編輯的郵件
另一種使用方法使用WEB管理由本人所寫的
使用PHP語言來寫的要支援FTP則只要將該解壓縮檔案
放在可以執行PHP的目錄下即可:
csc_vacation
連線問題
在不久之前我的linux伺服器出現了問題,使用telnet ip 25及其它的port
均是反應非常的慢甚至timeout,在網路上找了答案都說是反解的問題
只要在/etc/hosts加入ip及名稱就可以了,為了驗證答案的真實性我一而
在再而三測試發現我在client端使用telnet ip port得到下面的結果
1.telnet private ip 25 :反應非常的慢
2.telnet public ip 25:正常
3.telnet hostname 25:正常
4.telnet 使用private ip 的某一些port正常某一些反應非常的慢
5.sever 上自我telnet均正常

再去監看server上的行程發現當client連線時,server 端上會產生一個行程
sendmail(startup)經過很久[才進入sendmail(accept)的狀態,由於之前
設定根本沒有改但是為什麼會突然間都失效了,經過幾天的測試後確定使用
hosts可以解決這個問題,可是為什麼呢?到了最後我在sendmail的網站在
上面找到了答案,上面說著不久之前dns的(root)根主機改變了private ip
的處理方式,如果你的程式使用gethostbyaddress()的函式來查詢private ip
將傳回一個錯誤,因此產生了一個緩慢的回應,因此這個影響所有使用
gethostbyaddress()函式的程式,要解決這個問題如下:
==============================================
1.使用/etc/hosts,適合小型網路
/etc/hosts下加入ip及名稱,
ip hostname
但是你可以隨便的加上名稱,不必根據主機的名稱,只要讓它查的到就好了
192.168.0.1 my1
192.168.0.2 my2

2.設定dns,適合大型網路 ,
直接設定,如果你使用192.168.0.網路區段
redhat7.x在/etc/named.conf中加入
zone "0.168.192.IN-ADDR.ARPA"{
type master;
file "/var/named/192.168.0.rev"
}
在/var/named新增上面的檔名192.168.0.rev
$TTL 38400
0.168.192.in-addr.arpa. IN SOA 本機名稱. 管理者.主機.
(
年月日??: serial
3H: refresh
1H: retry
7D: expire
640; default_ttl
)
0.168.192.in-addr.arpa. IN NS 本機名稱.
1.0.168.192.in-addr.arpa. IN PTR 電腦名稱1.
2.0.168.192.in-addr.arpa. IN PTR 電腦名稱2.

1.$TTL為內定
2.serial 序號自己編但是一般是以年月日+兩位數字(新的要比舊的大)
3.refresh
D=天day
H=小時hour
W=週week


makemap
這是sendmail建立資料庫的工具
如果你的sendmail設定使用資料庫檔,則有一些環境檔要以資料庫的格式存在如
/etc/mail/下有一堆db檔,其副檔名為.db,其用意是加速資料的存取
例如:
/etc/mail/access是relay控制檔但是真正的控制檔為access.db
每次更完 access必須使用makemap的工具將access.db更新,設定才會
被sendmail讀取,這個程式就是將文字檔轉成資料庫.db的工具
至於資料庫的格式,其每筆記錄(每一行)只有兩欄(key和value)
KEY VALUE 是以TABLE分開
a b #ab,de間是以tab分開
d e

用法:
先編輯一個文字檔案以上述的方式來新增記錄
makemap hash 目的檔 < 來源檔 #hash 是資料庫的格式(btree或hash)
makemap hash access < mytext #目的檔的指定access會自動加副檔名成為access.db
makemap -v hash access < mytext #如果要觀看加入資料的過程加-v

上述己經將資料由文字檔mytext轉成資料庫access.db
如果你想知道相關的檔案設定請參考

拒絕垃圾郵件anti-spam
以下我們以linuxconf1.2.7 (mailconf)工具來設定
在anti_spam選項中
  1. rejected senders
  2. 拒絕幫列表使用者送信
    其格式可以是網域或ip
    xxx@domainname
    domainname
    ccc.bbb.ccc.ddd
    bbb.ccc.ddd
    ddd.ddd
  3. relay "email from" by IP
  4. 准赧p列表
    其格式可以是ip
    192.168.0.1
    可以是子網段
    192.168.0. #192.168.0.0至192.168.0.254
    10.0. #10.0.0.0 至10.0.254.254

  5. relay "email from" by name
  6. 准許主機名稱或是網域名列表
    一般是本地主機處理本機的網域或是主機
  7. relay "email to" by ip or name
  8. 如果e-mail是要寄到這個ip或是網域的接受
    設定備援主機時要設定請參考備援主機


虛擬主機(虛擬網域)
有時候想使用一台主機收好幾個網域郵件:
也就是寄給kk@domain1.com和寄給kk@domain2.com
都是由同一台主機來收信
以下使用mailocnf來設定:
mailconf->virtual domains
  1. virtual email domain

  2. 設定虛擬網域,可以設定多個
  3. virtualdomain user aliases

  4. 設定上述所加入某個網域的使用者信件處理方式(轉信或由其它程式處理)
    alias 名稱
    Filter program 指定另一個程式
    list file 指定另一個檔案(含有email列表)
    emails 轉寄給下面e-mail(每一行一個e-mail)
    例如:
    virtual domains=vdomain.com
    alias=abc
    emails=>kk@otherdomain.com
    如此:寄給abc@vdomain.com 的信會轉給kk@otherdomain.com
  5. virtual pop accounts(mail only)

  6. 設定虛擬的pop accounts
  這塈畯戔Nmailconf的virtual domain的設定動作一一加以解說
1.所有的sendmail主要的設定放在/etc/mail
2.你新增的虛擬網域的名稱會加入/etc/mail/sendmail.cV
3.你新增一個虛擬網域後該網域的所有的設定檔放在etc/mail/vmail下
4.如果你新增一個虛擬pop帳號會在/etc/mail/vmail新增三個檔
aliases.虛擬網域名稱 例如虛擬網域為 vdomain.com aliases.vdomain.com
passwd.虛擬網域名稱 passwd.vdomain.com
shadow.虛擬網域名稱 shadow.vdomain.com
5.虛擬網域的家目錄內定
/vmail/網域名稱/home/使用者名稱
經由測試在收信時可能要配合imapd(imapd,ipop3d),因為我使用(gnu-pop3d), client無法收信,server端正常
#另一個重大的觀點,如你所知所有的主機虛擬主機要兩種一個是使用名稱,另一個是ip
  1. domain base
    一台主機有多個網域(一個IP)
    DNS設定多個MX都由本機來收信,有個難題不同網域的相同使用者無法透過標準的,ipop3d來收信, 有一個套件可以使用vm-pop3d,但目前還無法使用,因為路徑及檔名的設定問題,
  2. ip base
    一個主機有多個ip但是只有一個,使用ip別名則機器就擁有多個ip,ip是一個key可以用來辨別, 不同網域,因為在dns下設定不同的不同的domain mx設在不同的ip但是ip都是同一台電腦,比較 好處理因此

●這媮晱憫髡

備援e-mail主機
 當你的mail server當了或是太忙無法回應時怎麼辦呢?
一般的想法是可有另一台代收,以下就是我們要說如何設定:
這個設定要使用到DNS,DNS中有一個設定叫做MX(郵件伺服器)的設定
它可以設定某一網域或主機的收信主機,你可以透過設定權限(prior)它本身
是一個數字,數字愈小優先權愈大其範例如下:
@ mx 5 abc1@mycompany.com
@ mx 10 abc2@mycompany.com
@ mx 15 abc3@othercompany.com
也就是
@是本網域
5,10,15是優先權
因此abc1有最大的優先權abc3有最小的優先權
也就是abc1當了或是不回應則abc2會代收,所謂
代收是將mail收下來,但是最後還是將轉送回abc1
設定dns後還要設定abc2,abc3的relay 的問題
請在垃圾郵件的第4項目加入網域名稱如此sendmail才會幫忙收信
參照

內部主機收信
在mailconf中有二個功能?
  1. mail server

  2. 有一些公司外部收信主機有好幾台都收同一個網域(主機),而內部有只一台包含所有的使用者的主機,因此外部收信主機要把收到的信轉給內部的主機在這堻]定。
  3. mail gaetway

  4. 其實就是外送主機,把所有外送的郵件均送給這台主機(主機必須可以直接連上網際網路及區域網路),請它代送。

m4
如果你很厲害,可以手改設定檔.mc把它轉成.cf,要如何使用呢?
指令:
m4 mc檔 > cf檔
m4 sendmail.mc > sendmail.cf

還有很多其它功能以後會陸續加入