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 (デフォルト: -+=)

PostfixがsendmailコマンドやSMTPコマンドでVERPデリミタとして受け付ける文字。多くの文字は (@や%のように) 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)

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

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

majordomoなどのメーリングリストでVERPを便利にするため、リストマネージャが以下の2つのうちどちらかの形式でメールを投函するように設定するとよいでしょう:

Postfix 2.3以降:

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

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

Postfix 2.2以前 (後方互換のため、Postfix 2.3は古い文法を理解しますが、新しい文法に気づかせるために警告をログに記録します):

% 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つの形式のうちどちらかを指定してください:

Postfix 2.3以降:

% sendmail -XV -f owner-listname ....

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

Postfix 2.2以前 (後方互換のため、Postfix 2.3は古い文法を理解しますが、新しい文法に気づかせるために警告をログに記録します):

% 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) マニュアルページを参照してください)。