PEAR :: Mail_MimeDecodeでメール受信をする際、添付ファイル(*.eml)の読み取りで手間取ったのでメモ。
まずは普通のメール受信のパターン。
#!/usr/local/bin/php -q
<?php
require_once 'Mail/mimeDecode.php';
// 返される構造体にbody(本文)を含めるどうか。
$params['include_bodies'] = true;
// 返されるbodyをデコードするかどうか。
$params['decode_bodies'] = true;
// ヘッダをデコードするかどうか。
$params['decode_headers'] = true;
// 標準入力からメールを読み込み(.forwardでリレー受信)
$params['input'] = file_get_contents("php://stdin");
// 行末を指定する。
$params['crlf'] = "\r\n";
// 上記の設定を用いてインスタンス生成
$mail_data = Mail_mimeDecode::decode($params);
// fromアドレス取得
$FromAddress = $mail_data->headers['from'];
// toアドレス取得
$ToAddress = $mail_data->headers['to'];
// 件名取得
$Subject = $mail_data->headers['subject'];
$Subject = mb_convert_encoding($Subject,"UTF-8","JIS");
// 本文取得
$MailBody = $mail_data->body;
$MailBody = mb_convert_encoding($MailBody,"UTF-8","JIS");
?>
で、はまったのは*.eml形式(message/rfc822)の添付ファイルを受信した時に、そのemlファイルを本文として読み込む方法。
試行錯誤の末に以下のようになりました。
本当はもうちょっと丁寧に書くべきなんだろうけど、今回は用途が限定されているので(送られてくる添付ファイルはeml形式のみなので)下記で十分だった。
// 添付ファイルがあったら内容を表示
if( strtolower($mail_data->ctype_primary) === "multipart"){
foreach($mail_data->parts as $part){
switch( strtolower( $part->ctype_primary)){
case "text":
$MailBody .= $part->body;
break;
// message/rfc822(eml形式)
case "message":
foreach( $part->parts as $part2){
$MailBody .= $part2->body;
}
break;
}
}
}
まぁなんでeml形式の添付ファイルを扱うハメになったかというと、Thunderbirdのフィルタ機能を用いて転送すると強制的に添付ファイル扱いになっちゃうんですよねぇ。
今回はThunderbirdのフィルタに合致したメールのみを処理対象にしたかったので、こういう形になりました。
以上。
関連するかもしれない記事
- PHP PEAR :: Mail_MimeDecodeについて
- SendMail メール受信をトリガーにしてプロセスを起動
- windowsへのPEARのインストール
- php/pear実行時に「指定されたモジュールが見つかりません。」
- Apache ネゴシエーション
他のブログも読む



One Response
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.
Continuing the Discussion