プロバイダの SMTP サーバへの接続

今時のプロバイダでは、メールを送るのに 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 を使って接続し、それ以外は直接配送となる。