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

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

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

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

PHP

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

Q&A

解決済

1回答

4560閲覧

PHPでメールを受け取りDBに格納

u-sukesan

総合スコア156

Sendmail

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

PHP

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

0グッド

0クリップ

投稿2018/11/07 12:57

スマホからのメールを受け取りDBに格納するプログラムです。
テスト環境はiphoneから送信

サーバー:Xサーバー
メール振り分け機能(forwardのようなものだと思います。)で受信したメールを下記PHPに送信しています。

受け取ったメールを分解し、添付画像はフォルダを作成して保存。
テキストや件名などテキストデータはDBに格納

という処理をしていますが、
送信するメールが

例えば本文内で

画像添付 テキスト

という画像がテキストの上で添付の順だと画像もテキストのDB保存もうまく行きます。

しかし
例えば本文内で

テキスト 画像添付

という感じで、テキストの下に画像を添付すると画像は保存されますが、テキストが空でDBに保存されません。

何が原因でしょうか

PHP

1<? 2require_once(dirname(__FILE__).'/../PEAR/Mail/mimeDecode.php'); 3 4 5$year=date('Y'); 6$month=date('m'); 7$day=date('d'); 8 9$yearfolder = dirname(__FILE__)."/../img/diary/{$year}/"; 10$monthfolder = dirname(__FILE__)."/../img/diary/{$year}/{$month}/"; 11$dayfolder = dirname(__FILE__)."/../img/diary/{$year}/{$month}/{$day}/"; 12 13//年度フォルダがなければ作成 14 if(!file_exists($yearfolder)){ mkdir($yearfolder,0777,true);} 15chmod($yearfolder, 0777); 16//月度フォルダがなければ作成 17 if(!file_exists($monthfolder)){ mkdir($monthfolder,0777,true);} 18chmod($monthfolder, 0777); 19//今日フォルダがなければ作成 20 if(!file_exists($dayfolder)){ mkdir($dayfolder,0777,true);} 21chmod($dayfolder, 0777); 22 23 24 25mb_language("japanese"); 26mb_internal_encoding("UTF-8"); 27 28$params['include_bodies'] = true; 29$params['decode_bodies'] = true; 30$params['decode_headers'] = true; 31$params['input'] = file_get_contents("php://stdin"); // 標準入力 32$params['crlf'] = "\r\n"; 33$structure = Mail_mimeDecode::decode($params); 34$CHARSET_TO="UTF-8"; 35$charset = $structure->ctype_parameters['charset']; 36 37 if ( $charset ) { 38 $charset_from = $charset; 39 } else { 40 $charset_from = 'auto'; 41 } 42 43 44 45//-------------------------------------------------- 46//fromを抽出 47//-------------------------------------------------- 48$frommail=$structure->headers['from']; 49$frommail = addslashes($frommail); 50$frommail = str_replace('"','',$frommail); 51//署名付きの場合の処理を追加 52preg_match("/<.*>/",$frommail,$str); 53if($str[0]!=""){ 54 $str=substr($str[0],1,strlen($str[0])-2); 55 $frommail = $str; 56 } 57 58//-------------------------------------------------- 59//toを抽出 60//-------------------------------------------------- 61$mail_to=$structure->headers['to']; 62$mail_to = addslashes($mail_to); 63$mail_to = str_replace('"','',$mail_to); 64//署名付きの場合の処理を追加 65preg_match("/<.*>/",$mail_to,$str); 66if($str[0]!=""){ 67 $str=substr($str[0],1,strlen($str[0])-2); 68 $mail_to = $str; 69 } 70 71//-------------------------------------------------- 72//件名を抽出 73//-------------------------------------------------- 74//絵文字を除去 75//$subject=preg_replace('/[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]/', '', $structure->headers["subject"]); 76//$subject = mb_convert_encoding(mb_decode_mimeheader($structure->headers["subject"]),mb_internal_encoding(), "auto"); 77// 件名を取得 78$subject = $structure->headers['subject']; 79//$subject = mb_convert_encoding($subject,"UTF-8","JIS"); 80 81//-------------------------------------------------- 82//本文を抽出 83//-------------------------------------------------- 84#-- 本文の取得 85 switch(strtolower($structure->ctype_primary)){ 86 case "text": // シングルパート(テキストのみ) 87 $MailBody = mb_convert_encoding( $structure->body, $CHARSET_TO, $charset_from ); 88 break; 89 case "multipart": // マルチパート(画像付き) 90 foreach($structure->parts as $part){ 91 switch(strtolower($part->ctype_primary)){ 92 case "text": // テキスト 93 $MailBody = mb_convert_encoding( $part->body, $CHARSET_TO, $charset_from ); 94 95 break; 96 case "image": 97 $filename = $part->d_parameters['filename']; 98 $filetype = $part->ctype_secondary; 99 //フォルダを作成 100 $diaryfolder = dirname(__FILE__)."/../img/diary/{$year}/{$month}/{$day}/連番/"; 101 if(!file_exists($diaryfolder)){ mkdir($diaryfolder,0777,true);} 102 chmod($diaryfolder, 0777); 103 104 // 画像ファイル自体はファイル保存。 105 $image_path = $diaryfolder. $filename; 106 if($fp = fopen($image_path, 'w')){ 107 $length = strlen($part->body); 108 fwrite($fp, $part->body, $length); 109 fclose($fp); 110 chmod($image_path, 0644); 111 } 112 113 break; 114 } 115 } 116 break; 117 } 118 119//以下でメールの件名、送信者、本文などをDBに格納 120 121//省略 122 123 124 125?>

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

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

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

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

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

m.ts10806

2018/11/07 17:33

どこまで想定通りに通っているか、変数の内容などをデバッグしてみましたか?(他人が容易に再現確認できる内容ではないので)
u-sukesan

2018/11/08 12:18

ありがとうございます。$MailBody、本文以外の取得はできています。一度、multipartの際の$structure->partsがどうなってるか調べてみます。
guest

回答1

0

自己解決

テキスト 画像添付

とした場合

なぜかプログラムでは

テキスト 画像添付 (空のテキスト)

と認識しており、$MailBodyを(空のテキスト)で上書きしていたため、本文が消えていました。

$MailBody.=$part->body

とすることで回避しました

投稿2018/11/09 02:24

u-sukesan

総合スコア156

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問