エラーメールの構造

メールを出したけど宛先が間違っていた場合、エラーがあったことを示す (たいていは英文の) メールが届く。

RFC 1891 - SMTP Service Extension for Delivery Status Notifications
配信状態通知をサポートするための SMTP 拡張
RFC 1892 - The Multipart/Report Content Type for the Reporting of Mail System Administrative Messages
エラー状態を通知するための形式の定義
RFC 1893 - Enhanced Mail System Status Codes
配信状態通知で使われるステータスコードの定義
RFC 1894 - An Extensible Message Format for Delivery Status Notifications
配信状態通知のデータ形式の定義

MTA がメールを配送しようとして、何らかのエラーを検出したとする。RFC 1891 が使われている場合、MTA はその指示に従って、エラー報告用のメールを作成する。その形式を定義したのが RFC 1892 だ。この RFC では、multipart/report という MIME タイプが定義されている。内容は 3 パートになっていて

  1. メール本文 (人間が読めるエラーメッセージ)
  2. 配信状態通知
  3. 元のメール

で、このうち 2 つめの「配信状態通知」の形式が、RFC 1894 で決められている "message/delivery-status" という MIME タイプだ。こんな感じになっている。

Reporting-MTA: dns; example.com
Received-From-MTA: DNS; localhost
Arrival-Date: Thu, 28 Oct 2004 12:34:56 +0900 (JST)
Final-Recipient: RFC822; ●●●@docomo.ne.jp
Action: failed
Status: 5.2.0
Remote-MTA: DNS; mfsmax.docomo.ne.jp
Diagnostic-Code: SMTP; 550 Unknown user ●●●@docomo.ne.jp
Last-Attempt-Date: Thu, 20 Oct 2004 12:34:56 +0900 (JST) 

この場合、自分のドメイン (example.com) から NTT DoCoMo の携帯に送ろうとしたら、DoCoMo のメールサーバに「ユーザが見つからない」と返されたことがわかる。
Diagnostic-Code: には SMTPDoCoMo から返されたエラーコードとエラーメッセージがそのまま格納されているが、もうひとつ Status: フィールドがある。これは、実際に使用したプロトコルに依存しないステータスコードとして、RFC 1893 で決められているもの。SMTP 以外のメッセージについても 適用できるように、汎用のコード体系が用意されているのだ。
ところで、すべての場合にこの形式で帰ってくるかというと、そういうわけではない。例えば au (ezweb.ne.jp) の場合、ユーザが違っていても、配送時にはエラー扱いにならない。一旦 au 側の MTA に送られた後、ユーザが存在しない場合には別途エラーメールが生成される。形式は、メール本文末尾に元のメールを引用するものになっていて、配信状態通知はついていない。