Postfix で virtual domain を使って簡易ML(同報送信網)を立てる際の tips

一般的なML、つまり Mailman を使うような大がかりなものではなく、単純な同報送信網を立てる場合の注意点。

Postfix では、 ml@example.jp というMLアドレスに対し、 owner-ml@example.jp というアドレスが設定されていれば、自動的にそのアドレスがMLの管理用アドレスであると認識してくれます。これは特に Envelope-from を自動的に書き換えてくれるので、エラーメールを一カ所に集中させやすいという利点があります。

が、この機能を使えるのはローカル配信を担当する alias デーモンのみであり、多くの環境で使われているであろう virtual デーモンでは使えません。ドキュメント上では使えそうな雰囲気を醸し出している記述があったりするのですが、実際にはそうではないようです。具体的には、 virtual の説明ページowner_request_special の説明があるのですが、開発側の言い分としては、

  • これはあくまで「関連エントリ」である
  • これは単に配送アドレスのデリミタにハイフン"-"が指定されていても分割しないようにするためのオプションである

ということらしく、開発から10年来考えてるけどいい案が思いつかん、ということらしい。

従って、 virtual_alias または virtual_mailbox な virtual 環境で同報送信網を使うには、

  1. virtual → local へ配送後、 alias を使ってML配送
  2. 強制的に Envelope from を書き換え

の二通りの手段が考えられるわけです。

virtual → local+alias

一応公式お勧めらしい。Postfix Virtual Domain Hosting Howto より抜粋。

/etc/postfix/main.cf:
    virtual_alias_maps = hash:/etc/postfix/virtual

/etc/postfix/virtual:
    listname-request@example.com listname-request
    listname@example.com         listname
    owner-listname@example.com   owner-listname

/etc/aliases:
    listname: "|/some/where/majordomo/wrapper ..."
    owner-listname: ...
    listname-request: ...

書いてあるのそのままで、要は Virtual で受信したメールを一度 local に落とし、 alias を使って配送するというもの。listname: の項には :include: とかを使っても問題ないはず。
欠点としては、local に落とし込んだ時点で virtual で使っているドメインの管理下から外れてしまうため、特に envelope には関係のないドメインが表示されてしまうこと。まぁ人目に触れることは滅多にないとはいえ、メールヘッダには痕跡が残ってしまう。

じゃあローカルのドメインをMLのドメインにすればいいという話もあるけど、それはそれで今度は virtual で使ってるドメイン側のメール配信時にローカルの痕跡が出てしまうわけで、それはそれでどうなんだという。

強制的に Envelope from を書き換える

/etc/postfix/main.cf:
    sender_canonical_classes = envelope_sender
    sender_canonical_maps = regexp:/etc/postfix/sender_canonical

/etc/postfix/sender_canonical:
    /^.*$/	owner-ml@example.jp

postfix を経由するメールの Envelope from を全て強制的に書き換えるというもの。非常に単純明快。なんだけど、これだとメールサーバーを通過するメール全ての envelope from が owner-ml@example.jp に書き換えられてしまう。まぁ envelope from の書き換えだけなので、実害がないといえば実害はないんだけど、ちょっと気持ち悪いなと。