携帯の受信ブロックを回避する宛先エラーメールの処理方法 後編

By nakayama - 08/10/07 - このエントリをはてなブックマークに追加このエントリをYahoo!ブックマークに追加このエントリをLivedoor Clipに追加このエントリをdel.icio.usに追加このエントリをFC2ブックマークに追加

キャリアブロック(受信ブロック)を回避する為の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 の変数でエラーメールアドレスが取得出来ますので、このアドレスに次回からメールを送信しないよう処理を行なって下さい。

3 Responses to “携帯の受信ブロックを回避する宛先エラーメールの処理方法 後編”

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 ,,,如何入っていません。

よろしくお願いします。

Comment from nakayama
Time 2010 年 1 月 21 日 at 9:33 PM

コメントありがとうございます。

前編では詳しく紹介しなかったのですが、
AUの場合、
SMTP接続の段階でエラーメールを返す場合と
レアケースとして一度サーバーが受け取ってからエラーメールを返す場合があり、
エラーメールのテキストがそれぞれ異なります。

参考:
http://www.plusmb.jp/2009/06/12/3727.html
http://labs.unoh.net/2007/09/post_99.html

キャリアで受け取ってからのエラーメールの場合は
『—Below this line is a copy of the message.』
の文字列は含まれませんのでご了承ください。

Comment from pisces
Time 2010 年 3 月 18 日 at 11:05 AM

お世話になります。
PHPの初心者です。
この情報を大変参考になりました。ありがとうございます。
一つを聞きしたいんですが、switch文の中の4つのcase文についてちょっと分かりませんが、ご説明頂ければ幸いです。
宜しくお願いします。

Write a comment