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

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

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

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

PHP

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

解決済

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

u-sukesan
u-sukesan

総合スコア141

Sendmail

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

PHP

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

1回答

0評価

0クリップ

3510閲覧

投稿2018/11/07 12:57

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

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

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

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

例えば本文内で

画像添付 テキスト

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

しかし
例えば本文内で

テキスト 画像添付

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

何が原因でしょうか

PHP

<? require_once(dirname(__FILE__).'/../PEAR/Mail/mimeDecode.php'); $year=date('Y'); $month=date('m'); $day=date('d'); $yearfolder = dirname(__FILE__)."/../img/diary/{$year}/"; $monthfolder = dirname(__FILE__)."/../img/diary/{$year}/{$month}/"; $dayfolder = dirname(__FILE__)."/../img/diary/{$year}/{$month}/{$day}/"; //年度フォルダがなければ作成 if(!file_exists($yearfolder)){ mkdir($yearfolder,0777,true);} chmod($yearfolder, 0777); //月度フォルダがなければ作成 if(!file_exists($monthfolder)){ mkdir($monthfolder,0777,true);} chmod($monthfolder, 0777); //今日フォルダがなければ作成 if(!file_exists($dayfolder)){ mkdir($dayfolder,0777,true);} chmod($dayfolder, 0777); mb_language("japanese"); mb_internal_encoding("UTF-8"); $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); $CHARSET_TO="UTF-8"; $charset = $structure->ctype_parameters['charset']; if ( $charset ) { $charset_from = $charset; } else { $charset_from = 'auto'; } //-------------------------------------------------- //fromを抽出 //-------------------------------------------------- $frommail=$structure->headers['from']; $frommail = addslashes($frommail); $frommail = str_replace('"','',$frommail); //署名付きの場合の処理を追加 preg_match("/<.*>/",$frommail,$str); if($str[0]!=""){ $str=substr($str[0],1,strlen($str[0])-2); $frommail = $str; } //-------------------------------------------------- //toを抽出 //-------------------------------------------------- $mail_to=$structure->headers['to']; $mail_to = addslashes($mail_to); $mail_to = str_replace('"','',$mail_to); //署名付きの場合の処理を追加 preg_match("/<.*>/",$mail_to,$str); if($str[0]!=""){ $str=substr($str[0],1,strlen($str[0])-2); $mail_to = $str; } //-------------------------------------------------- //件名を抽出 //-------------------------------------------------- //絵文字を除去 //$subject=preg_replace('/[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]/', '', $structure->headers["subject"]); //$subject = mb_convert_encoding(mb_decode_mimeheader($structure->headers["subject"]),mb_internal_encoding(), "auto"); // 件名を取得 $subject = $structure->headers['subject']; //$subject = mb_convert_encoding($subject,"UTF-8","JIS"); //-------------------------------------------------- //本文を抽出 //-------------------------------------------------- #-- 本文の取得 switch(strtolower($structure->ctype_primary)){ case "text": // シングルパート(テキストのみ) $MailBody = mb_convert_encoding( $structure->body, $CHARSET_TO, $charset_from ); break; case "multipart": // マルチパート(画像付き) foreach($structure->parts as $part){ switch(strtolower($part->ctype_primary)){ case "text": // テキスト $MailBody = mb_convert_encoding( $part->body, $CHARSET_TO, $charset_from ); break; case "image": $filename = $part->d_parameters['filename']; $filetype = $part->ctype_secondary; //フォルダを作成 $diaryfolder = dirname(__FILE__)."/../img/diary/{$year}/{$month}/{$day}/連番/"; if(!file_exists($diaryfolder)){ mkdir($diaryfolder,0777,true);} chmod($diaryfolder, 0777); // 画像ファイル自体はファイル保存。 $image_path = $diaryfolder. $filename; if($fp = fopen($image_path, 'w')){ $length = strlen($part->body); fwrite($fp, $part->body, $length); fclose($fp); chmod($image_path, 0644); } break; } } break; } //以下でメールの件名、送信者、本文などをDBに格納 //省略 ?>

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

m.ts10806

2018/11/07 17:33

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

2018/11/08 12:18

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Sendmail

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

PHP

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