[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);
}
lCuOLO
2010年 2月 22日 | Posted in PHP
まだコメントはありません。

コメントする

XHTML: 使用可能タグ: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">