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.com
と bob@bbb.example.net
として送信するときに
VERP を有効にすると、Postfix から Alice へは送信者アドレス
info+alias=aaa.example.com@example.jp
、 Bob には送信者アドレス
info+bob=bbb.example.net@example.jp
として発信されます。
VERP が何の役に立つの?
VERP の効果が得られるのはメールの配送に失敗し、バウンスしたときです。 バウンス通知メールの宛先アドレスの拡張アドレス部を見れば、 失敗した宛先アドレスを簡単に識別することができます。
これには 2つの利点があります。
- バウンス通知メールの中身を解析する必要がない。
- MTA はメール配送に失敗するとバウンス通知メールを生成して送信者に発信します。 その内容を見れば配送失敗した宛先アドレスを抽出できますが、 内容の形式は MTA に依り様々であり、すべてに対応するのは困難です。
- MTA が DSN をサポートしていれば DSN 形式となるため、その解析はいくらか容易です。 しかし、すべての MTA が DSN をサポートしているわけではありません。
- DSN については RFC 3464 An Extensible Message Format for Delivery Status Notifications などを参照のこと。
- メールが転送された先でバウンスした場合でも元の宛先アドレスを識別できる。
- メールを転送されると宛先アドレスが変化し、通常は元の宛先アドレスは失なわれます。 転送先でバウンスすると、バウンス通知メールの内容からは元の宛先アドレスを識別できません。
- 転送が多段に及んでも問題ありません。
メールマガジンの発信やメーリングリストサーバーで有用な機能ですね。
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 もどうぞ。
- Ansible Advent Calendar 2023
- シェル芸 Advent Calendar 2023
- 闇の魔術に対する防衛術 Advent Calendar 2023
- Ansible Advent Calendar 2023
- Ansible Advent Calendar 2020
- DNS温泉 Advent Calendar 2019
- OSSTech Advent Calendar 2019
- Ansible Advent Calendar 2018
- OSSTech Advent Calendar 2018
- Debian/Ubuntu Advent Calendar 2017
- Linux Advent Calendar 2017
- Shell Script Advent Calendar 2017
- Shell Script Advent Calendar 2016
- OpenLDAP と仲間たち Advent Calendar 2015
- Postfix Advent Calendar 2014
- 拡張 POSIX シェルスクリプト Advent Calendar 2013