ようだ。
main.cfでsmtpd_recipient_restrictions を設定すれば 万事OKだと思っていたが、名前通り"smtpd"の制限パラメータなので、 localでsendmailコマンドを使用した場合にはsmtpd をスルーして smtpのプロセスが走ってしまう。そのため、smtpd_recipient_restrictionsで設定したつもりの宛先制限が有効にならない。
ref.
smtpd* がダメならtransport(sendmailでいうmailertable)で何とか出来んじゃね、と思って調べたら出てきた。
- http://www.postfix-jp.info/trans-2.2/jhtml/transport.5.html
- http://d.hatena.ne.jp/teru09/20080711/p1
これでできそう。
transport で localを設定するパターン
リンク参照。
1. main.cf
main.cf でluser_relay(localのunknownなmailを全て受け取るuser) を適当に設定。ここではゴミ箱行きとわかるように"trash" userで指定。あと、3で設定するtransport ファイルを指定。
luser_relay = trash transport_maps = hash:/etc/postfix/transport
2. /etc/aliases
luser_relay で設定したuserに届いたmailを/dev/null に捨てる設定。
trash: /dev/null
3. transport
送信を許可する宛先ドメインを"smtp:"の空エントリで書く。ここで書いたドメインに対してはMX配送をする。(transport_maps のdefaultがsmtpなので、リンク先のように"smtp"も省略できるけど、わかり易さのために明示的に書いておくことに)
allow_domain1.example.com smtp: allow_domain2.example.com smtp: * local:
これで出来る。
この設定の注意点
大抵の場合、この設定で良さそうだけど、一つだけ注意。アカウントがlocalに存在している場合 transport_mapsに書いてないドメイン宛でも、localのアカウントに配送される。例えばroot@unexist.domain.example.com に送信してもlocalのrootに配送される。
これは、transportの設定で"smtp"で記述されていないドメイン宛のメールを"local" に配送して、存在しないユーザ宛のメールをaliasesを使って/dev/nullに送っているため。
これが嫌な場合は次の設定で。
transport でlocalじゃなくてdiscardするパターン
この設定ではmain.cfのluser_relayと、/etc/aliasesの設定は不要。こちらの設定だとlocalに存在するuserでも宛先ドメインがtransportに書いてなければdiscard(捨てる)する。
transport
tranportの最後の行をlocal じゃなくて discardにする。"discard:"の後はlogに残るメッセージなのでわかり易いように適当に。