🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

2回答

2841閲覧

PHPを使ったメールの送信 未経験独学

cdkaoekd434

総合スコア22

PHP

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

2クリップ

投稿2021/03/29 09:29

編集2021/03/29 09:41

実現したいこと

入力フォームで、入力された情報をPHPMailerを使ってメールの送受信を行いたいのですが、流れとしては、入力フォーム→確認画面→送信の順で行きたいのですが、送信の部分で以下のようなエラーが出てつまずいてます。調べてみても、原因が分からず、疲れを感じたので、質問することにしました。teratailの利用は初めてです。エンジニアではなく自営業です。

以下エラー名。送信失敗: Message body empty

経過について

PHPMailerでのメールの送受信は1度成功していますので、STMP設定のコードは問題ないです多分。
確認画面の表示と本文に表示されるメッセージ項目数を追加したいと思いコードを少し変更したら、エラーが出るようになりました。セキュリティー対策tokenも追加しました。form1とform2では、確認画面までは表示されるので、問題があるのはform3のコードだと思うのですが、原因が分からず困っています。
非常にわかりずらい、コードですが、ヒントだけでもいいので、教えていただけないでしょうか? htmlspecialcharsは後で修正します。Composer利用してません。

コードの内容は以下です。
入力フォームの画面のコード(form1)

php

1<?php 2session_start(); 3 4$errors = array(); 5 6if(isset($_POST['submit'])) { 7 8$name = $_POST['name']; 9$email = $_POST['email']; 10 11$time1 =$_POST['time1']; 12$timetime =$_POST['timetime']; 13 14$subject = $_POST['subject']; 15$body = $_POST['body']; 16 17 18$name = htmlspecialchars($name, ENT_QUOTES); 19$email = htmlspecialchars($email, ENT_QUOTES); 20 21 22$time1 = htmlspecialchars($time1, ENT_QUOTES); 23$timetime = htmlspecialchars($timetime, ENT_QUOTES); 24 25if($name === "") { $errors['name'] ="名前が入力されていません。 "; 26} 27 28if($email === "") { $errors['email'] ="メールアドレスが入力されていません。 "; 29} 30 31if($time1 === "") { $errors['time1'] ="第1希望:※月と日付を選択してください。 "; 32} 33if($timetime === "") { $errors['timetime'] ="第1希望:※時間を選択してください。 "; 34} 35 36if(count($errors) === 0) { 37$_SESSION['name'] = $name; 38$_SESSION['email'] = $email; 39 40$_SESSION['time1'] = $time1; 41$_SESSION['timetime'] = $timetime; 42 43header('Location:http://www.△△form2.php'); 44 exit(); 45 } 46} 47 48 49if(isset($_GET['action']) && $_GET['action'] === 'edit'){ 50 51 52$name = $_SESSION['name']; 53$email = $_SESSION['email']; 54 55$time1 = $_SESSION['time1']; 56$timetime = $_SESSION['timetime']; 57 58 } 59?> 60 61<!DOCTYPE html> 62 63<html> 64 65<head> 66<meta content="text/html; charset=utf-8"/> 67 68 <title>お問い合わせ</title> 69 <script type="text/javascript" src="jquery.min.js"></script> 70<script type="text/javascript"> 71 72 </script> 73 74<?php echo "<ul>";foreach($errors as $value) { 75 76echo "<li>"; 77echo $value; 78echo "</li>"; 79} 80 81echo "</ul>"; 82 83?> 84 85</head> 86 87<body> 88 89 90<form action ="form1.php" method ="post"> 91 92<table> 93<tr> 94 95 96 97<th>名前:※</th><td><input type="text" name="name" id="name" value="<?php if(isset($name)){ echo $name; } ?>"/></td> 98</tr> 99<tr> 100 101<th>メールアドレス:※</th><td><input type="text" name="email" id="address" value="<?php if(isset($email)){ echo $email; } ?>"/></td> 102</tr> 103 <tr> 104 105<th>下記選択枠より、</span><span>ご希望の日時をご選択ください。</span></th><td> 106 107 108<table><tbody><tr class="time_list"> 109 <td class="b">第1希望:<span class="fontS"></span></td> 110 <td class="fontSS"> 111 <table><tbody><tr class="time_list2"> 112 <td> 113 <input type="date" id="input_date1" class="cal lt_004 hasDatepicker" name="time1" value="<?php if(isset($time1)){ echo $time1; } ?>"/></td > 114 115 116 117 <td> 118 <div class="wrap"> 119 120 121 <select id="input_time1" name="timetime"> 122 <option value="">時間指定</option> 123 <option value="10:00~11:00"<?php if(isset($timetime) && $timetime==="10:00~11:00") { echo "selected" ;} ?>>10:00~11:00</option> 124 <option value="11:00~12:00"<?php if(isset($timetime) && $timetime==="11:00~12:00") { echo "selected" ;} ?>>11:00~12:00</option> 125 126 </select> 127 </div> 128 </td> 129 </tr></tbody></table> 130 </td> 131 </tr></tbody></table> 132 133<td colspan="2"><input type ="submit" name ="submit"value="確認画面へ"></td></tr> 134 135 136</form> 137 </body></html>

