質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • PHP

    20356questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

マルチパートメール本文のContent-Typeを取得したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 641

sake

score 7

マルチパート形式のメール本文のContent-Typeを取得したいと思い、下記のメールが届いたときにPHPスクリプトを自動起動させて、Content-Typeを取得したのですが、思うような結果が得られませんでした。
マルチパート形式のメールだと、添付ファイルが増える度にContent-Typeが追加されているようで、
確実に本文のContent-Typeを取得する方法を探しています。
下記PHPスクリプトでは、⓵のContent-Type、multipart/mixedを取得してしまいます。
⓶のContent-Type、text/plainを取得するにはどのようにしたらいいですか?
どなたか、力をお貸しください。
よろしくお願いします。

Return-Path: <aaaa.namae@server_a.com>
X-Original-To: bbbb@server_b.com
Delivered-To: bbbb@server_b.com
Received: from yahoouser (unknown [123.123.123.20]
    by server_b.com (Postfix) with ESMTP id C016655C20
    for <bbbb@server_b.com>; Mon, 10 Apr 2017 18:01:25 +0900 (JST)
Received: from yahoouser (localhost [127.0.0.1])
    by yahoouser (Proxmox) with ESMTP id 094F110FC521
    for <bbbb@server_b.com>; Mon, 10 Apr 2017 18:01:36 +0900 (JST)
Received: from mg2.mail.ctc.jp (mg2.mail.ctc.jp [111.222.111.20])
    by yahoouser (Proxmox) with SMTP id 1F7F010FC504
    for <bbbb@server_b.com>; Mon, 10 Apr 2017 18:01:32 +0900 (JST)
X-MailGates: (flag:3,DYNAMIC,RELAY,NOHOST:PASS)(compute_score:DELIVER,40
    ,3)
Received: from 172.162.152.142
    by mg1.mail.ctc.jp with Mail2000 ESMTP Server V6.00(4475:0:AUTH_LOGIN)
    (envelope-from <aaaa.namae@server_a.com>); Mon, 10 Apr 2017 18:01:09 +0900 (JST)
Received: from 132.122.112.12
    by mail-cm04.bk.mail.cl.dc.ctc.ad.jp with Mail2000 ESMTP Server V6.00(28611:1:AUTH_LOGIN)
    (envelope-from <aaaa.namae@server_a.com>); Mon, 10 Apr 2017 18:01:08 +0900 (JST)
Subject: =?UTF-8?B?44K144Oz44OA44O844OQ44O844OJ44Oh44O844Op44CA5pel5pys6Kqe?=
 =?UTF-8?B?44CA5re75LuY44GC44KK44CB44Gq44GX44CAMjAxNzA0MTDjgIAxNzU5?=
From: =?UTF-8?B?5Lit5aSu6Zu75rCX5bel5LqL44CA57Gz5bGxVA==?=
 <aaaa.namae@server_a.com>
To: user_c@server_b.com,
 =?UTF-8?B?5o+W5paQ5bed55S65b255aC044O75pS+6YCB6YCa5L+h44K744Oz44K/44CA5aCA?=
 =?UTF-8?B?5LqV5qeY?= <user_c@town.home.com>,
 bbbbdip <bbbb@server_b.com>,
 bbbb <bbbb@town.home.com>, =?UTF-8?B?6YWS5ZCRIOanmOOAgA==?=
 =?UTF-8?B?44K344K544OG44Og6ZaL55m6?= <yahoouser@yahoo.co.jp>
References: <1ca51062-79ed-18b4-d61b-21495113eabc@server_a.com>
 <faa489ed-9c97-6f69-ec37-0817493c341d@server_a.com>
Message-ID: <af2ad3f9-aa94-837a-8aee-dc7e91795e17@server_a.com>
Date: Mon, 10 Apr 2017 18:01:01 +0900
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101
 Thunderbird/52.0
MIME-Version: 1.0
In-Reply-To: <67f5d87d-231a-e4db-4cb9-be696fd52711@server_a.com>
Content-Type: multipart/mixed; --⓵
 boundary="------------B087A3FEB0C6B70E45DE8C18"
Content-Language: en-US
X-Proxmox-CTCH-Refid: str=0001.0A150205.58EB49F0.0036:SCFSTAT25972443,ss=1,re=-4.000,recu=0.000,reip=0.000,vtr=str,vl=0,cl=1,cld=1,fgs=0
X-SPAM-LEVEL: 

This is a multi-part message in MIME format.
--------------B087A3FEB0C6B70E45DE8C18
Content-Type: text/plain; charset=utf-8; format=flowed --⓶
Content-Transfer-Encoding: 8bit

本文のContent-Type、text/plainが取得出来ない。


署名欄


--------------B087A3FEB0C6B70E45DE8C18
Content-Type: application/vnd.openxmlformats-officedocument.presentationml.presentation;  --⓷
 name="ppt-sample.pptx"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="ppt-sample.pptx"

UEsDBBQABgAIAAAAIQAgR+mufwIAAGgXAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIo
oAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

(省略)

AB0YAAAq4AYAAAA=
--------------B087A3FEB0C6B70E45DE8C18--
<?php
    $stdin = fopen("php://stdin", "r");
    $header = "";
    $_header_write = true;
    $raw_mail = "";
    $ketasuu = array();

    do {
        $line = fread($stdin, 4096);
        if (strlen($line) == 0) break;
        if ( $n = strpos($line, "\n\n")){ //空行を見つけた
            $header .= substr($line, 0, $n);
            $_header_write = false;
        }
        if ($_header_write) $header .= $line;
        $raw_mail .= $line ;//. PHP_EOL;
    } while(true);
    fclose($stdin);

    require_once('/usr/local/bin/ReceiptMailDecoder.class.php');

    $decoder =& new ReceiptMailDecoder($raw_mail);

    //X-Original-Toを取得する
    $deliveredto =  $decoder->getDeliveredTo( 'x-original-to' );
    //Content-Typeを取得する
    $contenttype = $decoder->getDeliveredTo( 'content-type' );
    $contenttype = strstr($contenttype,';',TRUE);
    //本文を取得する
    //ドメインによって処理を分岐する
    if ($contenttype == 'text/plan'){
        //text/planなメール本文を取得する
        $body = mb_convert_encoding($decoder->body['text'],'UTF-8','auto');
        $body .= "\n";
    }else{
       //text/htmlなメール本文を取得する
        $body = mb_convert_encoding($decoder->body['html'],'UTF-8','auto');
        $body = mb_convert_encoding($body,'UTF-8',mb_detect_encoding($body, 'ASCII,JIS,UTF-8,CP51932,SJIS-win,iso-2022-jp','auto'));
        $body .= "\n";
    };
?>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

質問のコード中で使われているReceiptMailDecoderは、こちらのコードで間違いないでしょうか(以下の回答はそれを前提にします)。

Content-typeを自力で判断しなくても、あれば$decoder->body['text']$decoder->body['html']に本文が代入されていますので、それを直接見るのが手っ取り早いと思います。

なお、HTML+テキスト、というメールも普通に存在しますので、両方来た場合にはどっちを優先するか考えておく必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/11 11:05

    アドバイスありがとうございました。
    下記のようにしましたが、取得できませんでした。
    スクリプトに不備があるのでしょうか?
    引き続きご指導お願いします。
    $body = '';
    //本文を取得する
    //text/planなメール本文を取得する
    $body = mb_convert_encoding($decoder->body['text'],'UTF-8','auto');
    $body .= '\r\n';
    if ($body == '') {
    //text/htmlなメール本文を取得する
    $body = mb_convert_encoding($decoder->body['html'],'UTF-8','auto');
    $body = mb_convert_encoding($body,'UTF-8',mb_detect_encoding($body, 'ASCII,JIS,UTF-8,CP51932,SJIS-win,iso-2022-jp','auto'));
    $body .= '<br>';
    };

    キャンセル

  • 2017/04/12 01:25

    大変失礼をしました。
    上記方法で、本文を取得できていました。
    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20356questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。