MimeMailParserの利用

MimeMailParserプログラムは

https://code.google.com/p/php-mime-mail-parser/source/browse/trunk/MimeMailParser.class.php

にある.このページのtrunkにある2つのphpファイルを入手する.

MacのXAMPPにはMailParserがはいってないので,手動でインストールする必要がある.

sudo /Applications/XAMPP/xamppfiles/bin/pear install pecl/mailparse

参考ページ: http://wiki.cerbweb.com/Installing_PHP_Mailparse

サンプルコード

(注:20131220) 「echo $messageBody;」の部分は,


  echo mb_convert_encoding($messageBody,"UTF-8","JIS") . "\n";

のようコード変換する必要がある.
<?php
// MimeMailParserの利用して,メールの主要ヘッダと本文を抽出
// 添付ファイルを指定フォルダに格納

include_once('MimeMailParser.class.php');
mb_internal_encoding("UTF-8"); // mimeデコードするときの,変換後の日本語コード

$dir = "/home/toyoki/Maildir/.edu.OpenSys11/cur/"; //(ここは各自変更) 末尾のスラッシュは必須

// ファイル名一覧の取得
$filename = array();
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
          $filename[] = $file;
        }
        closedir($dh);
    }
}

$mailHandle = new MimeMailParser();

foreach($filename as $f) {  // メールファイルを1通づつ処理
  $mailHandle->setPath($dir . $f);

  // $header = $mailHandle->getHeaders(); // ヘッダーを配列としてゲット
  //print_r($header);  // 試しにどんなヘッダーをゲットできるか調べる

  $from = $mailHandle->getHeader('from'); // ヘッダーの指定項目をゲット
  $to = $mailHandle->getHeader('to');
  $subject = $mailHandle->getHeader('subject');
  $subject = mb_decode_mimeheader($subject);

  $messageBody = $mailHandle->getMessageBody(); // メール本文をゲット

  // 添付ファイルの格納 storeAttachmentsは下で定義
  // 格納するフォルダ名を $attchmentDirに指定
  $attachmentDir = "attachment/";
  storeAttachments($mailHandle, $attachmentDir);

  // 出力
  echo "[To] " . $to . "\n";
  echo "[From] " . $from . "\n";
  echo "[Subject] " . $subject . "\n";
  echo "--本文--\n";
  echo mb_convert_encoding($messageBody,"UTF-8","JIS") . "\n"; //20131220修正
  echo "---------------------------------------------\n";

}

/**************************************
 * 引数: MimeMailParserオブジェクト
 * 指定されたオブジェクト内の添付ファイルを$dirに格納
 **************************************/
function storeAttachments($mailHandle, $dir) {

  $attachmentObj = $mailHandle->getAttachments();
  if($attachmentObj) {
    foreach($attachmentObj as $obj) {
      $filename = $dir . mb_decode_mimeheader($obj->filename);
      $handle = fopen($filename ,"w");
      fwrite($handle, $obj->getContent());
      fclose($handle);
    }
  }
}
?>

説明

クラスファイルの読み込み

include_once('MimeMailParser.class.php');
$mailHandle = new MimeMailParser(); //処理用オブジェクトを生成

メールごとの処理

メールファイルの指定

    $mailHandle->setPath($dir . $f);

ヘッダーの取得

  $from = $mailHandle->getHeader('from'); // ヘッダーの指定項目をゲット
  $to = $mailHandle->getHeader('to');
  $subject = $mailHandle->getHeader('subject');
  $subject = mb_decode_mimeheader($subject);

その他の項目も指定できる.どんなヘッダーを取得出きるかは,

  $header = $mailHandle->getHeaders(); // ヘッダーを配列としてゲット
  print_r($header);  // 試しにどんなヘッダーをゲットできるか調べる

を行なって試してみる.

本文の取得

  $messageBody = $mailHandle->getMessageBody(); // メール本文をゲット

添付ファイルの格納

/**************************************
 * 引数: MimeMailParserオブジェクト
 * 指定されたオブジェクト内の添付ファイルを$dirに格納
 **************************************/
function storeAttachments($mailHandle, $dir) {

  $attachmentObj = $mailHandle->getAttachments();
  if($attachmentObj) {
    foreach($attachmentObj as $obj) {
      $filename = $dir . mb_decode_mimeheader($obj->filename);
      $handle = fopen($filename ,"w");
      fwrite($handle, $obj->getContent());
      fclose($handle);
    }
  }
}