バウンスメールの処理について(仕様検討)

PHP-MLでも議論されていたけど、バウンスメール処理をPHPでやる場合、どうやったらできるのか考えてみた。

まぐまぐのメールを見てみると、ヘッダにはReturn-Pathにバウンスメールの送信先が指定されて
いる。これはSMTP MAIL FROM(エンベロープ送信者)へReturn-Pathに入れたいアドレスを指定すればよさげだ。このアドレスには送信した各メールにつき一意に決まるID(実装の問題だと思うので別に一意じゃなくてもいいけど)を埋め込めば、「どのアドレス宛てに送ったどのメールがバウンスされたのか」が判断できそうな希ガス。

メール送信にPEAR::Mail_smtpを利用する場合は、send()に渡す$headers['From']がSMTP MAIL FROMになると思うけど、ソースを見たところ$headers['Return-Path']にバウンス受け用アドレスを入れておけばそのアドレスがSMTP MAIL FROMに設定されるみたいなのでどうにかなりそうだ。あとはPEAR::Mail_Queueで定期的に発信する体制を整えれば、発信側はできたっぽい。

じゃあ、今度は受信側。

メールごとに一意に決まっているバウンス受け用メールをどう受け取るか。Postfixでいくと仮定したら、virtual_alias_maps(virtual_maps)に正規表現用のVirtualを追記する。

virtual_alias_maps = hash:/etc/postfix/virtual
regexp:/etc/postfix/virtual_regexp ←これ

xxxxx_error@example.comをバウンス受け用アドレスとすると、/etc/postfix/virtual_regexpには

/^.+_error@example\.com$/ [受け取るユーザ]

とか書いておけば受け取るユーザ宛てに配信されるようになるはずだ。

ユーザ宛てに配信されたメールの処理については、procmailを使う。/home/[受け取るユーザ]/.procmailrcに

:0
| /usr/bin/php /path/to/phpscript.php

とでも書いておけばPHPスクリプト側にSTDIN(標準入力)経由でメール本文を渡せるだろう。

実際の解析処理は、PEAR::Mail_mimeDecodeをかませばヘッダと本文の分離はできろうだろうから、後はヘッダのX-Original-Toに格納されたアドレスを見て、「どのアドレス宛てに送ったどのメールがバウンスされたのか」を判断し、本文を解析してバウンスの理由を特定したらDBに書き込む、と。

これでとりあえず動くものは作れそうだけれども、やはり本文解析には根気が必要そうだなあ。解析部分をベイジアンフィルタで実装するようにすれば、メンテはお客さんまかせ(解析失敗したら「あーそうですか、じゃまた学習させといてくださいねー」とか言っちゃって)だからラクだし安く作れるかも?(なんて投げやりな...)

このサイトについて

自分用リンク

Powered by Movable Type 4.22-ja

PR

このブログ記事について

このページは、ishiiが2006年2月14日 20:57に書いたブログ記事です。

ひとつ前のブログ記事は「1グラム1円のカレー屋さん」です。

次のブログ記事は「色の印象とコーポレートカラー」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

アイテム

  • swfobject.png
  • symfony.png
  • doclean.png
  • clean.png
  • twitterui.png
  • php5.2.8-warning.png
  • pagesaver.png
  • analytics.png
  • Munsell Hue Test.png
  • Munsell Hue Test0.png