« ドットインストール用のGreasem... Main VirtualBoxに苦戦 »

携帯向けの送信エラーメールを解析する

携帯へメール送信した際に、受信拒否やアドレス不明でエラーメールが返信されてくる場合があるが、この解析を行いたい。

ソフトバンク等、他のキャリアもエラーは発生するのだろうが、手元に保存していたエラーメールを見直してみるとドコモとau (EZWeb)分しかなかった。とりあえずは、この2種のみに対応する。また、エラーにも種々あるだろうがアドレス不明の場合の「User Unknown」のみを対象とする。

まず、エラーメールは「Content-Type: multipart/report; report-type=delivery-status;」形式で送信されてくる。3パートになっていて以下の形式(「Content-Description (Content-Type)」):

  1. Notification (text/plain)
  2. Delivery report (message/delivery-status)
    ※EZWebの場合は「Delivery error report」となる場合もあるようだ。
  3. 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」を使うことにした。

参考

Leave a comment

Your comment