確認画面のコード(form2)

php

1<?php 2 3 4session_start(); 5 6if(isset($_SESSION['name'])){ 7 8$name = $_SESSION['name']; 9$email = $_SESSION['email']; 10 11$time1 = $_SESSION['time1']; 12$timetime = $_SESSION['timetime']; 13 14} 15 16$_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(48)); 17 18$token = htmlspecialchars($_SESSION['token'], ENT_QUOTES); 19 20?> 21 22<!DOCTYPE html> 23 24<html> 25<head> 26<meta charset ="utf-8"> 27 28<title>確認画面</title> 29</head> 30<body> 31 32<form action ="form3.php" method ="post"> 33 34<input type ="hidden" name ="token" value ="<?php echo $token ?>"> 35 36<table> 37<tr> 38 39<th>名前:</th><td><?php echo $name; ?></td> 40</tr> 41<tr> 42<th>メールアドレス:</th><td><?php echo $email; ?></td> 43</tr> 44<th>第1希望:</th><td><?php echo $time1; ?></td> 45<tr> 46</tr> 47<th>時間:</th><td><?php echo $timetime; ?></td> 48<tr> 49</tr> 50 51 52<td colspan="2"><input type ="submit" name="submit"value ="送信する"></td> 53</tr> 54 </table> 55</form> 56 57<p><p><a href="form1.php?action=edit">入力画面へ戻る</a></p> 58 59</body> 60</html>

PHPMaierのコード (form3)

php

1<?php 2 3// PHPMailer クラスをネーム空間にインポート 4use PHPMailer\PHPMailer\PHPMailer; 5use PHPMailer\PHPMailer\SMTP; 6use PHPMailer\PHPMailer\Exception; 7 8 9 10require('PHPMailer/src/PHPMailer.php'); 11require('PHPMailer/src/Exception.php'); 12require('PHPMailer/src/SMTP.php'); 13 14 15// 入力内容の取得・変数に格納 16session_start(); 17 18 19if(isset($_POST['token'], $_SESSION['token']) && ($_POST['token'] === $_SESSION['token'])){ 20 unset($_SESSION['token']); 21 22$name = $_SESSION['name']; 23$email = $_SESSION['email']; 24 25$time1 = $_SESSION['time1']; 26$timetime = $_SESSION['timetime']; 27 28} 29// メール日本語対応 30mb_language("japanese"); 31mb_internal_encoding("UTF-8"); 32 33 34// インスタンス生成 35$mail = new PHPMailer(true); 36 37// 文字エンコードを指定 38$mail->CharSet = 'utf-8'; 39 40try { 41 // デバッグ設定 42 // $mail->SMTPDebug = 2; // デバッグ出力を有効化(レベルを指定) 43 // $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str<br>";}; 44 45 // SMTPサーバの設定 46 $mail->isSMTP(); // SMTPの使用宣言 47 $mail->Host = '△△.com'; // SMTPサーバーを指定 48 $mail->SMTPAuth = true; // SMTP authenticationを有効化 49 $mail->Username = '■■.org'; // SMTPサーバーのユーザ名 50 $mail->Password = '???'; // SMTPサーバーのパスワード 51 $mail->SMTPSecure = 'ssl'; // 暗号化を有効(tls or ssl)無効の場合はfalse 52 $mail->Port = 465; // TCPポートを指定(tlsの場合は465や587) 53 54 55 56 // メール本体 57 $mail->setFrom('■■.org', 'maru'); // 送信元メールアドレスと名前 58 $mail->addAddress($email,$name); // 送信先メールアドレスと名前 59 $mail->Body = $name; 60 $mail->Body = $email; 61 $mail->Body = $time1; 62 $mail->Body = $timetime; 63 64 65 66// 送信 67 $mail->send(); 68 echo '送信済み'; 69} catch (Exception $e) { 70 echo "送信失敗: {$mail->ErrorInfo}"; 71} 72?>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/03/29 10:12

