メールを受け取って諸々処理するphpプログラムを作成しています。
PEARのMail_mimeDecodeを使用して、標準入力からメールの内容を取得しているのですが、Gmailからのメールの場合だけメールの本文を取得することが出来ません。
(ThunderbirdやiPhoneのメールからは問題なく取得出来る)
■ソース(一部抜粋)
============================
require_once 'Mail.php';
require_once 'Mail/mimeDecode.php';
$params['include_bodies'] = true;
$params['decode_bodies'] = true;
$params['decode_headers'] = true;
$params['input'] = file_get_contents("php://stdin");
$params['crlf'] = "\r\n";
$structure = Mail_mimeDecode::decode($params);
//これの値が取れない(値が入っていない?)。
$mail_body = $structure->body;
============================
これの原因や解決方法をご存知でしたら、教えて頂けませんでしょうか?
Gmailからのメールのヘッダがおかしいとか、そういうことでしょうか?
(ヘッダと本文の間に2か所空白行があったりするのが気になるのですが…)
(ヘッダと本文の間に2か所空白行があったりするのが気になるのですが…)
こんな感じになってるということでしょうか?
Subject: ...
...
Content-Type: multipart/alternative; boundary=わけの分からない英数字
これがひとつ目の空白行で...
--わけの分からない英数字
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit
ここを、ふたつ目の空白行、と言ってる?
本文...
もし、そうだったらマルチパートで送られてきてるんです。
添付ファイルがついてたり、HTML 形式のメールだったり。
こんなところが、参考になると思います。
で、multipartの場合は単純に$structure->bodyでは本文は取得できません。
実際に添付ありのメールをvar_dumpすればわかりますが、本文部分は$structure->partsで取得します。
parts部分はさらにstructureオブジェクトの配列になっています。
ですから、本文を取得するにはparts部分からbodyを取得します。function getMultiPartBody($structure){ foreach($structure->parts as $part){ if("multipart" == strtolower(trim($structure->ctype_primary))){ $body = getMultiPartBody($part); …① } elseif ("text" == $part->ctype_primary){ $body = $part->body; break; } } return $body; }
開発日記 » Blog Archive » PEAR::Mail_Mimeでメールを解析 ?DoCoMoの罠?
こっちも、同じことをやってる。
http://sakioka.sakura.ne.jp/note/?p=131
マルチパートの形式だったのですね!
2014/03/13 21:01:35教えて頂いた参考サイトのやり方で無事取得出来ました。
本当にありがとうございましたー!