VERP でメール不達エラーの宛先アドレスを識別する - Postfix Advent Calendar 2014 - ダメ出し Blog

2014-12-25(Thu) [postfix][verp] [更新履歴]

Postfix Advent Calendar 2014 の 25日目の記事です。

最終日の今回は、Postfix の VERP (Variable Envelope Return Path) 機能を紹介します。

VERP とは何なの?

VERP とは qmail 由来の拡張アドレスを利用した機能であり、 Postfix 1.1 からサポートしています (拡張アドレスについては 4日目の記事に解説がある ので参照のこと)。 Postfix でメールを送信する際に VERP の利用を指示すると、 送信者アドレスの拡張アドレス部に宛先アドレスの情報が埋め込まれるようになります。

たとえば、あるメールを送信者アドレス info@example.jp、 宛先アドレス alice@aaa.example.combob@bbb.example.net として送信するときに VERP を有効にすると、Postfix から Alice へは送信者アドレス info+alias=aaa.example.com@example.jp、 Bob には送信者アドレス info+bob=bbb.example.net@example.jp として発信されます。

VERP が何の役に立つの?

VERP の効果が得られるのはメールの配送に失敗し、バウンスしたときです。 バウンス通知メールの宛先アドレスの拡張アドレス部を見れば、 失敗した宛先アドレスを簡単に識別することができます。

これには 2つの利点があります。

メールマガジンの発信やメーリングリストサーバーで有用な機能ですね。

VERP の利用方法

Postfix の設定

VERP のバウンス通知を受信するために拡張アドレスを有効にする必要があります。 /etc/postfix/main.cf で次の設定を記述します。

recipient_delimiter = +

Postfix の SMTP サーバーサービス経由で VERP を利用する場合は、 VERP の利用を許可するクライアントのリストを smtpd_authorized_verp_clients パラメーターで指定する必要があります。

smtpd_authorized_verp_clients =
        ## ほかのパラメーター値を参照
        $mynetworks
        ## IPアドレスで対象を指定
        10.0.1.20	  
        ## ネットワークアドレス/マスクで対象を指定
        192.168.0.0/16
        ## ホスト名で対象を指定
        client.example.jp
        ## ドメイン名で対象を指定
        .test.example.jp
        ## 外部ファイルで対象リストを指定
        $config_directory/smtpd_authorized_verp_clients
        ## 外部テーブルで対象リストを指定
        ## (テーブル中の各エントリーのキーのみ評価され値は無視される)
        ldap:$config_directory/smtpd_authorized_verp_clients.ldap.cf

Postfix sendmail コマンドで VERP を利用

sendmail コマンドに -XV オプションを付与すると VERP が有効になります。

$ sendmail -XV -i -f info@example.jp alice@aaa.example.com bob@bbb.example.net

sendmail コマンドによるメール発信方法については 13日目の記事を参照 のこと。

Postfix SMTP サーバーで VERP を利用

VERP が許可されている場合、SMTP の EHLO コマンドに対する応答に XVERP が含まれますので、これを確認してください。許可されているなら、 MAIL コマンドの引数に XVERP を指定することで VERP が有効になります。

以下の例では telnet コマンドで VERP を利用したメール発信を試行しています。

$ telnet mail.example.jp 25
Trying 10.0.0.1...
Connected to mail.example.jp.
Escape character is '^]'.
220 mail.example.jp ESMTP Postfix
ehlo client.example.jp
250-mail.example.jp
250-PIPELINING
250-SIZE 5242880
250-ETRN
250-XVERP
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from:<info@example.jp> XVERP
250 2.1.0 Ok
rcpt to:<alice@aaa.example.com>
250 2.1.5 Ok
rcpt to:<bob@bbb.example.net>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Subject: VERP test
From: info@example.jp
To: info@example.jp

VERP test
.
250 2.0.0 Ok: queued as 5931E60243
quit
221 2.0.0 Bye
Connection closed by foreign host.

なお、Postfix のログからは VERP を利用したかどうかの判別はつきません。

Dec 25 02:39:50 mail postfix/smtpd[2997]: 1778860243: client=client.example.jp[10.0.0.20]
Dec 25 02:40:05 mail postfix/cleanup[3737]: 1778860243: message-id=<20141224173950.1778860243@mail.example.jp>
Dec 25 02:40:05 mail postfix/qmgr[3680]: 1778860243: from=<info@example.jp>, size=333, nrcpt=2 (queue active)
Dec 25 02:40:05 mail postfix/smtp[3761]: 1778860243: to=<alice@aaa.example.com>, relay=mx1.aaa.example.com[192.168.0.5]:25, delay=24, delays=24/0.01/0.06/0.1, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as AD0303FB3F)
Dec 25 02:40:05 mail postfix/smtp[3762]: 1778860243: to=<bob@bbb.example.net>, relay=mailhost.bbb.example.net[172.16.1.10]:25, delay=24, delays=24/0.02/0.07/0.13, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as AE53A3FB4D)
Dec 25 02:40:05 mail postfix/qmgr[3680]: 1778860243: removed

謝辞

Postfix Advent Calendar 2014 はこれでお終いです。

去年に引き続き全部俺な Advent Calendar を今年も何かやろうかどうか模索して Twitter でうだうだしていたところ、 @tmtmsさんから「作っておきましたよ!」といきなり振られて仕方なく…いや、 背中を押してもらい、協力してやらせていただきました。 振り返ってみると諸事情もあって全部俺はとても無理でしたし、 去年よりずっと気楽にできました。ありがとうございました。

開始してしばらくは 25日全部の記事が賄えそうになかったので、Twitter で検索し、 書いてくれそうな人を探したりしてました。 オンラインでも会話したこともない方々にいきなり声をかけたところ、 快く(?)引き受けていただけました。 @2box2boさん、 @jem_3さん(ネタが被って変更してもらいました。すみません)、 @_so4さん、 ありがとうございました。

そのほかにも、記事を書いてくださった方、コメントやブックマークしてくださった方、 とても助かり、励みになりました。ありがとうございました。


追伸: 41歳になりました。 意外(?)と童顔で実年齢より若く見られることもありますが、肌の衰えを感じる今日このごろ。 それ以外は特に変わらずアラサーのころと変わらない…と思っているがどうなんだろう。

今年いっぱいで円満(?!)離婚することになり、新パートナーを募集していたりしますが、 なんか面倒くさいと思ったり、もう二次元でもルーターでもいいかなと思ったりもしてますが、 どっちの方面もいい出会いがなさげな気配です。はー。さて、どうしますかねぇ。


ところで、12月25日はクリスマスな上に、 OSS 界隈で地味に活躍されているふみやすさんの誕生日ですね!
http://www.amazon.co.jp/registry/wishlist/27M7TV8CEEF6G?sort=priority

逆に、あなたの書いた OSS や Blog や Advent Calendar が気に入ったら何か送りたく なってしまうかもしれないので、プロフィールや Web サイトに あなたの Amazon 欲しいものリストの URL を貼っておいてくださいね!


私が勤める OSSTech っていう某弊社で社員募集しているようです。 人材紹介会社を介さなければ、入社後に 20万円のボーナス! 「ふみやすっていう人に紹介された」と言ってもらえると私にもボーナス!! → https://www.osstech.co.jp/recruit/


よろしければ、これまで参加した/参加予定のほかの Advent Calendar もどうぞ。