PHPで作るお問い合わせフォーム!コピペで送信までの流れを理解しよう

基本的なメール送信機能はコピペするだけでOK!
PHPメールフォームの送信の流れを理解しておくことでライブラリのカスタマイズにも役立ちます。

メールフォームはセキュリティ対策も非常に重要なので、自作メールフォームを本番で使用することは避けましょう。
オススメメールライブラリはページの一番下に掲載しています

shared-img-thumb-PAK86_pennotekakikomi20140312_TP_V-600x400

メールフォームの流れ

入力ページ(form.php)→確認ページ(confirm.php)→完了ページ(submit.php)

入力ページではスマホで表示された際に最適なキーボードを表示したり、名前や住所の自動入力を行なうための記述も行います。

完了ページではF5やページのリロードでメールを連投を防ぐ記述もします。

 入力ページ(form.php)

<form action="confirm.php" method="post">
<p class="form_tit">会社名<span class="require">必須</span></p>
<p><input name="company_name" type="text"></p>
<p class="form_tit">お名前<span class="require">必須</span></p>
<p><input name="name" type="text"></p>
<p class="form_tit">メールアドレス</p>
<p><input type="email" name="mail" autocomplete="email"></p>
<p class="form_tit">電話番号<span class="require">必須</span></p>
<p><input type="tel" name="tel" autocomplete="tel"></p>
<p class="form_tit">お問い合わせ内容の詳細</p>
<p><textarea name="detail" cols="" rows=""></textarea></p>
<p class="align-center"><input name="submit" type="submit" value="確認"></p>
</form>

確認ページ(confirm.php)

確認ページでは入力ページの値を受け取って表示します。
値は入力フォームのnameをキーに$_POSTの配列に保存されています。

送信処理を行なうためにこのページでもフォームの記述があります。
これらはtype=”hidden”なのでページ上には表示されません。

<?php
mb_language("japanese");
mb_internal_encoding("utf-8");
//必須項目に入力漏れがないか確認  
if(!empty($_POST['company_name']) && !empty($_POST['name']) && !empty($_POST['tel'])){
    $company_name=$_POST['company_name'];
    $name=$_POST['name'];
    $mail=$_POST['mail'];
    $tel=$_POST['tel'];
    $detail = $_POST['detail'];
    $detailDisp=nl2br($_POST['detail']);  
    $success = true;
}
?>
  
<?php if($success){//確認画面の表示 ?>
<form action="submit.php" method="post">
<input type="hidden" name="key" value="<? print $key ?>" />
    <p class="form_tit">会社名</p>
    <p><?php echo $company_name; ?><input name="company_name" type="hidden" value="<?php echo $company_name; ?>"></p>
    <p class="form_tit">お名前</p>
    <p><?php echo $name; ?><input name="name" type="hidden" value="<?php echo $name; ?>"></p>
    <p class="form_tit">メールアドレス</p>
    <p><?php echo $mail; ?><input type="hidden" name="mail" value="<?php echo $mail; ?>"></p>
    <p class="form_tit">電話番号</p>
    <p><?php echo $tel; ?><input type="hidden" name="tel" value="<?php echo $tel; ?>"></p>
    <p class="form_tit">お問い合わせ内容の詳細</p>
    <p><?php echo $detailDisp; ?><input type="hidden" name="detail" value="<?php echo $detail; ?>"></p>
    <p class="align-center"><input name="submit" type="submit" value="送信"></p>
  <p class="align-center"><a href="form.php">戻る</a></p>
</form>
<?php }else{//不備がある ?>
             <p>申し訳ございません、入力内容に不備がります。<br>
                    前ページに戻って正しく入力してください。</p>
                    <p class="align-center"><a href="form.php">戻る</a></p>
<?php } ?>

 完了ページ(submit.php)

メールの送信を行なう部分です。

mb_send_mailは「送り先メールアドレス,題名,内容,送り元」の順で記述します。
メールの送信に成功するとtrueが返ってきます。

<?php
mb_language("japanese");
mb_internal_encoding("utf-8");
 
if(!empty($_POST['company_name']) && !empty($_POST['name']) && !empty($_POST['tel'])){
$company_name=$_POST['company_name'];
$name=$_POST['name'];
$mail=$_POST['mail'];
$tel=$_POST['tel'];
$detail=htmlspecialchars($_POST['detail']);
 
$success=mb_send_mail("送り先メールアドレス","ホームページからのお問い合わせ","会社名:".$company_name."\n名前:".$name."\nメールアドレス:".$mail."\n電話番号:".$tel."\nお問い合わせ内容\n".$detail,"from:".$mail);
}
?>
<?php
if($success){//送信完了 ?>
<p>お問い合わせありがとうございます。</p>
<?php }else{//送信失敗 ?>
<p>大変申し訳ございません。お問い合わせの送信に失敗しました。</p>
<? } ?>

 連投を防ぐためセッションを利用する

ここまでの記述でおそらくメールを送信することは出来ると思いますが、完了ページで更新した際にメールが何度も送られてしまうことになります。
それを防ぐためにセッションにキーを保存して正しいステップでメールが送信されているか確認しましょう。

セッションはphpファイルの一番上に記述することを忘れないようにしましょう。

confirm.phpに以下の記述を追加します。

<?php
/*----- 入力フォーム -----*/
// セッション開始
  session_start();
 
// タイムスタンプと推測できない文字列にてキーを発行
  $key = md5(time()."任意の文字");
 
// 発行したキーをセッションに保存
  $_SESSION['key'] = $key;
?>

 次にsubmit.phpで発行したキーが正しいものか判定する記述を行います。

<?php
/*----- 完了画面 -----*/
// セッション開始
  session_start();
  
// 変数宣言
  $msg = "";
 
// セッションに保持されているキーと、POSTで飛んできたキーが同じかどうか判別
      if (  isset($_SESSION['key']) &&
      isset($_POST['key']) &&
      $_SESSION['key'] == $_POST['key']) {
          //メールを送信する処理
          //ここで$_POSTからの値を受け取りmb_send_mail関数を実行
      }
// セッションに保持されているキーを破棄する ※重要※
unset($_SESSION['key']);
?>

 form.phpにも追加の記述が必要

このままでは確認ページからform.phpに戻って再度入力し、確認ページ→完了ページと移動した場合にエラーが発生します。
なので、form.phpではセッションをリセットするための記述を行いましょう。

<?php
// セッションに保持されているキーを破棄する ※重要※
unset($_SESSION['key']);
?>

 メールフォーム作成のまとめ

できましたでしょうか?
上記のメールフォームを基本として自分の希望に沿ってカスタマイズしていきましょう。

ただ、今回の方法では確認ページから戻った時や入力ページで更新した時などにフォームに入力されていた内容がリセットされてしまいます。
$_POSTではなくセッションに値を保存すれば解決するのですが、カスタマイズがちょっとむずかしくなるという理由でこちらの方法を紹介しました。

参考にさせていただいた記事

以下の記事を参考にさせていただきました。ありがとうございます。

http://homepage.wakabagari.com/lesson7/lesson7.4.php
https://ics.media/entry/11221/2
お問い合わせフォームへの連投を防ぐ方法+α

オススメのPHPメールフォーム

WordPressで作られているサイトであればWPのプラグインの中から選べばよいですが、フォームだけのためにWPを入れるのはどうかな、、、ということがあるので弊社で使用しているメールフォームを紹介します

PHPメールフォームで検索した際に上位表示されているPHP工房さんのメールフォームについては脆弱性の問題はなさそうですがかなり古い記述もあるので現代で使うのであればあまりオススメはしません。

ブログ一覧へ