teratail初登校です。
粗があったらすみません。
過去の質問
https://teratail.com/questions/191810
この質問を見て、だいたい質問内容が被っているのですが、
望んだ解決方法が記載されていなかったので。
実現したいこと
HPのフォームに入力があったときに以下2つのメールを送信する。
1.入力されたメールアドレスに対しての自動返信メール
2.フォーム管理者メールアドレスへのフォーム内容のメール
環境
サーバー Kusanagi9 nginx122
PHP 7.4.33
PHPMailer 6.9.1
メールサーバー Conoha
コード
メール送信コードは以下です。(抜粋)
(send.php)
php
1 2<?php 3session_start(); 4?> 5 6<HPのヘッダーメニュー>(省略) 7 8<?php 9 //------------------------------ 10 //PHPMailerをインポート 11 //------------------------------ 12 use PHPMailer\PHPMailer\PHPMailer; 13 use PHPMailer\PHPMailer\SMTP; 14 use PHPMailer\PHPMailer\Exception; 15 16 //Composerのオートローダー読み込み 17 require __DIR__ . '/vendor/autoload.php'; 18 //エラーメッセージ用日本語ファイル読み込み 19 require __DIR__ . '/vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php'; 20 21 //------------------------------ 22 //言語・文字コードの設定 23 //------------------------------ 24 mb_language("japanese"); 25 mb_internal_encoding("UTF-8"); 26 27 //フォーム内容 28 $namae = $_SESSION['namae']; 29 $tenmei = $_SESSION['tenmei']; 30 $email = $_SESSION['email']; 31 $genre = $_SESSION['genre']; 32 $radio = $_SESSION['radio']; 33 $message = $_SESSION["message"]; 34 $current = time(); 35 date_default_timezone_set("Asia/Tokyo") ; 36 $time = date("Y年m月d日 H時i分", $current) ; 37 38 //env.phpの環境変数っぽいphp読み込み 39 $env = require __DIR__ . '/env.php'; 40 41 $smtp_host=$env['smtp_host']; 42 $smtp_from=$env['smtp_from_address']; 43 $smtp_password=$env['smtp_password']; 44 $smtp_port=$env['smtp_port']; 45 $smtp_admin=$env['smtp_admin_address']; 46 47 //------------------------------ 48 //メール本文の整形 49 //------------------------------ 50 $body = 'お問い合わせ日時 : '.$time ."\r\n"; 51 $body .= 'メールアドレス : '.$email ."\r\n"; 52 $body .= 'お問い合わせ内容 : '.$message; 53//他情報は記載省略 54 55 //メールインスタンス生成(引数trueでException有効化) 56 $user_mail = new PHPMailer(true); 57 //日本語設定 58 $user_mail->CharSet ='UTF-8'; 59 60//mailerのデバッグ 61 // $user_mail->SMTPDebug=3; 62 63//設定変更 64 $user_mail->SMTPOptions=[ 65 'ssl'=>[ 66 'verify_peer' => false, 67 'verify_peer_name' => false, 68 'allow_self_signed' => true 69 ] 70 ]; 71 72 // SMTPサーバの設定 73 $user_mail->isSMTP(); 74 $user_mail->Host = $smtp_host; 75 $user_mail->SMTPAuth = true; // SMTP authenticationを有効化 76 $user_mail->Username = $smtp_from;// SMTPサーバーのユーザ名 77 $user_mail->Password = $smtp_password; // SMTPサーバーのパスワード 78 $user_mail->SMTPSecure = 'ssl'; // 暗号化を有効(tls or ssl)無効の場合はfalse 79 $user_mail->Port = $smtp_port; // TCPポートを指定(tlsの場合は465や587) 80 81 //送信情報設定 82 $user_mail->setFrom($smtp_from); // 送信者 83 $user_mail->addAddress($email); // 宛先 84 $user_mail->addCC($smtp_from); // CC宛先 85 $user_mail->Sender = $smtp_from; // Return-path 86 87 // 送信内容設定 88 $user_mail->Subject = "お問い合わせありがとうございました"; 89 $user_mail->Body = $body; 90 91 $user_mail->send(); 92 93$_SESSION = array(); 94session_destroy(); 95?> 96<HPのフッター>(省略)
また、フォーム部分については以下のコードです。
(contact.php)
PHP
1<?php 2session_start(); 3$namae = isset($_SESSION["namae"]) ? $_SESSION["namae"] : ""; 4$tenmei = isset($_SESSION["tenmei"]) ? $_SESSION["tenmei"] : ""; 5$email = isset($_SESSION["email"]) ? $_SESSION["email"] : ""; 6$genre = isset($_SESSION["genre"]) ? $_SESSION["genre"] : ""; 7$radio = isset($_SESSION["radio"]) ? $_SESSION["radio"] : ""; 8$message = isset($_SESSION["message"]) ? $_SESSION["message"] : ""; 9?> 10 11<HPのヘッダーメニュー>(省略) 12 13 <form action="./contactphp.php" method="post"> 14 <dl class="form_area"> 15 <dt class="repuired">お名前</dt> 16 <dd><input type="text" name="namae" required value="<?php echo $namae; ?>"></dd> 17 <dt class="repuired">メールアドレス</dt> 18 <dd><input type="email" name="email" required value="<?php echo $email; ?>"></dd> 19(以下フォーム内容省略) 20 </dl> 21 <p class="kakunin">お間違いがなければ[送信]ボタンを押してください。</p> 22 <input type="submit" value="送 信" class="btn"> 23 </form> 24<HPのフッター>(省略) 25
(contactphp.php)
php
1<?php 2session_start(); 3?> 4 5<HPのヘッダーメニュー>(省略) 6 7 <?php 8 9 $namae = htmlspecialchars($_POST["namae"],ENT_QUOTES); 10 $tenmei = htmlspecialchars($_POST["tenmei"],ENT_QUOTES); 11 $email = htmlspecialchars($_POST["email"],ENT_QUOTES); 12 $genre = htmlspecialchars($_POST["genre"],ENT_QUOTES); 13 $radio = htmlspecialchars($_POST["radio"],ENT_QUOTES); 14 $message = htmlspecialchars($_POST["message"],ENT_QUOTES); 15 $message_view = nl2br($message); 16 17 // 入力内容のチェック 18 // 名前のチェック 19 if(strlen(trim($namae)) == 0) {//ゼロバイト(何も入力されていなかったら) 20 $error[] = "名前をご入力ください"; 21 } 22 //メールアドレスのチェック 23 if(strlen(trim($email)) == 0){//ゼロバイト(何も入力されていなかったら) 24 $error[] = "メールアドレスをご入力ください。"; 25 } 26 else{//入っていたとしても下記の形式とマッチしていなかったら"メールの形式が正しくないと表示される" 27 if(!preg_match("/^[a-zA-Z0-9.!#$%&'*+\/=?^_'{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9]+)+$/",$email)){ 28 $error[]="メールの形式が正しくありません。"; 29 } 30 } 31 32 //エラー表示を出すコード 33 if(isset($error)){//エラーを表示させてほしい 34 echo "<ul>\n";//Ulで 35 36 foreach($error as $e) {//エラーを$eとして 37 echo "<li>{$e}</li>\n"; 38 } 39 echo "</ul>\n"; 40 } 41 42 43 echo <<< END 44 45 <table> 46 <tr><th>お名前</th><td>{$namae}</td></tr> 47 <tr><th>メールアドレス</th><td>{$email}</td></tr> 48 <tr><th>お問い合わせ内容</th><td>{$message_view}</td></tr> 49(他省略) 50 </table> 51 52 END; 53 54 ?> 55 56 <a href="./contact.php" class="php_btn">戻る</a> 57 <?php 58 59 if(!isset($error)){//エラーがなければこのボタンを表示させる 60 echo " <a href=\"./send.php\" class=\"php_btn\">送信する</a>\n "; 61 } 62 63 ?> 64<HPのフッター>(省略) 65
質問内容
上記コードでメールの送受信を行った場合、エラーログには何も残りませんでした。
ですが、Outlook(POP3)でのメールを確認したところ、連続したテストの場合最初の1回だけしか受信できませんでした。
フォームのテスト時には、入力欄に同じメールアドレスを入れています。
現段階で、自分としては以下の2通りの原因と考えています。
原因1.自分が理解できていない何かしらのミス。
原因2.同一アドレスから同一アドレスへの連続したメールなのでメールサーバーでスパムとして弾かれている?
質問1
有識者の方々にもっと良い方法などがあれば、アドバイス・ご指摘を受けたいです。
(使っているパッケージからコードから何でも)
質問2
上記の原因2の場合、
実現したいこと2.フォーム管理者メールアドレスへのフォーム内容のメール
についての実現方法をどうしたらよいか。
フォーム管理者メールと送信元メールは常に固定なので、頻発すると困る。
(最悪フォーム入力者へのbccに管理者アドレスを入れるのでもよいが、管理者アドレスはできるだけ不特定アドレスからのメールを受信したくないです)
以上、お知恵を拝借したいです。
よろしくお願いします。
[07/26] 追記
わかっていること
・lolipopサーバー(開発者個人契約)では正常に動作した
新たにわかったこと
・ローカル環境(xampp)で試した結果、
php7.4.33(本番環境),php8.1.12(最新環境)のどちらでも正常に動作した。
・$user_mail->SMTPDebug=3; を有効にした上で、フォームを開いたウィンドウを3つ用意し、
aboutmy.emailのアドレス3つに対して順番に送信テストを行ったところ、
本番環境では出力された結果の3つとも、
CLIENT -> SERVER: RCPT TO:(1つ目のメールアドレス)
となっていた。
対して、xamppのローカル環境で実行したところ、
各ウィンドウとも正常な動作をした。
(ブラウザはChromeで、ウィンドウはそれぞれ別プロファイルを使用)
回答1件
あなたの回答
tips
プレビュー