gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

エラーメールの処理

mail送信系を作成する際に重要なのはエラーメールの処理…というか正確には「届かないアドレスの排除、によるアドレスリストの清浄化」なのですが。
とりあえずざっくりとポイントを。


まずは「エラーメールが受け取れるようにすること」。
普通、SMTPレイヤーで突っ返されるために、以下を適切に設定しておくのが有効です。
SMTPレイヤーの、MAIL_FROMに指定するメアド
・mailメッセージの中のmail headerのReturn-Pathに指定するメアド
適切なメアドを設定し、それが受信出来るようにしておきましょう。


次に、このmailを処理するきっかけを作ります。
いやまぁ「cronでPOP3」を100%否定するわけではないのですが(とはいえ99.999%までは否定します B-p)、基本は「/etc/aliasesにバッチ設定しておくよねぇ」というのが定番です。
知っている限りでは全てのsmtpdが対応をしています。ちなみにmail stringはstdinから入ってくるのがほとんどですが、一応確認はしておきましょう。


さらに次に「どこ宛のmailでエラーったか」を、バッチプログラムから判断します。
問題はmail bodyの書式は色々と場所によって異なるので。まずは正規表現でemailアドレスとおぼしきモノを取り出し、その中から「明らかにサーバ管理者用」と考えられるメアドを除外し、ユーザのemailアドレスを推測する必要があります。
…なんていう嘘を信じてると痛い目にあいますので気をつけましょう(いや現場で時々耳にするのですよマジで)。


結論から書くと、VERP(variable envelope return path:可変エンベロープリターン パス)を使いましょう。
フォーマットはこんな感じ。
postmaster+user=domain@origindomain.com
これで、smtp側を適切に設定をすると postmaster@origindomain.com にmailが届きますんで、バッチでフック。
いや実際にpostmasterってのは若干どうかと思うので、その辺は適宜。おいちゃん好きなのは error_mail@。わかりやすいでしょ?w


ポイントは postmaster+user=domain@origindomain.com のうち
・+の部分
・user=domainの部分
の2カ所


+の部分は、メールサーバとその設定に合わせて、+または−を選びましょう。qmailはどっちだったかな? postfixは、デフォはどっちかだけど、設定でどちらにも倒せたはず。sendmailは…なんか小細工が必要だったような。記憶から抜けてる(苦笑)。ただ、不可能ではないのは、やった記憶がかすかにとはいえあるから、間違いなく。
user=domainの部分は、送信ユーザのメアドを。@を=に置換しているのがポイントだね。


これで適宜「送れない時にエラーアドレス」として把握をしておくと、色々とリストが汚れずに済んでエラーアドレス率が下がるから色々と安心なんだよスティーブ*1


ざっくり書いたけど、詳細と技術背景が必要なときはコメントなどくださいませ。今度追記しますんで。

*1:古い