今時のプロバイダでは、メールを送るのに SMTP-AUTH (SASL) による認証が必要となっている。
relayhost でプロバイダの SMTP サーバを指定して、外部宛のメールは全てプロバイダの SMTP サーバに送る、というような場合には、Postfix のドキュメントの日本語訳(Postfix SMTP クライアントで SASL 認証を有効にする)の記述に従えばよい。
独自ドメインを運用していて、プロバイダのメールも使用しているような場合、独自ドメインのアドレスでメールを送るときは直接配送で、プロバイダのアドレスでメールを送るときはプロバイダの SMTP サーバに送る、というような運用をしたい。
ようするに、エンベロープの送信者アドレス (envelope sender address = MAIL FROM のアドレス)をみて、転送先を切り替えたいというわけだ。
以前の Postfix でこれを実現するのは困難であったのだけれども、今はそうでもない。
sender_dependent_relayhost_maps (2.3以降で使える)や sender_dependent_default_transport_maps (2.7以降で使える)がそれだ。
ざっと見た感じでは、機能的には sender_dependent_relayhost_maps はsender_dependent_default_transport_maps に含まれているようにみえるが、もしかすると細かい挙動の違いとかあるのかもしれない。
sender_dependent_relayhost_maps を指定する場合、テーブルの基本的な文法は postmap(1) に記述されているとおりで、キーと値が空白で区切られる。この場合、キーにはエンベロープの送信者アドレスか @ 付きのドメインを記述し、値には配送先を記述する。配送先の書式は transport:nexthop で、transport_map と異なり、null エントリを指定することはできない。特に前者の、ドメインは @ が付いていないといけないあたりは注意が必要である。
main.cf に追加する設定。もちろん、smtp_sasl_password_maps や sender_dependent_default_transport_maps のファイル名は任意に付けて良い。
smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:$config_directory/sasl_passwd smtp_sasl_type = cyrus sender_dependent_default_transport_maps = hash:$config_directory/sender_transport
/usr/pkg/etc/postfix/sasl_passwd の設定。編集後に当該ディレクトリで postmap
sasl_passwd を実行しておく。
[smtp.example.com] account_1:password_1 [mail.example.ne.jp]:587 account_2:password_2
/usr/pkg/etc/postfix/sender_transport の設定。編集後に当該ディレクトリで postmap
sender_transport を実行しておく。
@example.com smtp:[smtp.example.com] @example.ne.jp smtp:[mail.example.ne.jp]:587
この設定で、エンベロープの送信者アドレスが hoge@example.com であれば smtp.example.com に、fuga@example.ne.jp であれば mail.example.ne.jp のポート 587 に SMTP-AUTH を使って接続し、それ以外は直接配送となる。