harukiです。
メールを送信するサイトの場合、メールアドレスのクリーニングは定期的に行うべきです。
そのためにはエラーメールを解析しなければなりません。
そこで、エラーメールの種類をまとめてみました。
SMTPエラー
存在しないメールアドレスや、正しい形式でないメールアドレスの場合は、
DoCoMo,au,SoftBankの3キャリアともSMTPエラーになります。
例として、以下の条件でメールを送信したとします。
From: sender@example.com
Return-Path: bounce@example.com
To: アドレス@docomo.ne.jp
MTAにより異なりますので、ここではPostfixを例にします。
Postfixではmultipart/reportのメールがbounce@example.comに届きます
(※ 必要な情報のみに省略しています)
From: MAILER-DAEMON@example.com (Mail Delivery System)
Subject: Undelivered Mail Returned to Sender
To: bounce@example.com
Content-Type: multipart/report; report-type=delivery-status;
boundary="boudary/example.com"
This is a MIME-encapsulated message.
--boudary/example.com
Content-Description: Notification
Content-Type: text/plain
(メッセージ)
<アドレス@docomo.ne.jp>: host mfsmax.docomo.ne.jp[203.138.180.240] said: 550
Unknown user アドレス@docomo.ne.jp (in reply to end of DATA command)
--boudary/example.com
Content-Description: Delivery report
Content-Type: message/delivery-status
X-Postfix-Sender: rfc822; sender@example.com
Final-Recipient: rfc822; アドレス@docomo.ne.jp
Action: failed
Status: 5.0.0
Diagnostic-Code: X-Postfix; host mfsmax.docomo.ne.jp[203.138.180.240] said: 550
Unknown user アドレス@docomo.ne.jp (in reply to end of DATA
command)
--boudary/example.com
Content-Description: Undelivered Message
Content-Type: message/rfc822
(ヘッダ)
From: sender@example.com
To: アドレス@docomo.ne.jp
(本文)
--boudary/example.com--
Content-Type: message/rfc822のToから、「アドレス@docomo.ne.jp」を取得できます。
特殊なエラーメール
auとSoftBankでは、上記のエラーに加えて、一旦受信されてから送り返されてくるものがあります。
種類は4つあります。
(※ ここでも必要な情報のみに省略しています)
- 1. multipart/report
- 2. text/plain
- 3. multipart/mixed
- 4. multipart/mixed(自動転送先)
1. multipart/report
Postfixの例で書いたものがサーバから送られてきます。
auとSoftBankにこのタイプがあります。
2. text/plain
拒否している場合のauのエラーメールです。
※ <アドレス@ezweb.ne.jp>の行がない場合もあります。
Content-Type: text/plain; charset=iso-2022-jp
From: Postmaster@ezweb.ne.jp
To: bounce@example.com
Subject: Mail System Error - Returned Mail
次のあて先へのメッセージはエラーのため送信できませんでした。
<アドレス@ezweb.ne.jp>
送信先メールアドレスが見つからないか、
送信先メールサーバの事由により送信できませんでした。
メールアドレスをご確認の上、再送信してください。
Each of the following recipients was rejected by a remote mail server.
---------------------------------------------------
(送信したメールのヘッダ)
From: sender@example.com
To: アドレス@ezweb.ne.jp
(本文)
SoftBankにもこのタイプがあります。
To: bounce@example.com
From: MAILER-DAEMON@softbank.ne.jp
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit
Subject: Non Delivery Notification
送信先エラーにより、配信されませんでした。
To:アドレス@softbank.ne.jp
Date:Sun, 1 Sep 2007 00:00:00 +0900
3. multipart/mixed
auでは送信したメールの内容がないパターンもあります。
To: bounce@example.com
From: Postmaster@ezweb.ne.jp
Content-Type: multipart/mixed; boundary="==boundary"
Subject: Mail System Error - Returned Mail
This message is in MIME format.Since your mail reader does not understand this format, some or all of the message may not be legible
--==boundary
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit
次のあて先へのメッセージはエラーのため送信できませんでした。
送信先メールアドレスが見つかりませんでした。
メールアドレスをご確認の上、再送信してください。
The user(s) account is disabled.
<アドレス@ezweb.ne.jp>
--==boundary--
4. multipart/mixed(自動転送先)
auでは自動転送先が2つまで設定できます。
自動転送先へメールが届かなかった場合に、以下のメールが送られてくることがあります。
To: bounce@example.com
From: Postmaster@ezweb.ne.jp
Content-Type: multipart/mixed; boundary="==boundary"
Subject: Mail System Error - Returned Mail
This message is in MIME format.Since your mail reader does not understand this format, some or all of the message may not be legible
--==boundary
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit
次のあて先へのメッセージはエラーのため送信できませんでした。
送信先メールアドレスが見つからないか、
送信先メールサーバの事由により送信できませんでした。
メールアドレスをご確認の上、再送信してください。
Each of the following recipients was rejected by a remote
mail server.
Recipient: <転送先アドレス>
>>> RCPT TO:<転送先アドレス>
<<< 550 Unknown user 転送先アドレス
--==boundary--
4は特殊な状況なので、4以外のエラーメールにはできるだけ対応しておいたほうがいいと思います。
※参考
KDDI au: EZwebへメール送信する際の注意事項 > 技術仕様
http://www.au.kddi.com/notice/manner/jyushin_policy/shiyo.html
追記(09/04 18:15)
はてブのコメントでご指摘いただいたVERPについて、知りませんでしたので試してみました。
Postfix VERP Howto
http://www.postfix.org/VERP_README.html
Postfix 2.3 and later:
% sendmail -XV -f owner-listname ....
% sendmail -XV+= -f owner-listname ....
Postfix 2.2 and earlier (Postfix 2.3 understands the old syntax for backwards compatibility, but will log a warning that reminds you of the new syntax):
% sendmail -V -f owner-listname ....
% sendmail -V+= -f owner-listname ....
ということで、PHPのmail関数の場合は、
mail($to, $subject, $message, $additional_headers, '-XV -f bounce');
として、すぐ確認できる種類を試してみました。
(確認できなかった種類 = 2.text/plainのSoftBank)
結果として、確認できた種類ではすべて
To: bounce+アドレス=docomo.ne.jp@example.com
という形式で取得することができました。
貴重な情報をありがとうございます。