こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PEARのmimeDecodeでメール解析をしたい

レンタルサーバにPEARをインストールし、
mimeDecode.phpを使って、メールを解析したいのですが、
上手くいきません。

下記のサイトを参考にしましたが、やはりできませんでした。
http://d.hatena.ne.jp/makotoworld/20071106/1194309820
http://www.abe-tatsuya.com/web_prog/php/mail2php.php

メールを分解するファイル(.php)では、
file_get_contents("php://stdin")のようなカタチで、
メール情報はキャッチできています(確認済みです)が、
それを、

$params['include_bodies'] = true;
$params['decode_bodies'] = true;
$params['decode_headers'] = true;
$params['input'] = file_get_contents("php://stdin"); // 標準入力
$params['crlf'] = "\r\n";
$mail_data = Mail_mimeDecode::decode($params);

#-- 本文の取得
$MailBody = $mail_data->body;
$MailBody = mb_convert_encoding($MailBody,"UTF-8","JIS");

としても、取り出せないのです。
(つまり、$MailBody は空っぽのままなのです。)

さらに、

#-- From フィールドの取得
$FromAddress = $mail_data->headers['from'];

#-- To フィールドの取得
$ToAddress = $mail_data->headers['to'];

としている部分では、error_reportingが、

Notice: Undefined index: from in~~
Notice: Undefined index: to in~~

と、エラーを吐いています。
これも謎です…。一体、どういうことになっているんでしょうね?!汗

・パスの書き方に誤りがあり、
正常にPEARにアクセス(利用)できていない?

・そもそも、インストールが怪しい?

・上記の、参考にした2サイトでは、
mimeDecode.phpの扱い方が違うのですが、この違いとは?
これは、PEARのバージョンの新旧の問題?
だとすると、今となっては、
どちらか一方しか使えない、もしくは、両方とも使えない?
つまり、サイトを参考にして書いたコードがそもそも古くて使い物にならない?

・ファイルのパーミッションの問題?(保存形式はEUCとしています)

以上の点が、気になっています。

この事態を打開するためには、どう切り分けながら改善していったらよろしいでしょうか。
どなたかお詳しい方、どうか教えて下さい。

なお、
FFFTPにより、PEARのファイル群が置かれていることは確認しています。
(mimeDecode.phpもあります。)

コードの冒頭は、

#!/usr/local/bin/php

<?php
error_reporting(E_ALL);

としています。

レンタルサーバは、さくらインターネットのスタンダードプランです。
PHPバージョンは、5.2.14。
PEARは、最近、http://pear.php.net/go-pear経由でインストールしました。

長くなりましたが、宜しくお願い致します。

投稿日時 - 2010-11-26 14:46:02

QNo.6345187

困ってます

質問者が選んだベストアンサー

そういえばお久しぶりでしたね。

とりあえず、
file_get_contents("php://stdin");
が、取得できているのであれば、
メール取得部のプログラムを、

<?php

$log = file_get_contents('php://stdin');

file_put_contents('log_'.time().'.txt', $log);

?>
とか、適当にメールを書き出す処理だけかけておいて、
ローカルなど適当な環境で、そのファイルをデコード処理するプログラムを書いてチェックしてみてはどうでしょう。

基本的にパーサとかといったものは、泥臭いコードが書かれていたりするので、単純に受信した形式のメールだと
処理不能となって、こけている可能性があります。

いくつかのメーラ、自宅のPCのメーラーや、GmailなどWebメールとかなど、いくつかのクライアントで試したりしてみると
良いかもしれませんね。

また、mimeDecodeに既知のバグがないかを調べてみるのも良いかもしれません。

投稿日時 - 2010-11-27 01:24:03

お礼

回答ありがとうございます。

>そういえばお久しぶりでしたね。

当時、私はホゲホゲさんにかなりご迷惑をお掛けしていたと思っていましたので、、
要注意人物として記憶されているかと思っていましたが、
実際には、そうでもなかったみたいですね。笑
嬉しいような寂しいような。笑

さて、このメールデコードプログラムmimeDecodeについてですが、
ホゲホゲさんのお話から、万能というわけではないんだな、ということが分かりました。

