テスト環境にて、誤ってメールを送信してしまう場合に備え、予め設定した宛先以外にはPostfixがメールを送信しないようにする方法。
但し、テスト環境におけるメールの送信は、他ホストのSMTPを利用せず、自身で動作しているPostfixから送信する前提。
【環境】
CentOS 6/postfix-2.6.6-8.el6.x86_64
CentOS 7/postfix-2.10.1-6.el7.x86_64
/etc/postfix/main.cf にて、ヘッダーのチェックを有効化する。
#header_checks = regexp:/etc/postfix/header_checks ↓ header_checks = regexp:/etc/postfix/header_checks
/etc/postfix/header_checks を開いて、正規表現でルールを記載する。
例)全て拒否
/^To: .*/ REJECT
$ mail root のようなローカル配送も失敗する。
→エラーログ:reject: header To: root from local;
但し、その後、失敗した旨を通知するメールはroot宛等に送信される。
例)OK にマッチしたアドレスなら送信、マッチしない場合は全て拒否
/^To: hoge@myhostname.domain/ OK /^To: .*/ REJECT
例)特定アドレスと特定ドメインへは送信を許可、マッチしなければ全て拒否
/^To: hoge@myhostname.domain/ OK /^To: .*@test.domain/ OK /^To: .*/ REJECT
サービス再起動
CentOS 6 # /etc/init.d/postfix restart CentOS 7 # systemctl restart postfix
メールを送信して、許可されていない宛先だった場合には、メールログに送信を拒否した旨が記録される。
reject: header To:
追記(2018/2/20)
/^To: hoge/ OK
のように指定した OK は、DUNNO の別名。
これは後方互換性のため残されている設定値。
他の設定値は、man や以下の日本語ドキュメントを参照。
参考;
Postfix manual - header_checks(5)
注意しなければいけないのが、DUNNO/OK の動作。
DUNNO/OK は、「このテーブルに検索キーが見つからなかったように見せ、次の入力行を検査する」との事。
つまり、このアクションが行われた後、そこで以降のルールをチェックしない訳ではない。
ハマりやすいのは、以下のような定義をした場合。
/@test.domain/ OK /./ REJECT
To か From かヘッダを記載していないので、たとえ To が OK にマッチしても、From など他のヘッダに対しても検査が行われるので、それが最後のREJECTに引っかかりREJECTされてしまう。