owned mediaウェブ制作に役立つコンテンツを発信中!

PHPで自動返信メール機能付きのコンタクトフォームを作成する(送信画面)

最終更新日: Update!!
前回、前々回と3回にわたり紹介してきましたPHPでのコンタクトフォーム作成ですが、今回は最後となる送信画面を作成していきます。確認画面から引き継いだSESSION変数をメールで送信し、送信完了のメッセージを表示させます。また、当記事で紹介しているのはメールフォームの動作についてまとめている内容になります。実用においてはこれ以外にも十分なセキュリティ対策が必要となるので、あらかじめご注意ください。また入力値のバリデーションここでは紹介していません。別記事「PHPでサーバーサイドのフォームバリデーションを実装する」にて紹介しています。   (過去の記事はこちら) ・PHPで自動返信メール機能付きのコンタクトフォームを作成する(入力画面) ・PHPで自動返信メール機能付きのコンタクトフォームを作成する(確認画面)  
コンタクトフォームの送信画面
画面自体は入力画面や確認画面と同じようにHTMLで作成し、メール送信部分はPHPで作成していきます。また自動返信メールの本文もこちらで設定します。   【send.php】※一部抜粋
<?php 
  session_start();
  if(!$_SESSION) {
    header('Location: ./index.php');
  }

  //任意入力項目の配列が空の場合のエラーメッセージ制御
  error_reporting(E_ALL ^ E_NOTICE);

  //メール差出人
  $sender = "メール差出人";

  //メール送信元
  $mailFrom = "info@example.com";

  //メール返信先
  $replyTo = "info@example.com";

  //管理者メールアドレス
  $adminEmail = "info@example.com";

  //メールヘッダ設定
  $addHeader ="From:".mb_encode_mimeheader($sender)."<".$mailFrom.">\n";
  $addHeader .= "Reply-to: ".$replyTo."\n";
  $addHeader .= "X-Mailer: PHP/". phpversion();

  // 迷惑メール対策
  $addOption = '-f'.$mailFrom;

  //タイムスタンプ
  date_default_timezone_set('Asia/Tokyo');
  $timeStamp = time();
  $week = array('日', '月', '火', '水', '木', '金', '土');
  $dateFormatYMD = date('Y年m月d日',$timeStamp);
  $dateFormatHIS = date('H時i分s秒',$timeStamp);
  $weekFormat = "(".$week[date('w',$timeStamp)].")";
  $outputDate = $dateFormatYMD.$weekFormat.$dateFormatHIS;

  //XSS対策用サニタイズ
  function h($str) {
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
  }
  
  //配列データの処理
  $checkboxArray = implode(",",$_SESSION['input_checkbox']);

  //メール本文内に表示するデータの変数化
  $text = h($_SESSION['input_text']);
  $kana = h($_SESSION['input_kana']);
  $email = h($_SESSION['input_email']);
  $tel = h($_SESSION['input_tel']);
  $url = h($_SESSION['input_url']);
  $zipcode = h($_SESSION['input_zipcode']);
  $radio = h($_SESSION['input_radio']);
  $checkbox = h($checkboxArray);
  $selectbox = h($_SESSION['input_selectbox']);
  $textarea = h($_SESSION['input_textarea']);
  
  //自動返信メール本文(ヒアドキュメント)
  $messageUser = <<< EOD
お問い合わせありがとうございます。
下記の内容で承りました。

----------------------------------------------------

【全角テキスト】{$text}
【カタカナ】{$kana}
【メールアドレス】{$email}
【電話番号】{$tel}
【URL】{$url}
【郵便番号】{$zipcode}
【ラジオボタン】{$radio}
【チェックボックス】{$checkbox}
【セレクトボックス】{$selectbox}
【テキストエリア】
{$textarea}

----------------------------------------------------

折り返しご返信させていただきますので、
しばらくお待ちください。
EOD;

  //管理者確認用メール本文(ヒアドキュメント)
  $messageAdmin = <<< EOD
ウェブサイトより下記の内容でお問い合わせがありました。

----------------------------------------------------

【全角テキスト】{$text}
【カタカナ】{$kana}
【メールアドレス】{$email}
【電話番号】{$tel}
【URL】{$url}
【郵便番号】{$zipcode}
【ラジオボタン】{$radio}
【チェックボックス】{$checkbox}
【セレクトボックス】{$selectbox}
【テキストエリア】
{$textarea}