どんなメールに対しても、器用にメール情報を分解し、
本文の抽出などを手軽に行えるものと過信していました。

実際には、
送るメールの種類によって、パースできたりできなかったりするような類のプログラムだったようで、
このことに対しては、PEARを万能と思いこんでいた私には驚きでした。

コードの中身は実は泥臭いということを知りましたので、
であれば、自作する道を選びますw
というか、今回の場合、自作した方が早いケースだったので、
最初からしておけば良かったなと後悔していますw
実際には、もう9割方、完成しちゃっているのですが…。

>mimeDecodeに既知のバグがないかを調べてみるのも良いかも

いやぁ、そんな意欲は、ありませぬ。苦笑

今回も、どうもありがとうございました。
自作によるメールパーサにつまづきましたら、
先ほど教わりました POP-Qdreciever なるものに手を出してみたいと思います。
もうPEARはこりごりです。苦笑

投稿日時 - 2010-11-27 01:42:13

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

■取得できない件
ソース確認してみましたが、
$mail_data変数に格納されるものは、普通のstdClassです。
一度var_dumpしてみて中に情報含まれるのか確認してみてください。

また、どうもそもそも不正な値が含まれていたりした場合、エラーメッセージ等でないでスルーするような挙動をするっぽいので
一度実際にmimeDecode.phpの中身確認して、必要であればライブラリにprint等書きこんで動きをチェックとかしたほうが早いかもしれません。

■decodeメソッドの呼び出し方に関して
Mail_mimeDecodeのdecodeメソッド呼び出しは、静的に呼び出しても、インスタンスつくってから呼び出しても同じ結果が返ります。

静的に呼び出せばデコード後のインスタンスをunsetする手間を省けるので楽っていう所ではないでしょうか。

■その他
http://hal456.net/
こちらの、POP-Qdrecieverを使ったほうが楽出来るかもしれません。

投稿日時 - 2010-11-26 22:48:24

お礼

お久しぶりです、hogehogeさん。
またお話しできて嬉しいです。

さて、「一度var_dumpしてみて中に情報含まれるのか確認」の件ですが、
var_dump($mail_data)の値を確認するのは、実はちょっと面倒だったりします。
なぜなら、
file_get_contents("php://stdin"); は、ご存知の通り、
メールを送ってみることで生成されるデータだからです。
で、メールを送ってみて、その後、
どうやってvar_dump($mail_data)の値を確認したら良いか、
を考え、
$mail_content = var_dump($mail_data);として、
$mail_contentの値を、自分のメールアドレスに送って、
そのメール本文から値を確認しようかとも思ったのですが、
なぜかはわかりませんが、
var_dump();の値は、メールでは確認できなかったため、

それでは!ということで、

file_get_contents("php://stdin"); をせずに、
file_get_contents("php://stdin"); で受け取るはずの値(ここでは、例として、'hogehoge~~~')を、
コピペして、それを

$mail_get_contents = 'hogehoge~~~';
として手動コピペし、

その値に対し、
echo var_dump($mail_get_contents);
として、web上で確認してみました。

で、その結果が、

object(stdClass)#2 (4) { ["headers"]=> array(0) { } ["ctype_primary"]=> string(4) "text" ["ctype_secondary"]=> string(5) "plain" ["body"]=> string(0) "" }

となります。

>エラーメッセージ等でないでスルーするような挙動をするっぽい

これでは、デバグしづらいですよね…。汗

>一度実際にmimeDecode.phpの中身確認して、必要であればライブラリにprint等書きこんで動きをチェックとかしたほうが早いかも

なんだか繁雑な作業になりそうですね。
それならばいっそのこと、自分で正規表現で抽出した方が早そうです。苦笑
手早く、容易に使えるだろうとのことでPEARに手を出したというのに、
これでは本末転倒ですw

>POP-Qdrecieverを使ったほうが楽出来るかも

こちら、ちょっと調べてみますね。
相変わらず、分かりやすく、為になる回答をありがとうございます。
また何か分かることがありましたら、教えて下さい。

投稿日時 - 2010-11-27 00:51:44

あなたにオススメの質問