[php]Gmailから送信されたメールの本文が取得できません。


メールを受け取って諸々処理する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か所空白行があったりするのが気になるのですが…)

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/03/13 21:01:41

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

(ヘッダと本文の間に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

id:sheepsace

マルチパートの形式だったのですね!
教えて頂いた参考サイトのやり方で無事取得出来ました。
本当にありがとうございましたー!

2014/03/13 21:01:35

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません