Postfix VERP Howto


Postfix VERP サポート

Postfix バージョン 1.1 以降では要求に応じた可変エンベロープリターン パス (variable envelope return path) アドレスをサポートしています。VERP 形式の配送が要求されると、メッセージの受信者は、それぞれ自分のアドレスが エンベロープ送信者アドレスに組み込まれるようにカスタマイズされた、 メッセージのコピーを受け取ります。

例えば、VERP 形式の配送が要求されると、Postfix は "owner-listname@origin" から受信者 "user@domain" 宛の メールを、送信者アドレスに受信者を次のようにエンコードして配送します:

owner-listname+user=domain@origin

こうすることで、リストのオーナーがバウンスメッセージを分析しなくても、 配送できなかった受信者アドレスを明らかにできます。

VERP の概念は qmail MTA と ezmlm メーリングリストマネージャにより 一般化されました。この概念の背後にある考え方は http://cr.yp.to/proto/verp.txt を参照してください。

このドキュメントがカバーする話題:

Postfix VERP 設定パラメータ

Postfix では、全体の処理は4つの設定パラメータで制御されます。
default_verp_delimiters (デフォルト値: +=)

VERP 形式の配送を要求されたが、明示的に区切り文字が指定 されなかったときに Postfix が使う VERP の区切り文字。

verp_delimiter_filter (デフォルト: -+=)

sendmail コマンドラインや SMTP コマンドで VERP の区切り文字と して Postfix が受け付ける文字。多くの文字はEメールアドレスで (@ や % のように) すでに特別な意味を持っていたり、(英数字のように) ユーザ名や ドメイン名の一部として使われていたり、非 ASCII 文字か制御文字である ため、こういった文字は VERP 区切り文字として使ってはいけません。 脆弱なソフトウェアのバグを突く文字があるかどうかわかりませんが、 そういったことは起こさないようにしたいと思います。

smtpd_authorized_verp_clients (デフォルト値: none)

VERP 形式の配送を要求できる SMTP クライアント。Postfix QMQP サーバは独自のアクセス制御メカニズムを使い、また (/usr/sbin/sendmail を使う) ローカルの投稿者は常に許可されます。ホストを許可するには、 その名前や IP アドレス、サブネット (net/mask)、親 .domain を リストアップします。

Postfix バージョン 1.1 および 2.0 では、このパラメータは authorized_verp_clients (デフォルト: $mynetworks)。

disable_verp_bounces (デフォルト: no)

Postfix が複数の受信者を持つ VERP メールに対して一つの バウンスレポートを送るか、受信者毎に一つのバウンスレポートを送るかの 選択です。デフォルトの受信者毎というのは、ezmlm が必要とします。

majordomo などのメーリングリストでの VERP の 利用

majordomo などのメーリングリストで VERP を便利に使うには、次の2つのうち どちらかに従ってメールを投函するように、リストマネージャを設定すると よいでしょう:

% sendmail -V -f owner-listname other-arguments...

% sendmail -V+= -f owner-listname other-arguments...

最初の形式はデフォルトの main.cf VERP 区切り文字を使います。2番目の 形式では明示的に VERP 区切り文字を指定することができます。例では推奨値が 示されています。

このテキストでは、配送できないメールが実在の人に向けられるような、 owner-listname エイリアスが設定されていることを想定しています:

/etc/aliases:
    owner-listname: yourname+listname

バウンスを処理するために、拡張アドレスを広く活用しましょう。

+ がアドレスと、オプションの拡張アドレスとのセパレータであることと、 拡張アドレスが .forward ファイル名に現れること、拡張アドレスはエイリアス 展開を受けると消えてしまうことを Postfix に伝える必要があります:

/etc/postfix/main.cf:
    recipient_delimiter = +
    forward_path = $home/.forward${recipient_delimiter}${extension},
        $home/.forward
    propagate_unmatched_extensions = canonical, virtual

(後ろ2つのパラメータ設定はデフォルトの設定です)。

owner-listname アドレスに送られたメールを全て処理するようなコマンドを 持つ、.forward+listname という名前のファイルを設定する必要があります:

~/.forward+listname:
    "|/some/where/command ..."

このように設定すると、user@domain 宛の配送できないメールは次のアドレスに 返されます:

owner-listname+user=domain@your.domain

これは .forward+listname ファイルに書かれたコマンドによって処理されます。 他のものに混じって、メッセージはカプセル化された受信者アドレスを持つ To: ヘッダを含むはずです:

To: owner-listname+user=domain@your.domain

読者には、To: ヘッダ行をパースして user=domain 部分を受信者アドレスから 抜き出すという課題が残されています。

Postfix SMTP サーバにおける VERP のサポート

Postfix SMTP サーバは VERP 形式の配送をできるようにする、XVERP コマンドを実装しています。2つの形式の文法が許されます:

MAIL FROM:<sender@domain> XVERP

MAIL FROM:<sender@domain> XVERP=+=

最初の形式は main.cf VERP 区切り文字のデフォルトを使い、2番目の形式は それを明示的に上書きします。示された値は推奨値です。

Postfix sendmail コマンドにおける VERP の サポート

Postfix sendmail コマンドには、VERP 形式の配送を要求するための -V フラグがあります。次の2つの形式のうちどちらかを指定します:

% sendmail -V -f owner-listname ....

% sendmail -V+= -f owner-listname ....

最初の形式は main.cf VERP 区切り文字のデフォルトを使い、2番目の形式は それを明示的に上書きします。示された値は推奨値です。

Postfix QMQP サーバにおける VERP のサポート

Postfix QMQP サーバが

listname-@your.domain-@[]

のような形式のエンベロープ送信者アドレスを持つメールを受信すると、 qmail/ezmlm は VERP デリミタを "-=" であると想定しているため、それを 使って、Postfix は送信者アドレス "listname-user=domain@your.domain" を生成します。

より一般的にいうと、 "prefix@origin-@[]" という送信者 アドレスによって "prefixuser=domain@origin" という送信者アドレスを 持つ VERP 形式の配送を要求します。しかし、Postfix では verp_delimiter_filter パラメータで指定された VERP デリミタしか使えません。特に、"=" デリミタは qmail との互換性のために必須です (詳細は qmail addresses(5) マニュアル ページを参照してください)。