----------------------------------------------------
EOD;

  //メール共通送信設定
  mb_language("ja");
  mb_internal_encoding("UTF-8");
  
  if(!empty($_SESSION['input_email'])) {
    
    //自動返信メール送信設定
    mb_send_mail($_SESSION['input_email'],"お問い合わせありがとうございます",$messageUser,$addHeader,$addOption);
  
    // 管理者確認用メール送信設定
    mb_send_mail($adminEmail,"お問い合わせ:".$outputDate,$messageAdmin,$addHeader,$addOption); 
    
    $isSend = true;
  } else {
    $isSend = false;
  }

  session_destroy();
?>

〜 一部省略 〜 

<?php if($isSend): ?>
  <p>フォームの内容が【<?php echo h($_SESSION['input_email']); ?>】宛にメールで送信されました。 
  </p> 
<?php else: ?> 
  <p>送信エラー:メールフォームからの送信に失敗しました。お手数ですが再度お試しください。 
  </p>
<?php endif; ?>
  最初に確認画面同様セッションを開始します。そして直接送信画面にアクセスがあった場合には、フォーム入力画面にリダイレクトさせるようにしておきます。続けてメールヘッダ情報を入力していきます。差出人の名前や、返信先、管理者メールアドレスなどは変数として格納しておくと編集が便利です。必要に応じてタイムスタンプの出力を用意します。いつお問い合わせがあったのかがわかりやすくなるので便利ですね。   メール本文にはフォーム入力内容を出力させますので、htmlspecialchars()関数を使って特殊文字をエスケープさせますが、コードが長くなるので、関数化しておくとスマートですね。チェックボックスなど複数選択が可能な項目は値が配列になるので、1つの文字列となるよう加工も合わせて行っておきます。   そして、自動返信メールと管理者用メールのフォーマットを作成します。複数行になる場合には、文字列を連結させるよりもヒアドキュメントの形で記述するとわかりやすくなります。(参考記事:PHPで複数行に渡る文字列を出力するときに便利なヒアドキュメント)   続けて、作成したフォーマットを、mb_send_mail()関数でメール送信します。この時にはメールアドレスの値があるかどうかを判断して送信させるようにすることで、不正なリクエストによるメール誤送を防ぐことができます。最後にsession_destroy()でセッションを終了します。送信完了のメッセージを伝えるHTMLも、送信可否によって分岐させておくと親切ですね。   以上でコンタクトフォームの送信画面は完成です。 入力画面、確認画面と合わせてPHPのコンタクトフォームについてまとめてきました。一見すると複雑ですが、一つひとつの画面の役割と流れ、そして処理を理解すればイメージしやすいと思います。  
  • はてなブックマーク
  • Pocket
  • Linkedin
  • Feedly

この記事を書いた人

Twitter

comments

  • オガワ シンヤ

    2020.12.8
    ゆうすけさん 当ブログをご覧いただきありがとうございます。 また、詳しいコメントも投稿していただきありがとうございます。 仰られます通り、迷惑メール対策としては記事に記載している以外にも対応策は検討する余地もありそうですね。 参考にさせていただきます。 また、一部コードの文末に含まれている「n」は正しくは「\n」の間違いでした。 ご指摘ありがとうございました、すでに記事の内容は修正しております。
  • ゆうすけ

    2020.11.19
    // 管理者確認用メール送信設定 mb_send_mail($adminEmail,"お問い合わせ:".$outputDate,$messageAdmin,$addHeader,$addOption); ここの部分は $addHeader該当部分が差出人として認識されるので、迷惑メールに振り分けられます。なので解決策として $addHeader ="From:".mb_encode_mimeheader($sender)."n"; $addHeader .= "Reply-to: ".$replyTo."n"; $addHeader .= "X-Mailer: PHP/". phpversion(); 部分を新しく作り $addHeade2 .= $_SESSION['input_email']; $addHeader2 .= "X-Mailer: PHP/". phpversion(); として、差出人に表示される部分をメールアドレスのみに設定し直しました、なので // 管理者確認用メール送信設定 mb_send_mail($adminEmail,"お問い合わせ:".$outputDate,$messageAdmin,$addHeader,$addOption); は // 管理者確認用メール送信設定 mb_send_mail($adminEmail,"お問い合わせ:".$outputDate,$messageAdmin,$addHeader2,$addOption); としました。 あと $addHeader ="From:".mb_encode_mimeheader($sender)."n"; の最後のnが入ると謎のnが表示されるので僕は消しました。 役に立てると嬉しいです。

sponserd

    keyword search

    recent posts

    • Twitter
    • Github
    contact usscroll to top
      • Facebook
      • Twitter
      • Github
      • Instagram