0%

Programmingプログラミングナレッジ

Posted:2016.06.20

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

前回、前々回と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のコンタクトフォームについてまとめてきました。一見すると複雑ですが、一つひとつの画面の役割と流れ、そして処理を理解すればイメージしやすいと思います。

 

author
この記事を書いた人オガワ シンヤ
FacebookTwitter

DesignSupply.代表 / ディレクター・ウェブデザイナー・フロントエンドエンジニアをやっています。「ウェブとデザインでヒト・モノ・サービスを繋げ新しい価値を生み出す」をコンセプトに日々奮闘中!制作中はチョコレートが欠かせない三十路Webクリエイター。

制作のご依頼やお問い合わせ・パートナー業務提携のご相談はこちら

デザインやウェブ制作についてのご依頼やご相談、その他お問い合わせなどもお気軽にご連絡ください。フットワークの軽さやレスポンスの早さ、また豊富な経験や知識、技術を活かした対応力といったフリーランスクリエイターの強みでクライアント様、パートナー企業様のお力になります。デザインからコーディングやWordPress実装といったウェブサイト構築はもちろん、写真撮影や動画編集、コンテンツ制作からサイト運用サポートまで一括してお任せください。

ホームページ制作のご検討やウェブ運用でお悩みの経営者様や企業のウェブ担当者様をはじめ、個人で店舗を営んでいらっしゃるオーナー様、フリーで活動されているビジネスオーナー様はもちろんのこと、リソース不足でお困りの制作会社様、またクリエイターをお探しの代理店様も大歓迎です。

コンタクトをご希望の方はお手数ですが、下記よりお問い合わせフォームのページへアクセスしていただき、必要事項を入力の上メッセージを送信してください。確認でき次第すぐに折り返しご連絡致します。

こんな記事も読まれています

コメントもお気軽にどうぞ

記事に関するご質問やご意見などありましたら下記のコメントフォームよりお気軽に投稿ください。なおメールアドレスは公開されませんのでご安心ください。また、* が付いている欄は必須項目となります。

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。

CAPTCHA


ページトップへ
大阪市天王寺区のホームページ制作デザイン事務所(SOHO)DesignSupply.【デザインサプライ】