ソースコードで学ぶWebプログラミング

[PHP]お問い合わせフォームの作り方

お問い合わせフォームとは、サイト訪問者がサイト運営者と連絡を取るための窓口となるものです。フォーム画面は、HTMLのフォームタグで構成され、送信されたデータを受け取るWebプログラムが必要となります。今回は、そのデータを受け取るフォーム用プログラムをPHP言語で作成します。

PHPでお問い合わせフォームを作る方法

お問い合わせフォームには、どのような機能が必要となるか洗い出してみます。まず連絡を取り合うために、フォームから送信者のメールアドレスを受け取れるようにします。また送信先は、プログラム内で設定できるようにします。

1.データ「件名、送信者名、送信者アドレス、本文」を受け取る ・POSTリクエストで受け取る 2.データ「件名、送信者名、送信者アドレス、本文」を送信データに変換する ・送信データは、文字コードISO-2022-JPで送信する ・件名には、日本語を含める ・送信者名には、日本語を含める ・宛先には、日本語を含める 3.送信データを出力する ・指定アドレスに送信する

要件毎に送信するメール文章をテンプレート化しておく方法もありますが、今回は問い合わせのみとして、プログラム内に直接設定する構成にします。

PHPで同サーバからメールを送信する方法

PHPでメールを送信する場合は、mb_send_mail()が利用できます。日本語の件名などで送る場合は、mb_language('ja');とmb_internal_encoding('utf-8');のエンコーディング指定が必要です。

また送信者名や受信者名に日本語を使う場合、mb_encode_mimeheader()でエンコードを行います。

<?php /* 管理者メールアドレス */ define('ADMIN_MAIL','***'); /* 日本語の設定 */ mb_language('ja'); mb_internal_encoding('utf-8'); /* メール送信 */ function sendMail($set){ $to = $set['to']; if (isset($set['to_name'])) { $to = mb_encode_mimeheader($set['to_name'],'ISO-2022-JP').' <'.$to.'>'; } $headers = 'From: '.$set['from']; if (isset($set['from_name'])) { $headers = 'From: '.mb_encode_mimeheader($set['from_name'],'ISO-2022-JP').' <'.$set['from'].'>'; } return mb_send_mail($to, $set['sub'], $set['body'], $headers); } /* 送信サンプル */ $set = array( 'to'=>ADMIN_MAIL, 'to_name'=>'管理者', 'from'=>'送信元アドレス', 'from_name'=>'送信者名', 'sub'=>'件名', 'body'=>'メール本文' ); sendMail($set);

動作チェック用のコードも載せておきます。入力エラーの時、エラー用のURLへ飛ばし、送信後は完了用のURLへ飛ばしています。

<?php /* POST送信を取得 */ function gPOST($key){ return isset($_POST[$key]) ? $_POST[$key]: ''; } /* GET送信を取得 */ function gGET($key){ return isset($_GET[$key]) ? $_GET[$key]: ''; } /* フォームから送信があった時 */ if ($_SERVER['REQUEST_METHOD']=='POST') { $from = gPOST('from'); $name = gPOST('name'); $sub = gPOST('sub'); $body = gPOST('body'); /* メールドメインの確認 */ $domain = false; if (preg_match('/@([^@]+)\z/',$from,$m)) { if (checkdnsrr($m[1],'MX') || checkdnsrr($m[1],'A') || checkdnsrr($m[1],'AAAA')) { $domain = true; } } /* お名前、メールアドレスが空欄、ドメインが存在しない場合エラー */ if ($name=='' || $from=='' || $domain==false) { header('Location: '.$_SERVER['SCRIPT_NAME'].'?result=error'); exit; } $body = 'お名前:'.$name.' メールアドレス:'.$from.' お問い合わせ内容: '.$body; /* 管理者へメール */ $body1 = '下記の問い合わせがありました。 '.$body; $set = array( 'to'=>ADMIN_MAIL, 'to_name'=>'管理者', 'from'=>$from, 'from_name'=>$name, 'sub'=>$sub, 'body'=>$body1 ); sendMail($set); /* 送信者へメール */ $body2 = '下記の送信を行いました。 '.$body; $set = array( 'to'=>$from, 'to_name'=>$name, 'from'=>ADMIN_MAIL, 'from_name'=>'自動返信', 'sub'=>'[送信控え]'.$sub, 'body'=>$body2 ); sendMail($set); header('Location: '.$_SERVER['SCRIPT_NAME'].'?result=success'); exit; }

