メールをパースするクラス

メールをハンドリングする上で、メールソースを解析するという処理を実装しようとしてクラスがないか探していて
Google で mail, email, parse, php, rfc822 とか検索していたのですがライセンス制限のないものが全然見付かりませんでした。
で、ふと PEAR を追ってみるとバッチリありました。
Mail_Mime でメールのエンコード、Mail_mimeDecode でメールのデコードが可能です。
 
Mail パッケージの Mail_mimeDecode を使うと次のようになります。

require_once(‘Mail/mimeDecode.php’);
$mail = ”;
// …
// ($mail にメールのソースを格納する処理)
// …
 
$params = array();
$params[‘include_bodies’] = true;
$params[‘decode_bodies’] = true;
$params[‘decode_headers’] = true;

$decoder = new Mail_mimeDecode($mail);
$structure = $decoder->decode($params);
var_dump($structure);

結果(一部省略. 文字コードは JIS):

object(stdClass)(5) {
  [“headers”]=>
  array(14) {
    [“from sender@example.org tue may 9 20”]=>
    string(10) “21:03 2006”
    [“return-path”]=>
    string(23) “<sender@example.org>”
    [“x-original-to”]=>
    string(14) “foo@example.com”
    [“delivered-to”]=>
    string(14) “foo@example.com”
    [“received”]=>
    array(3) { /* ..snip.. */ }
    [“date”]=>
    string(31) “Tue, 09 May 2006 20:20:59 +0900”
    [“from”]=>
    string(35) “”John” <sender@example.org>”
    [“to”]=>
    string(14) “foo@example.com”
    [“message-id”]=>
    string(45) “<114717365920816000001f81@example.org>“
    [“subject”]=>
    string(19) “テスト”
    [“x-mailer”]=>
    string(17) “Cybozu Office 6.5”
    [“mime-version”]=>
    string(3) “1.0”
    [“content-type”]=>
    string(31) “text/plain; charset=iso-2022-jp”
    [“content-transfer-encoding”]=>
    string(4) “7bit”
  }
  [“ctype_primary”]=>
  string(4) “text”
  [“ctype_secondary”]=>
  string(5) “plain”
  [“ctype_parameters”]=>
  array(1) {
    [“charset”]=>
    string(11) “iso-2022-jp”
  }
  [“body”]=>
  string(495) “Hello, world!!

}

 
文字コードについては一切感知していないのか mb_internal_encoding の値にかかわらず, charset で指定されている通り JIS (iso-2022-jp) でした。
 
From: や To: の解析には Mail_RFC822::parseAddressList() という便利なメソッドも存在します。

require_once ‘Mail/RFC822.php’;
// $structure は Mail_mimeDecode::decode() の結果
$from = Mail_RFC822::parseAddressList($structure->headers[‘from’]);
echo $from[0]->mailbox.’@’.$from[0]->host;
// 結果: sender@example.org

 
参考:
Mail_mimeDecode – メールデコードの例(pear.php.net)