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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

2回答

6509閲覧

phpで添付ファイル付きのメールを送信できません

KentaroOnoda

総合スコア17

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2017/09/14 07:34

phpでホームページを作成しているのですが、その中の機能の一つとして、お問い合わせ画面から添付ファイル付きのメールを送信する機能を作成しています。メール送信の流れとしては、以下の通りとなります。
1.お問い合わせ画面(contact.php)で必要な項目を入力する。このときに必要であればファイルも添付する。
2.「内容を確認する」ボタンをクリックすると確認画面(contactsure.php)で入力内容を確認する。
*「内容を確認する」ボタンをクリックすると、「pagecheck.php」⇒「contactsure.php」の順で画面が遷移する
3.内容を確認して良ければ「送信する」ボタンをクリックして入力内容を送信する。
*「送信する」ボタンをクリックすると「mailsend.php」⇒「contact.php」の順で遷移する
4.送信に成功するとお問い合わせ画面に戻って「お問い合わせ内容を送信しました。」と表示される。
*送信に失敗した場合もお問い合わせ画面に戻って「お問い合わせ内容を送信できませんでした。」と表示される。

以下各画面のスクリーンショット及びコードになります。
(文字数制限があるため今回の質問とは関係ないと思われるところは一部削除しています。)

お問い合わせ画面の入力前・入力後(例)のスクリーンショット及びコードは以下の通りとなります。
↓入力前
イメージ説明
↓入力後(例)
イメージ説明

ファイル名:contact.php

<?php echo "<form action=/" . $projectName . "/php/pagecheck.php method=post name=hpb_plugin_form enctype = multipart/form-data>"; ?> <h3>お問い合わせフォーム</h3> <p class="contactSentence">お問い合わせ内容を入力してください。</p> <p class="contactSentence">*は必須項目です。</p> <table> </table><br><br> <span>有価買取ご依頼のお客様は買取リストを添付してください。</span><br> <table> <tr> <th>買取リスト</th> <td><input type ="hidden" name = "MAX_FILE_SIZE" value = "102400"> <input type = "file" width = "120" name = "sendfile" /></td> </tr> </table> <p class="contactButtons"> <input type="submit" name="check" value="個人情報の取り扱いについて" class="imformationButton" /> <input type="hidden" name="hpb_plugin_form_submit" value="true" /> <input type="submit" name="submit" value="内容を確認する" id = "submit" class="makeContentButton" /> </p> </div></div> <!-- main end --> </div> <!-- content end --><!-- サイトバー -->

↓確認画面のスクリーンショット及びコードは以下の通りになります。
イメージ説明

ファイル名:pagecheck.php

