実現したいこと
入力フォームで、入力された情報を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?>
回答2件
あなたの回答
tips
プレビュー