Sendmailのmailertableと同じことをpostfixでやる

 sendmailの設定で mailertable というのがある。ごく簡単にいうと、電子メールの送り先データ(MX)を無視して強制的に移送する時などに使うもので、たとえばメールゲートウェイなんかで使ったりする。MXはゲートウェイ、すなわち自分自身に向いているのでそれが利用できないためだ。

 (もちろんもっときちんとした別の解決法もあるが、ネットワーク構成が繁雑なところではこうした調整が必要とされることがある)

 今回の記事は、同じことをわざわざpostfixでやっちまおう、というえんがちょ(死語)な企画である。はしれこの道、からたち野道(謎

postfix

 まず、「/etc/postfix/main.cf」で次のように記述して、「transport_maps」を使うように設定する。

transport_maps = hash:/etc/postfix/transport

 そして次のようなsendmailのmailertableと同様のフォーマットで「transport」ファイルにルールを記述し、「postmap」コマンドで「transport.db」を再生成すればよい。

hokkai.or.jp  smtp:[hokkai.or.jp]

 ""鈎括弧をとるとMXレコードをひくので注意。""

 これだけだとsendmailと違ってエラーになる。postfixはバーチャルにしろ何にしろ「これは僕んちのメール」と受け取ってから処理する模様である。したがって対応は mydestination の項目に該当送り先を追加することになるが、main.cfにずらずらと並べるのはあまりにまぬけである。

 対策として以下はどうだろうか?

*** /etc/postfix/main.cf ***

 mydestination = /etc/postfix/mydomains
*** /etc/postfix/mydomains ***

domain1
domain2
:
:
domainxx

 mydomainsはテキストファイルである。気持ち悪いが、hashだとこのままではエラーになるらしいので、このまま使用している。

 このファイルの更新は以下がおすすめ。

# awk '{print $1}' /etc/postfix/transport > /etc/postfix/mydomains

 手書きせずにtransportファイルの頭だけもらえば、入力ミスで送れないというつまらないトラブルは避けられるし実際楽だ。

 なお、上記の例は私の設定すべき送出先がネットワークも名前もバラバラかつ200以上の行き先があったためである。通常はmydestinationにずらずらカンマで並べる、またはmynetworksにネットワーク/マスクを追加すれば十分間に合うので、こんなアホなことはしなくていいと思われる。