sendmail routing: virtusertable, mailertable, smarttable

 公司老闆對信件的管制都會有一些要求, sendmail的routing機制, 其實都可以應付的來, 其中3個主要設定表格應該就可以處理大部份狀況: virtusertable, mailertable, smarttable, 分別討論如下。

1. virtusertable

  這個表格原本用來做主機代管, 一台主機要host 10家公司(網域)的email, 必然會收到10個不同網域的信件, 但實際上這主機的名稱只有一個; 這時, 就用這個表格來將對應虛擬email address到實際的位址。例如:

sales@example.com            jill

info@book.org                    sara@writer.com


2. mailertable

 這個表格用來決定特定收件者網域的信要用什麼協定轉寄到那台主機(或網域), 它不管寄信者是誰。所以如果你想要設定的規則是"由誰寄來的都如何....", 那麼這個表格無法處理。它可以處理的是"寄到某網域的信都轉到那裡..."這樣的要求, 例如:

book.org                  smtp:writer.com

這樣的設定, 會將要寄到book.org這個網域的信都轉寄到writer.com這個網域, 而且改用smtp這個協定來傳送, 現在一般都使用esmtp這個比較新的協定, 如果有比較老舊的主機無法處理新的協定, 利用這個mailertable, 也是一個方式。

writer.com               local:pat

這個設定可以將所有要寄到writer.com網域的信, 都轉寄給本機上的pat這個使用者。 

writer.net                 esmtp:[192.168.0.1]

這個設定, 則是直接將要寄到writer.net網域的信, 都轉寄給192.168.0.1這台主機。前面的例子中, 指定轉寄到另一個網域時, sendmail還是要決定那個網域的郵件主機是那台, 然後還是將信傳送到那台主機。而這個決定的方法, 就取決於你的sendmail設定, 還有DNS裡MX record的設定。所以如果你想跳過那些設定, 或者讓轉寄到那台主機更明確, 這個設定法就簡單明瞭。


3. smarttable

 前面都是討論有關收件者的設定, 寄件者的部份就留給這個表格了, 也就是說"由誰寄來的都如何....", 這樣的要求, 就是smarttable負責處理的了。例如:

@reader.com              esmtp:[192.168.0.2]

這個設定可以將由reader.com這個網域寄來的信都轉寄到192.168.0.2這台主機。

john@reader.com            esmtp:[192.168.0.3]

這個設定則可以針對特定寄件者做轉寄的處理, john@reader.com可能是VIP, 它的來信都要特別處理, 就轉寄到特定主機去。


** 要讓這3個表格有作用, 必須在sendmail.mc檔裡有正確的設定:

FEATURE(mailertable, `hash -o /etc/mail/mailertable')

FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')

VIRTUSER_DOMAIN_FILE(`/etc/mail/virtuserdomains')dnl

FEATURE(`smarttable')dnl

在我的FreeBSD主機的sendmail環境, sendmail.mc設定檔是放置在/usr/local/share/sendmail/cf/cf這個目錄, 確保sendmail.mc檔中有以上設定存在。再下以下指定將其轉換成sendmail.cf檔:
m4 ../m4/cf.m4 sendmail.mc > sendmail.cf
然後再將sendmail.cf複製到/etc/mail目錄去, 重開sendmail就可以了。
在我的FreeBSD主機的sendmail環境, 重開sendmail的方法是, 到/usr/local/etc/rc.d目錄, 下以下指令:
./sendmail.sh restart

smarttable在sendmail.mc檔裡的設定很簡單, 只是FEATURE(`smarttable')dnl, 這是開啓smarttable功能的意思, 預設其表格的位置在/etc/mail/smarttable.db。所以以上討論smarttable時, 設定的內容都是存放在/etc/mail/smarttable這個文字檔。然後改完這個設定檔, 我們必須下makemap指令, 將其轉換成db檔。如下:
makemap hash smarttable < smarttable
沒打錯! 就是這樣的指令, 它自然會在同一個目錄下產生smarttable.db檔。

mailertable的設定也是一樣的, 這裡展示的是較完整的寫法, 也就是明確列示出其表格存在的目錄位置和表格的編碼。同樣的, 我們在文字檔(mailertable)編修其設定, 然後下makemap指令將其改存成.db的檔案。在sendmail環境裡, 這種表格, 由文字檔編修設定, 再下makemap指令轉成db檔的, 都具有一個特性, 就是一旦轉成db檔, 就立刻生效, 不用重開sendmail。包括這裡討論的3個表格皆如此。

virtusertable的設定也是一樣, 用FEATURE(virtusertable)來設定之, 但注意要再加上一行VIRTUSER_DOMAIN_FILE(), 否則virtusertable不會有作用!!!!!! 其用意, 應該是一個保險吧! virtuserdomains這個文字檔很簡單, 就是要加入你想設定的虛擬網域。例如:

example.com
book.org

這樣, 之前在virtusertable裡的設定才會有效。

==================
作用的順序 (很重要)
==================
 sendmail是這樣處理的, 先看virtusertable, mailertable然後才看smarttable, 之後是看DNS MX record。所以由誰寄來的規則會最後被套用, 寄給那個網域的規則會比較優先處理。這是什麼意思? 意思是如果你在mailertable裡設定寄到alpha網域的信都轉寄到A主機, 在smarttable裡設定由john@dell寄來的信都轉寄到B主機。那麼由john@dell寄給marry@alpha的信, 在你這台主機收到後, 會怎麼處理呢? 轉寄A主機或B主機呢?
答案是mailertable先作用, 所以是轉寄到A主機。

問題來了, 公司的網域就是alpha, 老闆的要求就是所有同仁的信都要轉寄到A主機, 但是由john@dell寄來的信, 就是要轉寄到B主機, 那麼我要怎麼設定呢?
可能的一個解法是: 
mailertable都不設定, smarttable設定由john@dell寄來的信都轉寄到B主機。那麼smarttable就會生效, 沒問題。可是公司其他同仁的信, 如何轉寄到A主機呢? 那就用DNS MX record, 這台sendmail主機指定到公司內部自己的DNS主機, 其上MX record設定alpha網域的MX是A主機就可以了。

好險! 問題解決了! 
沒想到, 老闆很機車, 要求john@dell寄來的信都轉寄到B主機沒錯, 但是john@dell寄給老闆(boss@alpha)的信卻要轉寄到A主機, 這時候要如何設定呢?
可能的一個解決法是:
利用virtusertable, 將boss@alpha轉成boss@beta, 然後在mailertable設定beta網域要轉寄到A主機。所以即使是由john@dell寄來的信, 只要是寄給boss@alpha的, 都會在mailertable被轉寄到A主機。但是由john@del寄給其他人的信, 仍會轉寄到B主機。

留言

這個網誌中的熱門文章

D-BUS學習筆記

Cisco Switch學習筆記: EtherChannel

Cisco Switch學習筆記: interface的封包錯誤統計