[PHP]メール受信プログラムのサンプル
だいぶ固まってきたので、テンプレート化してみた。
メールの受信サーバーから、パイプライン処理等で、PHPプログラムを直接起動し、標準入力(STDIN)経由でメールデータを受信するサンプルです。
細かい制御はしてませんが、ほぼこれでさっくり動くはず。
require_once 'Mail.php';
require_once 'Mail/mimeDecode.php';
#--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
# 以下、サブ関数の定義
#--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
# デコード済みMIMEヘッダーよりメールアドレスを抽出する。
function _extractMailAddress(
$pDecodedMimeHeader
){
$returnValue = FALSE;
if(
eregi(
"[-!#$%&\'*+\\.=/0-9A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+"
, $pDecodedMimeHeader
, $regs
) ){
# 行頭・行末の空白削除
$returnValue = mb_ereg_replace("^[ ]*(.*)[ ]*$", "\\1", $regs[0]);
}
return $returnValue;
}
# 受信メールをパースします。
function _parseMail(
&$pDecodedMimeStructure
, &$pResultSet
){
#--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
# message-idを取得する
$pResultSet["message-id"] = $pDecodedMimeStructure->headers["message-id"];
$pResultSet["message-id"] = mb_convert_encoding( $pResultSet["message-id"], mb_internal_encoding(), "auto" );
$pResultSet["message-id"] = str_replace( array("<", ">"), "", $pResultSet["message-id"] );
#--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
# fromを取得する
$pResultSet["from"] = $pDecodedMimeStructure->headers["from"];
$pResultSet["from"] = mb_decode_mimeheader( $pResultSet["from"] );
$pResultSet["from"] = mb_convert_encoding( $pResultSet["from"], mb_internal_encoding(), "auto" );
$pResultSet["from"] = _extractMailAddress( $pResultSet["from"] );
#--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
# toを取得する
$pResultSet["to"] = $pDecodedMimeStructure->headers["to"];
$pResultSet["to"] = mb_decode_mimeheader( $pResultSet["to"] );
$pResultSet["to"] = mb_convert_encoding( $pResultSet["to"], mb_internal_encoding(), "auto" );
$pResultSet["to"] = _extractMailAddress( $pResultSet["to"] );
#--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
# subjectを取得する
$pResultSet["subject"] = $pDecodedMimeStructure->headers["subject"];
$pResultSet["subject"] = mb_decode_mimeheader( $pResultSet["subject"] );
$pResultSet["subject"] = mb_convert_encoding( $pResultSet["subject"], mb_internal_encoding(), "auto" );
#--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
# 日付を取得する
$pResultSet["date"] = strtotime($pDecodedMimeStructure->headers["date"]);
#--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
# bodyと添付ファイルをパース
$pResultSet["body"] = "";
$pResultSet["attachments"] = array();
switch(strtolower($pDecodedMimeStructure->ctype_primary)){
# シングルパート(テキストのみ)
case "text":
$pResultSet["body"] = $pDecodedMimeStructure->body;
$pResultSet["body"] = mb_convert_encoding( $pResultSet["body"], mb_internal_encoding(), "auto" );
break;
# マルチパート
case "multipart":
foreach($pDecodedMimeStructure->parts as $part){
switch(strtolower($part->ctype_primary)){
# テキスト
case "text":
$pResultSet["body"] = $part->body;
$pResultSet["body"] = mb_convert_encoding( $pResultSet["body"], mb_internal_encoding(), "auto" );
break;
# 画像
case "image":
$attachment = array();
$attachment["mime_type"] = $part->ctype_primary."/".$part->ctype_secondary;
$attachment["filename"] = mb_convert_encoding( $part->ctype_parameters["name"], mb_internal_encoding(), "auto" );
$attachment["binary"] = $part->body;
$pResultSet["attachments"][] = $attachment;
break;
# 其れ以外
default:
break;
}
}
break;
# 其れ以外
default:
break;
}
#--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
# bodyに含まれている改行コードの統一
$pResultSet["body"] = mb_eregi_replace("(\r\n|\r)","\n",$pResultSet["body"]);
#--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
# ここで処理終了
return TRUE;
}
#--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
# 以下、メイン処理
#--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
# 言語設定、内部エンコーディングを指定する
mb_language("japanese");
mb_internal_encoding("eucJP-win");
mb_regex_encoding(mb_internal_encoding());
#--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
# メールソースを読み込む
$source = @file_get_contents("php://stdin");
if( !empty($source) ){
#--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
# メールをMIMEデコードする
$decoder = new Mail_mimeDecode( $source );
$params = array();
$params["include_bodies"] = TRUE; # ボディを解析する
$params["decode_bodies"] = TRUE; # ボディをコード変換する
$params["decode_headers"] = TRUE; # ヘッダをコード変換する
$structure = $decoder->decode( $params );
#--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--
# メールデータの解析
$maildata = array();
_parseMail( $structure, $maildata );
print_r($maildata);
}