携帯向けの送信エラーメールを解析する
携帯へメール送信した際に、受信拒否やアドレス不明でエラーメールが返信されてくる場合があるが、この解析を行いたい。
ソフトバンク等、他のキャリアもエラーは発生するのだろうが、手元に保存していたエラーメールを見直してみるとドコモとau (EZWeb)分しかなかった。とりあえずは、この2種のみに対応する。また、エラーにも種々あるだろうがアドレス不明の場合の「User Unknown」のみを対象とする。
まず、エラーメールは「Content-Type: multipart/report; report-type=delivery-status;」形式で送信されてくる。3パートになっていて以下の形式(「Content-Description (Content-Type)」):
- Notification (text/plain)
- Delivery report (message/delivery-status)
※EZWebの場合は「Delivery error report」となる場合もあるようだ。 - Undelivered Message (message/rfc822)
1番目の「Notification」と2番目の「Delivery report」はどちらもエラー状況を示す内容的には同じだが表現が異なり、前者が人間可読用、後者が機械向けヘッダ付き表現用という感じ(3番目の「Undelivered Message」は実際に配信されなかったメールメッセージが入ってくる)。
エラーについては、ドコモの場合がちょっと厄介でわかりにくい。
1つめのパートの「Notification」で、宛先が「AAA@docomo.ne.jp, BBB@docomo.ne.jp, CCC@docomo.ne.jp, XXX@docomo.ne.jp, YYY@docomo.ne.jp」と5つある場合に、終わりの2つのXXX, YYYがアドレス不明(@docomo.ne.jpを省略)だと、エラー該当部の記述は次のような形になる。
<AAA@docomo.ne.jp>: host mfsmax.docomo.ne.jp[NNN.NNN.NNN.NNN] said: 550 Unknown user XXX@docomo.ne.jp YYY@docomo.ne.jp (in reply to end of DATA command) <BBB@docomo.ne.jp>: host mfsmax.docomo.ne.jp[NNN.NNN.NNN.NNN] said: 550 Unknown user XXX@docomo.ne.jp YYY@docomo.ne.jp (in reply to end of DATA command) <CCC@docomo.ne.jp>: host mfsmax.docomo.ne.jp[NNN.NNN.NNN.NNN] said: 550 Unknown user XXX@docomo.ne.jp YYY@docomo.ne.jp (in reply to end of DATA command)
エラーなのはXXX, YYYなのだが、メッセージ行頭はアドレスが存在しているAAA, BBB, CCCがそれぞれ並び、さらに送信できたユーザ分だけ同じエラーメッセージが繰り返されてしまう。
エラーメールの解析システムとして「bounceHammer(バウンスハンマー)」というのを見つけて少し試してみたのだが、このツールだとエラーの宛先としては上記の不明アドレスのXXX, YYYでなく、配信されたAAA, BBB, CCC側を対象アドレスとして検出してしまうようだった。
このため、XXX, YYYを抜き出すためには、行頭のアドレスは無視してコロン「:」以降のメッセージ中「Unknown User … (」の間のアドレスを抜き出し、各通知での重複を除かなければならない。
EZWebだとXXX@ezweb.ne.jpのエラーで
<XXX@ezweb.ne.jp>: 550 user unknown (in reply to RCPT TO command)
のようになるパターンと
<XXX@ezweb.ne.jp>: host lsean.ezweb.ne.jp[NNN.NNN.NNN.NNN] said: 550 <XXX@ezweb.ne.jp>: User unknown (in reply to RCPT TO command)
のようになるパターンがある。おそらく後者が新しいもので、ドコモの形式ともだいたい一致している(表記が統一されたのかもしれない)。EZWebだと不明アドレスのみが通知されてくるのでわかりやすい。
2つめのパートの「Delivery report」は、ドコモだと
Content-Type: message/delivery-status; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Description: Delivery report Reporting-MTA: dns; mechsys.tec.u-ryukyu.ac.jp X-Postfix-Queue-ID: 0000000 X-Postfix-Sender: rfc822; PPP@mechsys.tec.u-ryukyu.ac.jp Arrival-Date: WWW, 00 MMM YYYY HH:MM:SS +0900 (JST) Final-Recipient: rfc822; AAA@docomo.ne.jp Action: failed Status: 5.0.0 Diagnostic-Code: X-Postfix; host mfsmax.docomo.ne.jp[NNN.NNN.NNN.NNN] said: 550 Unknown user XXX@docomo.ne.jp YYY@docomo.ne.jp (in reply to end of DATA command) Final-Recipient: rfc822; BBB@docomo.ne.jp Action: failed Status: 5.0.0 Diagnostic-Code: X-Postfix; host mfsmax.docomo.ne.jp[NNN.NNN.NNN.NNN] said: 550 Unknown user XXX@docomo.ne.jp YYY@docomo.ne.jp (in reply to end of DATA command) Final-Recipient: rfc822; CCC@docomo.ne.jp Action: failed Status: 5.0.0 Diagnostic-Code: X-Postfix; host mfsmax.docomo.ne.jp[NNN.NNN.NNN.NNN] said: 550 Unknown user XXX@docomo.ne.jp YYY@docomo.ne.jp (in reply to end of DATA command)
となり、EZWebだと
Content-Type: message/delivery-status; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Description: Delivery error report Reporting-MTA: dns; lsean.ezweb.ne.jp Arrival-Date: WWW, 00 MMM YYYY HH:MM:SS +0900 (JST) Final-Recipient: rfc822; XXX@ezweb.ne.jp Action: failed Status: 5.0.0
または、
Content-Type: message/delivery-status; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Description: Delivery report Reporting-MTA: dns; mechsys.tec.u-ryukyu.ac.jp X-Postfix-Queue-ID: 0000000 X-Postfix-Sender: rfc822; PPP@mechsys.tec.u-ryukyu.ac.jp Arrival-Date: WWW, 00 MMM YYYY HH:MM:SS +0900 (JST) Final-Recipient: rfc822; XXX@ezweb.ne.jp Action: failed Status: 5.0.0 Diagnostic-Code: X-Postfix; host lsean.ezweb.ne.jp[NNN.NNN.NNN.NNN] said: 550 <XXX@ezweb.ne.jp>: User unknown (in reply to RCPT TO command)
となる(おそらく後者が新しい現在の形式)。「Diagnostic-Code」の中に、「Notification」にあったメッセージが入っている形になっている。
「Delivery report」の場合のヘッダ解析等が簡単に扱えればそちらを選択したほうがよかったかもしれないがちょっと面倒そうで、同内容を含んでいて行を連結するだけですぐに対応できそうな「Notification」を使うことにした。
参考
- 携帯のエラーメールの種類 – unoh.github.com by unoh
- メルマガ配信時のエラーメールをまとめてみました | スマホサイト・アプリをつくろう。
- message/delivery-status
- あなたの作ったメール配信システムはエラーメール処理をしていますか? – drk7jp
- bounceHammer – バウンスメール解析システム (バウンスハンマー) プロジェクト日本語トップページ – SourceForge.JP
- 17-3. 迷惑&エラ-メ-ルの解析
- User unknownでメールが送れない – その他(メールサービス・ソフト) – 教えて!goo
- Message/delivery-status というメールが – Yahoo!知恵袋
- libexec/mead.pでエラーアドレスをMLから自動削除 – fml 3.0 の設定 — エラーメールの処理