PHPでは、HTMLをソースファイル内に直接埋め込むことが出来るため、下記はプログラムの最後に記述します。

?> <html> <head> <meta charset="utf-8"> <title>[PHP]お問い合わせフォーム</title> <style> table { margin: 50px auto; width: 500px; } td { padding: 5px 0; } input,select,textarea { padding: 5px; width: 100%; } textarea { height: 100px; } .required { color: red; } #caution { margin-top: 50px; text-align: center; color: #a00; } #complete { margin-top: 50px; text-align: center; color: #060; } </style> </head> <body> <?php if (gGET('result')=='success'): ?> <div id="complete">送信を実行しました。ご返信まで今しばらくお待ちください。</div> <?php exit; ?> <?php elseif (gGET('result')=='error'): ?> <div id="caution">必須事項をご入力ください</div> <?php endif; ?> <form method="post"> <table> <tr> <th>件名</th> <td> <select name="sub"> <option value="資料のご請求">資料のご請求</option> <option value="お申込み">お申込み</option> <option value="お問い合わせ">お問い合わせ</option> </select> </td> </tr> <tr> <th>お名前<span class="required">*</span></th> <td> <input type="text" name="name"> </td> </tr> <tr> <th>メールアドレス<span class="required">*</span></th> <td> <input type="text" name="from"> </td> </tr> <tr> <th>お問い合わせ内容</th> <td> <textarea name="body"></textarea> </td> </tr> <tr> <td colspan="2"><input type="submit" value="送信"></td> </tr> </form> </body> </html>

PHPで別サーバからメールを送信する方法

別サーバにあるメールサーバから送信したい場合、SMTPサーバに接続して送信する事になります。PHPでは、メール送信ライブラリとしてPHPMailerがよく利用されています。

Composerと呼ばれるパッケージ管理ツールでのインストールが推奨されていますが、composerを利用できない環境での利用方法を掲載します。

<?php /* Composerを使わない場合 */ require 'PHPMailer/src/PHPMailer.php'; require 'PHPMailer/src/Exception.php'; require 'PHPMailer/src/SMTP.php'; use PHPMailerPHPMailerPHPMailer; use PHPMailerPHPMailerException; /* 日本語の設定 */ mb_language('ja'); mb_internal_encoding('utf-8'); /* SMTPサーバ */ define('MAIL_HOST','***'); /* 接続ユーザ */ define('MAIL_USER','***'); /* パスワード */ define('MAIL_PASS','***'); /* ポート番号 */ define('MAIL_PORT',587); function mailerSend($set){ $mail = new PHPMailer(true); try { $mail->isSMTP(); $mail->Host = MAIL_HOST; $mail->Port = MAIL_PORT; $mail->SMTPAuth = true; $mail->Username = MAIL_USER; $mail->Password = MAIL_PASS; $mail->SMTPSecure = 'tls'; $mail->setFrom($set['from'], $set['from_name']); $mail->addAddress($set['to'], $set['to_name']); $mail->Subject = mb_encode_mimeheader($set['sub'],'ISO-2022-JP'); $mail->CharSet = 'utf-8'; $mail->Body = $set['body']; $mail->send(); } catch(Exception $e) { echo $mail->ErrorInfo; } } /* 送信サンプル */ $set = array( 'from'=>MAIL_USER, 'from_name'=>'送信者', 'to'=>MAIL_USER, 'to_name'=>'宛先', 'sub'=>'件名', 'body'=>'メール本文', ); mailerSend($set);