<?php if(isset($_POST['submit']) || isset($_POST['check'])){ if(isset($_POST['check'])){ }else{ if($i > 0){ }else{ if(isset($_FILES['sendfile']['name'])){ //ファイルが添付されている場合 $fname = $_FILES['sendfile']['name']; $temp = $_FILES['sendfile']['tmp_name']; $target = '../file/' . $fname; $filetype = $_FILES['sendfile']['type']; if(move_uploaded_file($temp, mb_convert_encoding($target, "SJIS", "AUTO") )){ //アップロードファイルの移動に成功した場合 $_SESSION['fname'] = $fname; $_SESSION['target']= $target; $_SESSION['filetype']= $filetype; } }//if //入力内容確認画面に遷移する $filePathName = "contactsure"; $filepath = filePathReturn($filePathName,$projectName); header($filepath); exit; }//if }//if }else{ }//if

ファイル名:contactsure.php

<?php echo "<form action=/" . $projectName . "/php/mailsend.php method=post>"; $arr1 = array('お名前' => $name,'フリガナ' => $furigana,'会社名' => $company,'郵便番号' => $zipcode,'住所' => $address, 'メールアドレス' => $mailaddress1,'電話番号' => $phoneNumber,'お問い合わせ内容' => nl2br($content)); //データ処理用 $arr2 = array('name' => $name,'furigana' => $furigana,'company' => $company,'zip1' => $zipcode1,'zip2' => $zipcode2, 'prefecture' => $prefecture,'cityName' => $cityName,'building' => $building, 'mailaddress1' => $mailaddress1,'mailaddress2' => $mailaddress2,'phoneNumber1' => $phoneNumber1, 'phoneNumber2' => $phoneNumber2,'phoneNumber3' => $phoneNumber3,'content' => $content); if(isset($_SESSION['fname'])){ //アップロードファイルの移動に成功した場合 $arr1['添付ファイル'] = $_SESSION['fname']; $arr2['fname'] = $_SESSION['fname']; //ファイルパスを設定 echo "<input type = hidden name = filepath value = '" . $_SESSION['target'] . "' />"; echo "<input type = hidden name = filetype value = '" . $_SESSION['filetype'] . "' />"; }//if echo "<table>"; foreach ($arr1 as $ky => $val){ //入力内容を表示する echo "<tr><th>" . $ky . "</th><td>" . $val . "</td></tr>"; }//for-each foreach ($arr2 as $ky => $val){ //送信するデータをhiddenで表示する echo "<input type = hidden name = " . $ky . " value = '" . $val . "' />"; }//for-each echo "</table>"; ?> <p class="contactButtons"> <input name="back" type="submit" id="back" value="内容を訂正する" class="imformationButton" /> <input name = "submit" type="submit" id = "submit" value="送信する" class="makeContentButton" /> </p> <?php echo "</form>";?> </div></div> <!-- main end --> </div>

ファイル名:mailsend.php

<?php if(isset($_POST['back'])){ }elseif(isset($_POST['submit'])){ //メールの本文を作成 $honbunName = "氏名:" . $name . "\n"; $honbunFurigana = "フリガナ:" . $furigana . "\n"; $honbunCompany = "会社名:" . $company . "\n"; $honbunZipcode = "郵便番号:〒". $zipcode1 . "-" . $zipcode2 . "\n"; $honbunAddress = "住所:" . $prefecture . $cityName . $building . "\n"; $honbunMailAddress = "メールアドレス:" . $mailaddress1 . "\n"; $honbunPhoneNumber = "電話番号:" . $phoneNumber1 . "-" . $phoneNumber2 . "-" . $phoneNumber3 . "\n"; $honbunContent = "問い合わせ内容:" . $content; $honbun = $honbunName . $honbunFurigana . $honbunCompany . $honbunZipcode . $honbunAddress . $honbunMailAddress . $honbunPhoneNumber .$honbunContent; $message = mb_convert_encoding($honbun, "JIS", "utf-8"); //各項目をShift-JISに変換 //件名 $title = mb_encode_mimeheader(mb_convert_encoding("ライフワンへのお問い合わせ", "JIS", "utf-8"),"JIS"); //送信先アドレス $to = mb_convert_encoding("kentaro-onoda@lifeone.or.jp", /*love@lifeone.or.jp,*/ "JIS", "utf-8"); if(isset($_POST['fname'])){ //添付ファイルがある場合 $filepath = $_POST['filepath']; $filetype = $_POST['filetype']; $filename = $_POST['fname']; $boundary = "_BOUNDARY_"; $message1 = "\n" . "--" . $boundary . "\n"; $message2= $message1 . "Content-Type: " . /**mime_content_type($filetype)**/ $filetype . "; name=\"" . $filename . "\n"; $message3= $message2 . "Content-Disposition: attachment; filename=" . $filename . "\n"; $message4= $message3 . "Content-Transfer-Encoding: base64\n"; $message5= $message4 . "\n" . chunk_split(base64_encode(file_get_contents($filepath,FILE_USE_INCLUDE_PATH))). "\n"; $message6= $message5 . "--" . $boundary . "--"; }//if //内容 $message = "--" . $boundary . "\n" . "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n\n" .mb_convert_encoding($honbun , "JIS" , "utf-8") . $message6; //送信元メールアドレス $from = "Content-Type: multipart/mixed; boundary=\"" . $boundary . "\"\n" ."From: " . $mailaddress1; $xmail = "X-Mailer: PHP/". phpversion(); $i = 0; if(mail($to, $title, $message, $from . "\r\n" . $xmail)){ //メール送信が完了した場合 $_SESSION['error' . $i] = "お問い合わせ内容を送信しました。"; $_SESSION['mailsend'] = TRUE; }else{ //メール送信ができなかった場合 $_SESSION['error' . $i] = "お問い合わせ内容を送信できませんでした。"; }//if $i++; $_SESSION['errorNum'] = $i; }//if }//if //ファイルパスを取得 $filePathName = "contact"; $filepath = filePathReturn($filePathName,$projectName); header($filepath); exit;

現在の状況としては添付なしの場合メール送信できますが、添付有りの場合以下の画面のように表示されメール送信できません。

イメージ説明
自分でデバックをしてみたところ、mailsend.phpのif(mail($to, $title, $message, $from . "\r\n" . $xmail))の部分で何らかの原因でFALSE になってしまうためだと分かりました。どなたか原因に心当たりがある方がいらっしゃいましたら、ご教示頂けると幸いです。よろしくお願いします。

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

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

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

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

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

m.ts10806

2017/09/14 07:53

サーバーのエラーログは確認しましたか?
KentaroOnoda

2017/09/14 08:19

ご指摘ありがとうございました。ログは確認しましたが、特にエラー表示されていないです。
t_obara

2017/09/20 10:01

一般的なメールクライアントが作成するメール内容と、提示されたコードが生成したメール内容を見比べてみて、何が違うのか、違う部分がどのコードに由来するのかをご確認いただくと、問題の原因が絞り込めるのではないでしょうか。
KentaroOnoda

2017/09/26 05:54

ご指摘ありがとうございます。参考にしてみます。
guest

回答2

0

さすがにmail()の戻り値だけでは原因を特定できないので、すべてのエラーを表示するようにしてみてはどうでしょうか?
mailsend.phpの頭にerror_reportingを設定してみて下さい。

php

1<?php 2error_reporting(E_ALL);

またmail()の引数をすべてログに落とすかvar_dumpしてみましょう。
原因を特定できないときは、すべての変数やエラーメッセージを出力してみるといいですよ。

投稿2017/09/21 06:47

ooeok

総合スコア469

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

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

0

$messageのダブルクォートが一部抜けてます。
下記のように、mailsend.phpにコードを追加してメールを送信する前にメールが送信されるときの内容を見てみます。

php

1... 2echo '<pre>'; 3echo $from ."\n"; 4echo $message ."\n"; 5echo '</pre>'; 6exit(); 7 8if (mail(...)) { 9 ... 10} else { 11 ... 12}

下記表示結果です。

Content-Type: text/plain; name="《添付ファイル名》の部分の末尾のダブルクォートが抜けてます。

いちおうダブルクォートなくても大丈夫な場合もありますが、ダメな場合もあるので、下記のContent-Disposition: attachment; filename=《添付ファイル名》の部分もダブルクォートでくくります。

それから、《メール本文》のContent-Transfer-Encoding: 7bitが抜けてます。

Content-Type: multipart/mixed; boundary="_BOUNDARY_" From: 《メールアドレス》 --_BOUNDARY_ Content-Type: text/plain; charset="ISO-2022-JP" 《メール本文》 --_BOUNDARY_ Content-Type: text/plain; name="《添付ファイル名》 Content-Disposition: attachment; filename=《添付ファイル名》 Content-Transfer-Encoding: base64 《Base64エンコードした添付ファイルの内容》 --_BOUNDARY_--

mailsend.phpPHPのコードを下記のようにしてみてはいかがでしょうか。

php

1if(isset($_POST['fname'])){ 2 //添付ファイルがある場合 3 $filepath = $_POST['filepath']; 4 $filetype = $_POST['filetype']; 5 6 $filename = $_POST['fname']; 7 $boundary = "_BOUNDARY_"; 8 $message1 = "\r\n" . "--" . $boundary . "\r\n"; 9 10 //↓修正 11 $message2= $message1 . "Content-Type: " . /**mime_content_type($filetype)**/ $filetype . "; name=\"" . $filename . "\"\r\n"; 12 //↓修正 13 $message3= $message2 . "Content-Disposition: attachment; filename=\"" . $filename . "\"\r\n"; 14 $message4= $message3 . "Content-Transfer-Encoding: base64\r\n"; 15 16 $message5= $message4 . "\r\n" . chunk_split(base64_encode(file_get_contents($filepath,FILE_USE_INCLUDE_PATH))). "\r\n"; 17 $message6= $message5 . "--" . $boundary . "--"; 18}//if 19 20//↓修正 21//内容 22$message = "--" . $boundary . "\r\n"; 23$message .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\r\n"; 24$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; 25$message .= mb_convert_encoding($honbun , "JIS" , "utf-8"); 26 27//添付ファイルがある場合 28if (isset($message6)) { 29 $message .= $message6; 30}

あと、気になったのですがメールの場合は改行コードは\nではなく\r\nです。PHPだとエラーにはならないハズですが、気持ち悪いので修正したほうがいいです。

投稿2017/09/14 09:18

編集2017/09/14 09:21
Tomak

総合スコア1652

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

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

KentaroOnoda

2017/09/15 03:20

丁寧なご回答頂き誠にありがとうございます。ご指摘頂いた内容で早速試してみたのですが、やはりメールを送信する事はできませんでした。やはり他に原因があるのかもしれないですね・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問