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