キャリアブロック(受信ブロック)を回避する為の550(宛先)エラーメールの処理方法 前編
に引き続き、エラーメール処理について紹介します。
メールサーバーはqmailを想定しています。エラーメールを受信するメールアカウント(error@hogehoge.com)の発行から。
ドメインの発行
/home/vpopmail/bin/vadddomain hogehoge.com
※パスワードの入力が求められますのでパスワードを入力
メールアカウントの発行
/home/vpopmail/bin/vadduser error@hogehoge.com
※こちらもパスワードの入力が求められますのでパスワードを入力
パイプ処理
/home/vpopmail/domains/hogehoge/error/.qmailに
|/usr/local/bin/php -q /home/hogehoge/mail/error.php
これで/home/hogehoge/mail/error.php のプログラムにメールの内容が渡されますので
空メール登録の時と同じく、Mail_Mimeを使ってメールを分解します。
メール分解・解析
//PEAR Mail_Mime読み込み
require_once('Mail/mimeDecode.php');
//標準入力で渡されて来たメールの内容を変数に格納
$mailData = file_get_contents("php://stdin");
//パラメータの設定
$params = array(
'include_bodies' => true,
'decode_bodies' => true,
'decode_headers' => true
);
//Mail_Mime でメールの内容を解析・分解
$decode = new Mail_mimeDecode($mailData);
$mailInfo = $decode->decode($params);
//ヘッダー情報取得(To:やFrom:アドレスなどの情報が入ります)
$headers = $mailInfo->headers;
//本文の内容取得
$body = $mailInfo->body;
ただ今回は$headers の中を見ても
From: MAILER-DAEMON@hogehoge.com
To: error@hogehoge.com
と取得したいアドレスではなくbody部からエラーメールアドレスを取得しなければなりません。
エラーメールアドレス抽出
以下body部からエラーメールアドレスを抽出する為のソース一例です。
// body部からエラーメールアドレスを解析
$regex = "[-!#$%&\'*+\\./0-9A-Z^_`a-z{|}~]";
$regex .= "+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]";
$regex .= "+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]";
$regex .= "+";
switch (true) {
case (eregi("To:[ \t]*([^\n]+)", $body, $lineMatch)):
case (eregi("Final-Recipient: RFC822;[ \t]*([^\n]+)", $body, $lineMatch)):
case (eregi("<[ \t]*([^\n]+)>: user unknown", $body, $lineMatch)):
eregi($regex, $lineMatch[1], $strMatch);
$email = $strMatch[0];
break;
case (eregi("次のあて先へのメッセージはエラーのため送信できませんでした", $body, $lineMatch)):
eregi("<[ \t]*([^\n]+)>", $body, $regs);
eregi($regex, $lineMatch[1], $strMatch);
$email = $strMatch[0];
break;
default:
break;
}
$email の変数でエラーメールアドレスが取得出来ますので、このアドレスに次回からメールを送信しないよう処理を行なって下さい。








Comment from Nishi
Time 2010 年 1 月 21 日 at 1:27 PM
おせわになります。
携帯のエラー処理を参考にさせて頂いております。
現在、この情報を参考にテストを行っています。
エラーリターンメールの分析・解析を行おうとしましたが、
なぜか、
—Below this line is a copy of the message.
以下がbodyに入ってきません。
From: To: Subject:などは問題なく見れるのですが、
肝心な、送信してはねられた内容が入らないのですが、
これはどのような原因が考えられるでしょうか?
お手数で恐縮すが、お教え頂きたくよろしくお願いします;
テスト環境;
AU携帯で、@の前を存在しないユーザーにして送信
しました。
これを、$mailData = file_get_contents(“php://stdin”);
で読み込み、フアイルに書き出して中身をみると、
—Below ,,,如何入っていません。
よろしくお願いします。