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

By nakayama - 08/10/07 - このエントリをはてなブックマークに追加このエントリをYahoo!ブックマークに追加このエントリを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 の変数でエラーメールアドレスが取得出来ますので、このアドレスに次回からメールを送信しないよう処理を行なって下さい。