〈teratailの利用は初めてです〉ほんとうに?
m.ts10806

2021/03/29 11:06

> ヒントだけでもいいので、 php mailer Message body empty で検索。
poppopa

2021/03/29 11:23

前から思ってましたがm6uさん、あなた社会人ですよね プログラミングの勉強より敬語くらい使えるようになりましょうb
退会済みユーザー

退会済みユーザー

2021/03/29 11:28 編集

score 0 の人に言われたくないネ。複数id使っている疑いも持っているけど、証明する手立てがないので突っ込まないでおきます。もう、特徴的な文体でわかっているんですけどね。
kyoya0819

2021/03/29 11:28

> 前から思ってましたがm6uさん すごい! 今日アカウントを作ったばかりなのにもうそんなにm6uさんの言動を把握されているんだ!
m.ts10806

2021/03/29 22:40

ルール守れない人はそもそも同じ土俵には上がれない。
poppopa

2021/03/29 23:20

チース!長い物に巻かれる事で有名なkyoya0819くん14歳じゃないっすかー
poppopa

2021/03/29 23:21

敬語くらい使いましょうと指摘されただけで、顔真っ赤にして論点ずらすってレベル低すぎやなー
退会済みユーザー

退会済みユーザー

2021/03/30 00:09 編集

ghtew2さんに教わればいいと思うよ、同じようにPHPMailer使っていたし。それで、なんでそんなにpoppopaさんはcdkaoekd434さんのような初歩的なコードのミスを見抜けないような人をかばうんですか? poppopaさんも出し惜しみしないで教えてあげたらいいのに。
phper.k

2021/03/30 01:29

前回指摘された点ぐらい直したコード出してきましょうよ
poppopa

2021/03/30 02:59

かばってないですよ、私はあなたに敬語も使えないんですかという点しか指摘していません 相手が格下で、見下してるから敬語使わないのが正しいんでしょうか? あなたは人間性に問題ありそうですね!
poppopa

2021/03/30 03:00

>前回指摘された点ぐらい直したコード出してきましょうよ 激しく同意します
退会済みユーザー

退会済みユーザー

2021/03/30 04:50

ghtew2さんとcdkaoekd434さんと poppopaさんには敬語なんて使わなくてもいいと判断しました。それだけのことです。だから、わたしの回答や発言が気に入らないなら、わたしが出てこなくてもいいようにpoppopaさんがみんなの役に立つコードを書いて回答して助言すればいいのであって、わたしなんぞに構ったところで誰の助けにもなりませんよ。
K_3578

2021/03/30 04:51

少なくとも複垢という規約違反をしている相手にわざわざ敬意を払う必要ありますかねぇ・・・。
terminator

2021/03/30 05:20

お客様扱いして欲しいなら、プログラミングスクールでも行けよ
poppopa

2021/03/30 08:07

>m6u teratailやめてtwitterでもやってなさい
K_3578

2021/03/30 08:46 編集

@poppopa氏 >teratailやめてtwitterでもやってなさい 少なくともteratailに何の貢献もされていない貴方にそれを言う資格はない。 というかこれだけ時間が経っているのになぜ質問者は何一つレスポンスを 返さないんだろうなぁ
退会済みユーザー

退会済みユーザー

2021/03/30 08:42

poppopaさんが私よりも回答をつけて良質なコードを示して問題解決に至る手引ができるようになったら、やめてもいい。さぁ、コードを示してほしい。
poppopa

2021/03/30 08:44

>少なくともteratailに何の貢献もされていない貴方にそれを言う資格はない。 あなたにその資格がないと言われる筋合いもありませんわ
poppopa

2021/03/30 08:46

>私よりも回答をつけて良質なコードを示して問題解決に至る手引ができるようになったら、やめてもいい。 素直に(糞な)プライドが邪魔して敬語使えなくてすみませんでした。でしょ? 良い大人がごめんなさいもできないんですかね
poppopa

