PHPMailerを使ってメールフォームを作成する
自サイト(takujiozaki.com)をシングルページで作り直した。
これまでがWordPressサイトだったのでお問い合わせはContactForm7を使っていましたが、静的ページにしたため、メールフォームを一から作成することにしました。
事前に調べているとPHPMailerがComposer無しでも使えることがわかり、さくらのレンタルサーバーでも使えるか試してみました。
単にメールを送信するならmail関数を使う手もありますが、PHPMailerならSMTPに対して認証を通してメールを送信することが出来ます。また添付ファイル付メールやCC、BCC対応など幅広く利用できるのでマスターしておいて損は無いでしょう。
今回、実装した環境
レンタルサーバー | さくらインターネット |
---|---|
プラン | スタンダード |
PHP | 7.3.12 |
Apache | 2.4.41 |
sendmail | 8.15.2 |
*コントロールパネルの仕様上はApacheなのだがエラー画面はnginxだったりする。
PHPMailerをダウンロード
PHPMailerをダウンロード、解凍しディレクトリごとドキュメントルートに配置。
ディレクトリの構造は下記の通り。
www |-PHPMailer/ |-get_oauth_token.php |-composer.json |-language/ |-src/ |-form.html //送信フォーム |-config.php //設定ファイル |-sending.php //送信プログラム |-success.html //送信成功
HTMLフォーム
基本的な内容ですので詳細は割愛しますが、form.htmlからはPOST送信でsending.phpへデータを渡します。項目は下記の通り。
項目(必須設定) | 型(input type) | name属性 |
---|---|---|
氏名(必須項目) | 一行文字列(text) | name |
メールアドレス(必須項目) | メール(email) | |
タイトル(必須項目) | 一行文字列文字列(text) | subject |
内容(必須項目) | 複数行文字列(textarea) | message |
設定ファイル
メールを送信するための設定をまとめます。
送信用プログラム内に書いてもいいのですが、別ファイルにしておくことで各プログラムの見通しが良くなるし、Githubなどに公開する場合も設定ファイルのみを追跡除外すればいいので使い回しが容易になります。
<?php //定数宣言 define('SMTP_HOST', 'SMTPサーバー名'); define('SMTP_USERNAME', 'ユーザー名'); define('SMTP_PASSWORD', 'パスワード'); define('SMTP_AUTH', TRUE);//認証する define('SMTP_SECURE', 'tls');//さくらレンタルサーバーの場合は'tls' define('SMTP_PORT', SMTPのポート番号);//さくらインターネットの場合 587 define('SMTP_CHARSET','utf-8');//メールの文字コードをutf-8で指定 define('SEND_TO, '送信先メールアドレス');
名称をconfig.phpとしたが任意の名称でOK。
送信用PHPファイル
<?php mb_language("japanese"); mb_internal_encoding("UTF-8"); //設定ファイルの読み込み require_once('./config.php'); //PHPMailerの各ファイルを読み込み require 'PHPMailer/src/PHPMailer.php'; require 'PHPMailer/src/SMTP.php'; require 'PHPMailer/src/POP3.php'; require 'PHPMailer/src/Exception.php'; require 'PHPMailer/src/OAuth.php'; require 'PHPMailer/language/phpmailer.lang-ja.php'; //名前空間を定義 use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; //POST送信されたら if($_SERVER['REQUEST_METHOD']==="POST"){ $sendmode = TRUE; //Requestパラメーター受け取り $name = htmlspecialchars($_POST['name']); $email = htmlspecialchars($_POST['email']); $subject = htmlspecialchars($_POST['subject']); $message = htmlspecialchars($_POST['message']); //HTML側でチェックしていますが、サーバー側でもブランクかどうか、有効なメールアドレスかどうかを確認しています。 if($name == ""){ $sendmode = FALSE; } if($email == ""){ $sendmode = FALSE; } if(!filter_var( $email, FILTER_VALIDATE_EMAIL )){ $sendmode = FALSE; } if($subject == ""){ $sendmode = FALSE; } if($email == ""){ $message = FALSE; } //エラーがなければ if($sendmode){ //PHPMailerをインスタンス化 $mailer = new PHPMailer(); //必要なプロパティを上書き $mailer->IsSMTP(); $mailer->Host = SMTP_HOST; $mailer->Username = SMTP_USERNAME; $mailer->Password = SMTP_PASSWORD; $mailer->SMTPAuth = SMTP_AUTH; $mailer->SMTPSecure = SMTP_SECURE; $mailer->Port = SMTP_PORT; $mailer->Charset = SMTP_CHARSET; //件名を調整 $subject = "Webサイトからのメール:".$subject; //本文を調整 $message = $name.":".$email."\n".$message; $mailer->From = $email;//送信元 $mailer->FromName = mb_encode_mimeheader($name,'ISO-2022-JP');//送信先名称 $mailer->Subject = mb_encode_mimeheader($subject,'ISO-2022-JP');//件名 $mailer->Body = mb_convert_encoding($message, "UTF-8", "AUTO");//本文 $mailer->AddAddress(SEND_TO);//送信先 if($mailer->Send()){ header('Location: ./success.html'); }else{ die(送信に失敗しました); //echo $mailer->ErrorInfo; } }else{ //sendmodeがFalseの時 } //GETでアクセスされたらindex.htmlにリダイレクト }else{ header('Location: ./'); exit; }
注意点ですが送信元の名称、件名はmb_encode_mimeheader関数を使用します。
mb_convert_encoding関数を使うと文字化けを起こすので注意。
まとめ
PHPMailerは設定項目は多いため最初は敷居が高いかもしれませんが、理解出来てしまうととても使いやすいライブラリです。
色々と応用的に使えるのでぜひマスターしておいてください。
オブジェクト指向プログラミングの練習としてもちょうどいいでしょう。