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

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

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

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

Q&A

解決済

1回答

480閲覧

受信メールの解析について(添付PDFファイル)

u-sukesan

総合スコア156

PHP

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

0グッド

0クリップ

投稿2022/09/29 10:53

編集2022/09/30 03:31

前提

環境:macOS big sur
メールサーバー xサーバー

Xサーバーのメール振り分け機能を利用して、FTPサーバー上のPHPファイルに転送
PHPでメールを解析して本文・件名・添付ファイルのPDFを解析したい

件名や本文、添付ファイル名などは解析できたのですが
PFDの中身を解析することができない。

PHP

1 2header('Content-Type: text/html; charset=UTF-8'); 3 4require_once (dirname(__FILE__).'/../PEAR/Mail/mimeDecode.php'); 5 6// カレントの言語を日本語に設定する 7mb_internal_encoding("UTF-8"); 8mb_language("ja"); 9 10#-- メールデータ取得 11$params['include_bodies'] = true; 12$params['decode_bodies'] = true; 13$params['decode_headers'] = true; 14$params['crlf'] = "\r\n"; 15 16$input = file_get_contents("php://stdin"); // 標準入力 17$decoder = new Mail_mimeDecode($input); 18$mail_data = $decoder->decode($params); 19 20$CHARSET_TO="UTF-8"; 21$charset = $mail_data->ctype_parameters['charset']; 22 23if ( $charset ) { 24 $charset_from = $charset; 25} else { 26 $charset_from = 'auto'; 27} 28 29#-- From フィールドの取得 30$FromAddress = $mail_data->headers['from']; 31 32#-- To フィールドの取得 33$ToAddress = $mail_data->headers['to']; 34 35#-- Subject フィールドの取得 36$Subject = $mail_data->headers['subject']; 37 38$Subject =mb_convert_encoding($Subject,$CHARSET_TO,$charset_from); 39 40#-- 本文の取得 41 42 $attachment = array(); 43 $i = 1; 44 switch(strtolower($mail_data->ctype_primary)){ 45 // シングルパート(本文のみ) 46 case "text": 47 $text = $mail_data->body; 48 break; 49 // マルチパート 50 case "multipart": 51 foreach($mail_data->parts as $part){ 52 $ctype_primary = strtolower($part->ctype_primary); 53 $ctype_secondary = strtolower($part->ctype_secondary); 54 // 本文 55 if($ctype_primary=="text"){ 56 $ctype_primary_array.=$ctype_primary."/"; 57 $text = $part->body; 58 // マルチパート 59 60 }elseif($ctype_primary=="multipart"){ 61 $ctype_primary_array.=$ctype_primary."/"; 62 foreach($part->parts as $part2){ 63 $ctype_primary2 = strtolower($part2->ctype_primary); 64 $ctype_secondary2 = strtolower($part2->ctype_secondary); 65 // 本文 66 if($ctype_primary2=="text"){ 67 $ctype_primary_array.=$ctype_primary2."/"; 68 $text = $part2->body; 69 // 画像またはPDF 70 }elseif($ctype_primary2=="multipart"){ 71 $ctype_primary_array.=$ctype_primary2."/"; 72 }elseif($ctype_primary2=="image" or ($ctype_primary2=="application" and $ctype_secondary2=="pdf")){ 73 $attachment[$i]['mimetype'] = "{$ctype_primary2}/{$ctype_secondary2}"; 74// $attachment[$i]['filename'] = mb_convert_encoding($part2->ctype_parameters['name'],"utf-8",mb_detect_encoding($part->ctype_parameters['name'])); 75 $attachment[$i]['filename'] = $part2->ctype_parameters['name']; 76 $attachment[$i]['binary'] = $part2->body; 77 $i++; 78 } 79 } 80 } 81 } 82 break; 83 default: 84 $text = ""; 85 } 86 $text = mb_convert_encoding($text,"utf-8",mb_detect_encoding($text)); 87 $text = trim($text);

試したこと

multipartの中にmultipartが存在しその中にapplicationがあったのでPDFの名前を抽出できています。
このPDFをpdfparserなどで解析して中身を取得したいのですが、どれを解析すればいいのかわからず質問いたしました。

$attachment[1]['binary']を出力すると下記の文字列だけがでます。
おそらくその後にエンコードされた中身があると思うのですが$attachment[1]['binary']には下記しかありませんでした。
ちなみにPDFには5行くらいの文字列だけです。

%PDF-1.4
%

やりたいこと

PDFには5行くらいのテキストデータが載っているだけです。
これを1行ずつ取得してmysqlに1つのレコードとして保存したい

というのが最終的な目標です。

メールの生データを貼りたいのですが、エンコードされた個人情報なども多く、そのままは貼れないので下記に省略版を貼ります

--Apple-Mail=_7F85D580-FF8E-4BC1-B73C-C423018F038B-XXXXXXXXXXXXXXXX Content-Type: multipart/mixed; boundary="Apple-Mail=_2CE99C86-3103-4EAA-81C7-" --Apple-Mail=_2CE99C86-3103-4EAA-81C7-XXXXXXXXXXXXXXXXXXXX Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 ここにHTMLのメール本文が記載 --Apple-Mail=_2CE99C86-3103-4EAA-81C7-XXXXXXXXXXXXXXXX Content-Disposition: inline; filename*=utf-8''エンコードされたファイル名.pdf Content-Type: application/pdf; x-unix-mode=0644; name="=?utf-8?エンコードされたファイル名?" Content-Transfer-Encoding: base64 ここにPDFと思われる base64でエンコードされた大量の文字列

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

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

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

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

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

CHERRY

2022/09/30 02:11

> $attachment[1]['binary']を出力すると下記の文字列だけがでます。 バイナリであれば表示されない文字もあると思いますので、変数の中身をファイルに書き出すとどうなりますか?
u-sukesan

2022/09/30 02:12

ありがとうございます! 一度やってみます
u-sukesan

2022/09/30 02:21

ちなみに この場合はFPDFとかライブラリ使って出力する感じなのでしょうか
AbeTakashi

2022/09/30 03:24

解析して何をしたいのか?で回答がかなり変わりそうな気がします。バイナリの解析ですから、ファイルに吐き出してバイナリエディタで中身を見て満足するのか?といえば、おそらくそうではないですよね? その辺の情報を質問文に追記していただければ、より具体的なアドバイスが出そうな気もします。
CHERRY

2022/09/30 03:27

質問に書かれた内容から推測すると PDF ファイルの中身がそのまま入っているように思いますので、普通に file_put_contents 等で バイナリファイルの書き込みでよいのではないでしょうか。
u-sukesan

2022/09/30 03:29

CHERRY さん ありがとうございます。 一度やってみますね
u-sukesan

2022/09/30 03:32

AbeTakashi さん ありがとうございます。 やりたいこと として追記しました
AbeTakashi

2022/09/30 04:21

PDF上のテキストを取り出したいということですか? であればPDF上のテキストもバイナリに含まれてるはずなので、まずはそのバイナリ($attachment[1]['binary'])をまるっとpdfparserにかけてみればどうでしょうか?
guest

回答1

0

自己解決

PFDファイルの解析に関して
結論から言いまして断念いたしました。

理由といたしましては送られてくるPDFの中身が想定していたフォーマットでない場合もあり
さらにそこから欲しい情報を抽出するには手間がかかるために別の方法での抽出を検討いたします。

ご協力いただきました皆様ありがとうございました。

投稿2022/10/07 02:15

u-sukesan

総合スコア156

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問