2021/03/30 08:47

14歳も見てるんだから良い大人の見本にならなくちゃだめですぞ。おっさん。
退会済みユーザー

退会済みユーザー

2021/03/30 09:01

質問者さん、まったくリアクションないから、捨て垢だったのかな。
K_3578

2021/03/30 09:06

とりあえず一人相撲取ってる人は暴言も吐いてるし通報しときますかね。
cdkaoekd434

2021/03/30 09:23

返事、遅れました。申し訳ございません。渡航の打ち合わせしていてもので。長らく返信が無くて申し訳ないです。 K_3578さん。poppopaさんは、 通報はしなくて結構ですよ。poppopaさんは迷惑はかけてはいないですから。ただ、私のことを思ってくれていたのだと思います。いろんな世代の方がいますから。捉え方は人それぞれですので。 私の質問が悪かったということで、ここは、終わりにしましょう。申し訳ありません。 m6uさん。回答ありがとうございます。今、解決の所に記載いたします。
kyoya0819

2021/03/30 09:24

> kyoya0819くん14歳じゃないっすかー ちょっとなに言ってるかわからない。
K_3578

2021/03/31 00:37

@質問者氏 >poppopaさんは迷惑はかけてはいないですから。 どう見ても個人攻撃してるようにしか見えないんですが私が間違ってますかね?
guest

回答2

0

無料サポセンじゃないんだけどなぁ。
一見して問題があると思えた箇所:

php

1 $mail->Body = $name; 2 $mail->Body = $email; 3 $mail->Body = $time1; 4 $mail->Body = $timetime;

この箇所を見て、なんとも思わないほうがおかしい。

php

1 $mail->Body = $name; 2 var_dump($mail->Body); 3 $mail->Body = $email; 4 var_dump($mail->Body); 5 $mail->Body = $time1; 6 var_dump($mail->Body); 7 $mail->Body = $timetime; 8 var_dump($mail->Body);

とかvar_dump()でその時点の変数の中身をダンプ(出力)するように書けば、
$mail->Bodyの中身がどのように変化しているかわかると思うんだけど。

文字列演算子を使わないと変数上書きするんだよね。


例えばなんだけど、

php

1 $mail->Body = <<<EOT 2お問い合わせを受け付けました。 3ウンタラカンタラ 4 5【お問い合わせ内容】 6お名前: $name 7メール: $email 8あとめんどうだから省略 9EOT;

みたいにヒアドキュメント構文でも(騙されたと思って真似して)駆使すれば、
送信メールのテンプレートののぞみの箇所にほしい情報を穴埋めして送信できるんじゃないですかね。
PHPMailerを扱う記事を複数読んで総合的に考えれば、そういうことくらいわかるでしょう。
単にフォームで受信した値をメール本文に出力するだけじゃなく、
メールとして読める内容にするには欠かせないやり方だと思うんだけどな。

PHPMailerは使ったことがないけど、使ったことがないなりにこういうところまでは想像つくよ?
詳しい人限定で情報を求めるghtew2さんにはお伝えしませんでしたが。

逆を言うと、なんでもうちょっとうまいやり方をしている事例を自分で探して
応用を利かせられないのか、自分の書いたコードの意味をよく考えたらいいですよ。

わからないところがあれば、ちゃんと表明してね。
もう繰り返し進歩のないPHPMailerの質問なんて見たくないし、
これまで指摘してくれた皆さんに申し訳ないと思ってほしいのよ。

仕事に戻りまーす。

投稿2021/03/29 23:56

編集2021/03/30 10:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

poppopa

2021/03/30 02:54

無料サポセンとか以前に敬語使いましょうよ ここは不特定多数が利用する場です あなたの庭じゃありません 今後もteratail続けたいなら最低限敬語くらい覚えましょう
退会済みユーザー

退会済みユーザー

2021/03/30 04:44 編集

teratail上で揚げ足取りばかりして、なんの貢献もしていない人に、とやかく言われたくないです。 私が出てこなくてもいいように、poppopaさんがより正確でわかりやすい完璧な回答をすればいいだけですよ。 この回答含め2403件回答していますが、全部目を通してから物申してください。 相手を選んで丁寧に回答をしているものもあります。
退会済みユーザー

退会済みユーザー

2021/03/30 04:55

