【第3回】PHPでお問い合わせフォームを作ろう!メールの本文の作成方法と送信の仕方

この記事からわかること
- 第2回の記事の続き
- メール本文の構築方法
- 実際にメールを送信する
- メールを送信する際の注意点
index
[open]
\ アプリをリリースしました /
第1回:【自作】PHPでお問い合わせフォームを作ろう!コードと仕組みを徹底解説!
第2回:【第2回】PHPでお問い合わせフォームを作ろう!入力値の確認と値の保持の仕方
- ✔️ 入力フォームの作成(HTML)
- ✔️ 入力値のエスケープ処理と入力チェック(HTML+php)
- ✔️ 入力値の確認
- メール本文(相手に自動送信用)を作成(php)
- メール本文(自分にお問い合わせ内容送信用)を作成(php)
- 実際にメールを送信する(php)
前回の記事でここまで終了しました。今回はメールの本文作りと実際に送信するまでを作っていきたいと思います。
最初に実装すべきことを整理する
「メールの本文の作成方法と送信の仕方」でやらなければいけないことは以下の通りです。
- confirm.phpから画面(send.phpへ)を遷移させる
- 入力値を元にメールの本文を構築する
- phpでメールを送信する際のセキュリティ対策
第2回で上記のコード部分で設置した送信ボタンとtokenをまずは有効にしていきましょう!
メール送信ファイルへの画面の遷移
実はメール送信ファイル(send.php)への画面遷移のコードはもう記述しています。
上記9行目:<form method="post" action="send.php">
action
でPOSTの送信先を指定するとそのファイルへリダイレクトするようになっています。action
の送信先を自分のファイルにする時も新しくその画面をリロードしているのですね!
なので送信ボタンを押せば「send.php」へ切り替わるのであとは「send.php」でメール送信のコードを記述すればOKです。
画面遷移時はセキュリティ対策を
ここで前回から登場していたtoken
について解説していきます。このtokenを設置する意味は正しい順序でメール送信ファイルへ遷移したかを検証するためです。
仕組みとしては変数$token
に格納された値をPOSTとSESSIONで渡し「send.php」で差異がないかをチェックします。差異があれば強制的に最初の画面にリダイレクトさせ、差異がなければメールを送信するといった流れです。
これでURLにsend.phpのアドレスを決め打ちで入力して不正アクセスしてくるのを防ぐことができます。
では実際にどのようにトークンを作っていくのかみていきましょう。
一意なトークンの作り方
まずは以下の関数を使用してトークンを準備します。
- mt_rand関数:ランダムな数値を自動生成(乱数)
- uniqid関数 :13文字のランダムな文字列を自動生成※
- sha1関数 :データをハッシュ化(暗号化)
※:uniqid(プレフィックス(接頭辞),true/false)
→”接頭辞+生成した文字列”の値を生成true
で”接頭辞+生成した文字列”が13文字以上を許可false
で”接頭辞+生成した文字列”で13文字にする
これらの関数を組み合わせてオリジナルのトークンを作成し、そのトークンを変数$token
と$SESSION['token']
に格納しておきます。
これで第2回で記述していたコードの以下の部分が有効になります。
最初のコード10行目:<input type="hidden" name="token" value="<?php echo $token ?>">
その後に$token
に格納されたトークンの値を<?php echo $token ?>
で表示させtype="hidden"
で画面上に表示されないようにしておきます。ここはすでに記述ずみなので流れだけ理解しておきましょう!
これでSESSIONによる$token
とPOSTによる$token
が「send.php」から取得することができるようになりました。では「send.php」側での処理を見ていきましょう。
トークンに差異がないかチェック
ここからは「send.php」に記述していきます。この時点ではまだ空なのでいつものhtml:5
で記述します。その上部にphpを記述します。
SESSIONで渡されたtokenとPOSTで渡されたtokenを比較し正しければメール送信処理へ、間違っていれば強制的に「form.php」へリダイレクトさせます。
これで正常な画面遷移と不正なアクセスを予防することができます。それでは次に実際にメールを作成し送信する処理を解説していきます。
メールの本文を作成
メールの本文の作成方法の流れは以下の通りです。
- SESSIONで受け取った入力値を変数に格納
- メールアドレスに対してのセキュリティ対策
- メールの本文の作成1「自分に受付内容送信用」
- メールの本文の作成2「相手に受付完了送信用」
- メールをそれぞれ送信
- 送れなかった場合の処理
入力値をセキュリティ対策を施して適切に変数に格納する
最初にSESSIONで渡された入力値を変数に格納します。その際にメールアドレスだけは注意が必要です。
この後に入力されたメールアドレスにお問い合わせ受付完了メールを送ることになります。その際にメールを送信する関数のパラメータ(引数)として入力値をそのまま使うことになるので適切なセキュリティ対策を施さないといけません。
それ以外の入力値はメール送信の関数のパラメータ(引数)として使わないのでここでの処理は省いても問題ありません。
その処理がstr_replace(array("\r","\n"),'',$_SESSION['email'])
の部分です。詳しくは⇩こちらをご覧ください。
関連記事:【絶対必須】phpのセキュリティ対策!XSSとメールヘッダーインジェクションを防ごう
メールの本文の作成
メールの本文は自分の自由に作ればOKです!見やすくわかりやすい本文を作成しましょう。後から各変数をパラメータ(引数)としてメール送信関数を実行します。
以下の変数にはそれぞれ適切なものを入れておいてください。($変数2も同様です)
- $to:メールの送信先
- $mailtitle:メールの件名
- $contents:メールの内容
- $from:メールの送信元
メールを送信する関数
実際にメールを送信するのはmb_send_mail
関数の役割です。
適切な引数を指定することで本当にメールを送ることができます。すごいですよね!笑
mb_send_mail
関数は何らかの不具合で送信に失敗するとfalse
を返します。なのでif(mb_send_mail
関数)として送信失敗時の処理も記載していきます。
メール送信処理をif文で囲み失敗(false)なら変数$messageにエラーメッセージを、2つとも成功なら変数$$messageに完了メッセージを格納しています。またSESSIONは利用が終了した時点で破棄しておきましょう。
最後にbody要素の中にメッセージを表示する場所を作って完成です。
今回のまとめ
記述したファイル
- confirm.php
- send.php
記述した内容
- confirm.phpからsend.phpへのリダイレクト(confirm.php)
- トークンの生成とSESSIONとPOSTでのトークン渡し(confirm.php)
- トークンの検証(send.php)
- 入力値のセキュリティ対策と格納(send.php)
- メール本文の作成(send.php)
- メールの送信(send.php)
これで実際に使用できる「お問い合わせフォーム」が完成しました!!
自分のサーバーなどにアップして動かしてみてください。ちゃんと機能するはずです。ローカル環境で実行する場合は以下記事を参考にしてください。
【最新版】MAMPのインストール方法!Macでローカル環境を構築しよう!
うまくいかない部分があったり記載漏れがあったらコメントやお問い合わせいただけると助かります。
ここからお問い合わせお願いしますご覧いただきありがとうございました!
第1回:【自作】PHPでお問い合わせフォームを作ろう!コードと仕組みを徹底解説!
第2回:【第2回】PHPでお問い合わせフォームを作ろう!入力値の確認と値の保持の仕方
第3回:【第3回】PHPでお問い合わせフォームを作ろう!メールの本文の作成方法と送信の仕方
お問い合わせフォームの完成コード
form.php
confirm.php
send.php