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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Q&A

解決済

1回答

3473閲覧

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

sake

総合スコア52

PHP

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

0グッド

0クリップ

投稿2017/04/10 10:51

マルチパート形式のメール本文の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"; }; ?>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

投稿2017/04/10 12:28

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sake

2017/04/11 02: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>'; };
sake

2017/04/11 16:25

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問