おす! 久しぶりに見てみたら、随分レベルさがってんなぁ。 回答率も88%でぇか、運営、なぁにしてんだ? poppopa みてぇなのがでけぇ口叩くようになったらおしめぇだぞ? むかしっからどこのコミュニティもそうだろ。 全く、学習しねぇなぁ。修行がたんねぇんじゃねぇか?
poppopa

2021/03/30 08:08

>teratail上で揚げ足取りばかりして、 完全にアホですね・・・
poppopa

2021/03/30 08:09

敬語使いましょうに屁理屈垂れてんのはどこのだれでしょう >もう繰り返し進歩のないPHPMailerの質問なんて見たくないし、 見なければいい、teratail向いてない
cdkaoekd434

2021/03/30 09:28

m6uさん。poppopaさん。申し訳ございません。さぞ、ご迷惑をおかけしたことと思います。 m6uさん。回答ありがとうございます。修正しましたので、解決策の所に明示したいと思います。長らく不快な思いをされたようで、申し訳ございません。 poppopaさん。私のことを思ってくれたのですね。責められてばかりでしたので、少し安心しました。ありがとうございます。ご迷惑を申し訳ございません。
guest

0

自己解決

$mail->Body = $name;
$mail->Body .= $email;
$mail->Body .= $time1;
$mail->Body .= $timetime;

点を忘れていたので、代入している状態でエラーが発生していたようです。忘れていた、というよりよく分かりませんでした。参考本に書いてあったことを少し、自分なりに応用したら、出来ました。

回答くださった方々全員に感謝いたします。

私の質問が悪かったようですね。ただ、一つだけ、初心者でもわからないことは、どんどん質問してくださいっていうのが、テラテイルの方も広告でうたっていますので、なんといったら、良いのか?何人もの人から否定されるような回答も多く正直質問しづらくなっていますね。

私も質問するときは少しは調べているんですけどね。熟練者からすれば、理解難しいでしょうね。

回答ありがとうございました。

投稿2021/03/30 09:38

cdkaoekd434

総合スコア22

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

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

退会済みユーザー

退会済みユーザー

2021/03/30 09:44

なぜ、m6u さんの回答を読まないのか理解できない。。。
cdkaoekd434

2021/03/30 09:46

意味が分からないから
退会済みユーザー

退会済みユーザー

2021/03/30 10:09

意味がわからないなら、私の回答にコメントを下さい。具体的に、どこが、どう。 teratailでも質問の仕方の指針を https://teratail.com/help/question-tips として示しているので、これに則った質問であれば邪険にされないと思いますよ。
Zuishin

2021/03/30 10:14

複数アカウント使ってるやつは質問以前の話。
退会済みユーザー

退会済みユーザー

2021/03/30 11:17

質問者はベストアンサーを選択するっていう【回答を検証する義務】が課せられます。 権利ばかり主張するとか見苦しいですよ^^;
cdkaoekd434

2021/03/30 11:35

今までの経過だと、質問し返しても、大勢で反論されるだけな気がして。喧嘩のようになった方もおられますしね。両者ともいい気分にはなられいような気がしたからですね。私は本当は質問するのが、好きな方なんですけどね。行動を起こすのが好きなタイプですから。ただ、今までの経過からしてちょっと。
退会済みユーザー

退会済みユーザー

2021/03/30 21:14

誰宛のコメントかよくわかりませんが、「義務は放棄します。権利はあります」ってコメントもらっても「ひでぇな」としか思えないです。 ここは質問が好きだから質問するっていうサイトではなくて、エンジニアが抱える問題の解決をサポートし、質問・回答によって 生まれたコンテンツを同じ問題を持った人に届けるためのコミュニティです。 まともに義務が果たせるようになってから使用してください。 今のままだとノイズになり邪魔です。
退会済みユーザー

退会済みユーザー

2021/03/31 00:25

質問の中身を質問者が責められるのは当然。質問者の説明責任。 回答の中身は回答者が責められるのは当然。回答者の説明責任。 中身が伝わらないわからないのであれば指摘するのは当然。 それがQ&Aサイトってものですよ。 だから、私の回答にもわからない所があればご指摘ください、答えますよ。 時間を置いて内容をリファインしているつもりでいますが、読んでくれていますか。 回答者を頼らない質問を投稿するのはやめて、Q&Aサイトに向いてないんでブログでやってもらっていいですか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問