テスト用に外に一切配送しないSMTPサーバーを作る


centos7.2にて外に一切配送しないSMTPサーバーを作る方法.
ここでは vagrantで作った centos7.2 を想定。
(メールを仮に配送するためのユーザーを特定するため。vagrantでないホストでは適当なユーザーを作るとかする。)

root宛て以外のメールをすべてvagrantユーザー宛てに変更する

alias.regexpを以下の内容で作成する。
root宛てはrootに、vagrant以外宛てをすべてvagrant宛てに変更する、って意味(だと思う)

/etc/aliases.regexp
/(?!^root$|^vagrant$)^.*$/ vagrant

main.cf の alias_mapsを設定。

/etc/postfix/main.cf
alias_maps = hash:/etc/aliases, pcre:/etc/aliases.regexp

設定のテスト

記述ミスとかあると気づかないうちに外に出ちゃったりするのでテストする。

$ postmap -q foo pcre:/etc/aliases.regexp
vagrant
$ postmap -q root pcre:/etc/aliases.regexp
; 出力なし
$ postmap -q vagrant pcre:/etc/aliases.regexp
; 出力なし

alias設定にマッチするとその結果が出力される。マッチしない場合は出力なし(つまり-qで指定されたユーザーに配送される)。

メールを外部に配信せず、すべてローカルに配信する。

/etc/postfix/transport_maps ファイルを以下の内容で作成する

/etc/postfix/transport_maps.
/^.*@.*$/ local

(上のcodeタグにつけられたファイル名の最後のドットは不要。qiita仕様で拡張子のないファイル名はつけられない?)

main.cf の transport_maps を設定する。

/etc/postfix/main.cf
transport_maps = pcre:/etc/postfix/transport_maps

ここまでの設定で、ローカル以外宛てのメールは

  • ローカル配送されて
  • ユーザーがvagrantでないのでalias_mapsにより vagrantに配送される

はず。

postfix を再起動

sudo systemctl restart postfix

vagrantの外からSMTPで接続できるようにする

面倒なので main.cf内で以下のようにする

/etc/postfix/main.cf
inet_interfaces = all

通常、この設定をしてしまうと「すべてのホストからのSMTPリクエストを受け付けてしまう」ので$mydomainとかを設定するのだけどこのホストがvagrantで動いていてそもそもvagrantの親の外からつながらないのでOK?

参考にした資料

Postfixで絶対にメールを外に出さずに特定のローカルユーザー宛に集約する開発用メールサーバのつくり方
http://blog.roundrop.jp/show/22

半分以上この文書のコピペです。多謝。

その他

普段 windows使っているので radishとか使った方がテストは簡単なんだけど、再インストールしたときにradishのバイナリを無くして公式のを取りに行ったらlzhだったのでやめた。

あとテストとはいえPOSサーバーとか入れないとメールコマンドでちまちまやる事になり面倒。

いずれchefレシピにする。でもmain.cfとかchefでどうやるのがいいんだろう。