【PHP】PHPMailerでお問い合わせフォームのメール送信を実装する方法
この記事では、PHPのメール送信ライブラリ「PHPMailer」を使って、お問い合わせフォームからのメール送信機能を実装する方法を解説します。GmailのSMTPサーバーとアプリパスワードを利用し、ユーザーへのお礼メールと管理者への通知メールを安全に送信する手順を初心者向けに丁寧に説明しています。Webアプリケーション開発で必須のメール機能の作り方がわかります。
開発環境
- Visual Studio Code:version 1.73.0
- OS:Windows10
- phpmailer/phpmailer:6.9.1
PHPのPHPMailerとは
PHPMailer(ピーエイチピーメイラー)とは、PHPからメールを送信するためのライブラリです。
PHPというプログラミング言語を使ってウェブアプリケーションを開発する際、メールを送信する機能が必要になることがよくあります。例えば、お問い合わせフォームからの連絡、会員登録時の確認メール、パスワード再設定の通知などです。PHPMailerは、PHPの標準機能だけでは複雑になりがちなメール送信処理を、簡単かつ安全に実装するための便利な部品集(ライブラリ)として提供されています。
PHPMailerは、SMTPサーバーを指定して認証付きでメールを送信できます。SMTP(Simple Mail Transfer Protocol)サーバーとは、インターネット上でメールを送信するために使用される専用のコンピューター(サーバー)のことです。メールを送る際は、通常このSMTPサーバーを経由して相手に届けられます。
「認証付き」というのは、メールを送信する際に、送信元が正規のユーザーであることを確認する仕組みのことです。例えば、ユーザー名とパスワードを入力してログインするような形で、正しく認証されたユーザーだけがメールを送信できるようになります。これにより、悪意のある第三者による不正なメール送信(スパムなど)を防ぎ、セキュリティを強化しながら安全にメールをやり取りすることが可能になります。
今回は、GmailのSMTPサーバーを使ってお問い合わせフォームのメール送信を実装します。PHPMailerは、このように細かくSMTPサーバーの設定ができるため、広く利用されているGmailなどのメールサービスのSMTPサーバーを利用してメールを送信することができます。お問い合わせフォームのメール送信は、ウェブサイトで非常によく使われる機能の一つであり、ユーザーからの問い合わせ内容を開発者や担当者にメールで通知する際にPHPMailerが役立ちます。
公式リポジトリ:https://github.com/PHPMailer/PHPMailer
PHPMailerの使い方
PHPMailerは、PHPというプログラミング言語を使ってメールを送信するための便利なライブラリです。PHPだけでメールを送信する機能を作ることもできますが、セキュリティや複雑な設定が必要になるため手間がかかります。PHPMailerを使うと、これらの手間を省き、安全かつ簡単にメール送信機能を実装できます。システムからユーザーへのお知らせメールや、問い合わせフォームのメール送信機能など、Webアプリケーションでメール機能が必要な場合に広く利用されています。
ライブラリをインストール
まず、PHPMailerを使うための準備として、パソコンの中にPHPMailerのプログラムを導入(インストール)する必要があります。この作業を行うために、Composerというツールを使用します。Composerは、PHPのライブラリやフレームワークといった、他の人が作った便利なプログラムをプロジェクトに組み込む(依存関係を管理する)ためのツールです。
作業用のフォルダを新しく作成してください。このフォルダの中に、これから作るPHPMailerを使うプログラムや、PHPMailerのライブラリ本体が保存されます。
新しく作成した作業用のフォルダに移動し、そこで以下のコマンドを実行します。このコマンドを実行すると、Composerが自動的にPHPMailerのライブラリ本体をダウンロードし、作業フォルダ内に設置してくれます。
1composer require phpmailer/phpmailer
Gmailのアプリパスワードを用意する
PHPMailerを使ってGmailのメールサーバーを経由してメールを送信する場合、通常のGoogleアカウントのパスワードは使用できません。これは、セキュリティを強化するためです。代わりに「アプリパスワード」という、特定のアプリケーション(今回の場合はPHPMailerを使ったプログラム)からのアクセス専用のパスワードを用意する必要があります。
アプリパスワードを発行するためには、まずご自身のGoogleアカウントで「2段階認証」を有効にしている必要があります。2段階認証とは、パスワードだけでなく、スマートフォンに送られるコードなども使って本人確認を行う、より安全な認証方法です。
2段階認証を有効にした後、Googleアカウントの設定画面からアプリパスワードを発行できます。アプリパスワードは、Googleアカウントのパスワードとは異なる、16文字の特殊なパスワードです。このパスワードは、PHPMailerの設定でGmailのSMTP(メール送信プロトコル)を利用する際に必要になりますので、発行後、忘れないようにメモしておいてください。
ビルトインサーバーを起動
PHPで書かれたプログラムをWebブラウザで確認するためには、Webサーバーが必要です。ここでは、PHPに標準で備わっている「ビルトインサーバー」という簡易的なWebサーバーを起動します。これは開発時に手軽にプログラムの動作を確認するために利用されます。
先ほどPHPMailerをインストールした作業用のフォルダ内で、以下のコマンドを実行してください。
このコマンドを実行すると、ご自身のパソコン上でWebサーバーが起動します。「localhost」は自分のパソコンを指し、「8000」はそのサーバーが利用するポート番号を示しています。
サーバーが起動したら、Webブラウザ(ChromeやFirefoxなど)を開き、アドレスバーに「http://localhost:8000/index.php」と入力してアクセスしてください。このURLにアクセスすることで、作業用フォルダ内に「index.php」というファイルを作成した場合、そのPHPプログラムの実行結果をブラウザで確認できるようになります。PHPMailerを使ったメール送信プログラムを「index.php」として作成すると、このURLから動作確認を行うことができます。
1php -S localhost:8000
PHPMailerでお問い合わせフォームを実装する
PHPMailerというライブラリを使用して、お問い合わせフォームからメールを送信する機能の実装について解説します。 今回は、フォームに入力してくださったユーザーの方へのお礼メールと、運営側への通知メールの2通を送信するサンプルコードを見ていきます。
お問い合わせフォームのサンプルコード
下記は、お名前・メールアドレス・メッセージを入力して送信するフォーム(index.php)のコードです。
見た目は、BootstrapというCSSフレームワークを使って整えています。
このフォームのformタグにあるaction属性には、メール送信処理を行うsend_mail.phpというファイル名を指定しています。また、method属性はpostに設定しており、フォームから入力されたデータを安全にサーバーへ送信するために使われます。
各入力欄にはrequired属性が付けられており、これはユーザーがこの項目を空のまま送信できないようにする(必須入力にする)ためのものです。
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>お問い合わせフォーム</title> 7 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> 8</head> 9<body class="bg-light"> 10 <div class="container mt-5"> 11 <h1 class="text-center mb-4">お問い合わせフォーム</h1> 12 <form action="send_mail.php" method="post"> 13 <div class="mb-3"> 14 <label for="name" class="form-label">お名前:</label> 15 <input type="text" class="form-control" id="name" name="name" required> 16 </div> 17 <div class="mb-3"> 18 <label for="email" class="form-label">メールアドレス:</label> 19 <input type="email" class="form-control" id="email" name="email" required> 20 </div> 21 <div class="mb-3"> 22 <label for="message" class="form-label">メッセージ:</label> 23 <textarea class="form-control" id="message" name="message" rows="4" required></textarea> 24 </div> 25 <button type="submit" class="btn btn-primary w-100">送信</button> 26 </form> 27 </div> 28 <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> 29</body> 30</html>
メール送信のサンプルコード
下記は、フォームから送信された内容を受け取り、それをもとにお礼メールと運営側への通知メールの2通を送信するsend_mail.phpのコードです。
1<?php 2require 'vendor/autoload.php'; // Composerのオートローダーを読み込む 3 4use PHPMailer\PHPMailer\PHPMailer; 5use PHPMailer\PHPMailer\Exception; 6 7$secretEmail = 'your-address@gmail.com'; // 送信に使用するGmailアドレス 8$secretPass = 'xxxxxxxxxxxxxxxx'; // 2段階認証を行って発行したアプリパスワード 9 10if ($_SERVER["REQUEST_METHOD"] == "POST") { 11 $name = htmlspecialchars($_POST['name']); 12 $email = htmlspecialchars($_POST['email']); 13 $message = htmlspecialchars($_POST['message']); 14 15 // メール設定 16 $adminEmail = $secretEmail; 17 $thankYouSubject = "お問い合わせありがとうございます"; 18 $adminSubject = "新しいお問い合わせ"; 19 20 $thankYouBody = "お名前: $name\nメール: $email\nメッセージ:\n$message\n\nご連絡ありがとうございます。"; 21 $adminBody = "お名前: $name\nメール: $email\nメッセージ:\n$message"; 22 23 // PHPMailerのインスタンスを作成 24 // 引数を true にすると、エラー時に例外を投げるようになります 25 $mail = new PHPMailer(true); 26 27 try { 28 // SMTPの設定 29 $mail->isSMTP(); 30 $mail->Host = 'smtp.gmail.com'; 31 $mail->SMTPAuth = true; 32 $mail->Username = $secretEmail; // Gmailアドレス 33 $mail->Password = $secretPass; // アプリパスワード 34 $mail->SMTPSecure = 'tls'; 35 $mail->Port = 587; 36 37 // 文字エンコーディングを設定 38 $mail->CharSet = 'UTF-8'; 39 $mail->setLanguage('ja'); 40 41 // 送信元 42 $mail->setFrom($adminEmail, '運営者名'); 43 $mail->addReplyTo($adminEmail, '運営者名'); 44 45 // お礼メールを送信 46 $mail->addAddress($email); // 入力されたメールアドレス 47 $mail->Subject = $thankYouSubject; 48 $mail->Body = $thankYouBody; 49 $mail->send(); 50 51 // 運営側にもメールを送信 52 $mail->clearAddresses(); // 受信者をクリア 53 $mail->addAddress($adminEmail); // 運営側のメールアドレス 54 $mail->Subject = $adminSubject; 55 $mail->Body = $adminBody; 56 $mail->send(); 57 58 echo "メールが送信されました。"; 59 } catch (Exception $e) { 60 echo "メールの送信に失敗しました: {$mail->ErrorInfo}"; 61 } 62} else { 63 echo "不正なアクセスです。"; 64}
ライブラリを読み込む
まず、ComposerというPHPのパッケージ管理ツールでインストールしたPHPMailerライブラリをPHPスクリプト内で使えるように読み込み、使用するクラスを指定します。
require 'vendor/autoload.php';は、Composerが管理する全てのライブラリを自動的に読み込むための記述です。
useキーワードは、長い名前空間(クラスの所在を示す情報)を持つクラスを、短い名前で使えるようにするためのものです。
PHPMailerクラスは、メールの送信設定を行い、実際にメールを送信するための主要なクラスです。Exceptionクラスは、メール送信中に何らかの問題が発生した場合に、そのエラー情報を取得するために使用します。
1require 'vendor/autoload.php'; 2 3use PHPMailer\PHPMailer\PHPMailer; 4use PHPMailer\PHPMailer\Exception;
送信内容を受け取る
次に、お問い合わせフォームからPOSTメソッドで送信されてきた内容を受け取ります。
$_SERVER["REQUEST_METHOD"] == "POST"という条件分岐を使って、このスクリプトがフォームからのPOST送信によって実行されたのかどうかを判定しています。これにより、ユーザーがURLを直接入力してアクセスするなどの「不正なアクセス」の場合と、フォーム経由のアクセスとで処理を分けることができます。
入力された値(お名前、メールアドレス、メッセージ)は、$_POSTというスーパーグローバル変数を通じて取得されます。これらの値は、セキュリティ上の理由からhtmlspecialcharsという関数を使ってエスケープ処理をしてから使用しています。エスケープ処理とは、入力された特殊な文字を無害な形に変換することで、悪意のあるスクリプトの実行(XSS攻撃など)を防ぐための対策です。
1if ($_SERVER["REQUEST_METHOD"] == "POST") { 2 $name = htmlspecialchars($_POST['name']); 3 $email = htmlspecialchars($_POST['email']); 4 $message = htmlspecialchars($_POST['message']);
SMTPの設定をする
メールを送信するために、GmailのSMTPサーバー(メール送信サーバー)を使うための設定を行います。
$mail = new PHPMailer(true);でPHPMailerのインスタンスを作成しています。このとき引数にtrueを指定すると、メール送信中にエラーが発生した場合に、そのエラーを例外(Exception)として報告してくれるようになります。これにより、エラー発生時の原因特定がしやすくなります。
$mail->isSMTP();は、メールの送信にSMTPプロトコル(メールを送信するための標準的な通信規約)を使用することを指定しています。
$mail->Host = 'smtp.gmail.com';では、メールを送信するサーバーとしてGmailのSMTPサーバーのアドレスを指定しています。
$mail->SMTPAuth = true;は、SMTPサーバーへの認証(ログイン)を有効にすることを示します。
$mail->Username = $secretEmail;には、Gmailのメールアドレス(送信元となるアドレス)を設定します。
$mail->Password = $secretPass;には、Gmailの「アプリパスワード」を設定します。通常のGmailパスワードとは異なり、2段階認証を設定している場合に、特定のアプリケーションからGmailにアクセスするために発行する特別なパスワードのことです。
$mail->SMTPSecure = 'tls';は、メール送信の際にtlsという暗号化方式を使って通信を保護することを指定しています。
$mail->Port = 587;は、TLS暗号化方式でメールを送信する場合に一般的に使用されるポート番号を指定しています。
1$mail = new PHPMailer(true); 2 3$mail->isSMTP(); 4$mail->Host = 'smtp.gmail.com'; 5$mail->SMTPAuth = true; 6$mail->Username = $secretEmail; // Gmailアドレス 7$mail->Password = $secretPass; // アプリパスワード 8$mail->SMTPSecure = 'tls'; 9$mail->Port = 587;
文字エンコーディングと送信元を設定する
次に、送信するメールの文字エンコーディングや送信元情報を設定します。
$mail->CharSet = 'UTF-8';を設定しないと、日本語の文字が正しく表示されず、文字化けしてしまう原因になることがあります。そのため、必ずUTF-8を指定します。
$mail->setLanguage('ja');は、PHPMailerがメール送信中に何かメッセージを出す場合、そのメッセージを日本語で表示するように設定するものです。
$mail->setFrom($adminEmail, '運営者名');は、送信元となるメールアドレスと、メールソフトで表示される送信者名を設定しています。
$mail->addReplyTo($adminEmail, '運営者名');は、受信者がメールに返信した際に、その返信が届くメールアドレスと表示される返信者名を設定しています。
1$mail->CharSet = 'UTF-8'; 2$mail->setLanguage('ja'); 3 4$mail->setFrom($adminEmail, '運営者名'); 5$mail->addReplyTo($adminEmail, '運営者名');
お礼メールと通知メールを送信する
最後に、フォームに入力したユーザーへのお礼メールと、運営側への通知メールの2通を実際に送信します。
まず、お礼メールの送信です。$mail->addAddress($email);で、お問い合わせフォームに入力されたユーザーのメールアドレスを宛先として設定します。$mail->Subjectでメールの件名を、$mail->Bodyでメールの本文を設定します。そして、$mail->send();を実行することで、設定したメールが送信されます。
次に、運営側への通知メールを送信します。1通目のお礼メールを送信した後、PHPMailerのインスタンスにはユーザーのメールアドレスが宛先として残ったままになっています。このまま2通目を送信すると、運営側への通知メールもユーザーに送られてしまうため、$mail->clearAddresses();を使って、一度宛先を全てクリアします。
その後、$mail->addAddress($adminEmail);で運営側のメールアドレスを新たな宛先として設定し、同様に件名と本文を設定してから$mail->send();でメールを送信します。
もしメール送信処理中に何らかのエラーが発生した場合は、try...catchブロックのcatch部分が実行されます。echo "メールの送信に失敗しました: {$mail->ErrorInfo}";と記述することで、$mail->ErrorInfoに格納されているエラーメッセージが出力され、失敗の原因を確認することができます。
これらのコードが正しく実行されると、お問い合わせフォームに入力されたメールアドレスにお礼メールが届き、同時に設定した運営側のメールアドレスにはお問い合わせ内容が記載された通知メールが届きます。
1// お礼メールを送信 2$mail->addAddress($email); 3$mail->Subject = $thankYouSubject; 4$mail->Body = $thankYouBody; 5$mail->send(); 6 7// 運営側にもメールを送信 8$mail->clearAddresses(); 9$mail->addAddress($adminEmail); 10$mail->Subject = $adminSubject; 11$mail->Body = $adminBody; 12$mail->send();
おわりに
この記事では、PHPのPHPMailerライブラリを利用し、お問い合わせフォームからメールを送信する実装方法を解説しました。Composerでのライブラリインストールから、GmailのSMTPサーバーと2段階認証で発行するアプリパスワードを用いた安全なメール設定まで、順を追って理解を深めていただけたかと思います。フォームから入力されたデータをhtmlspecialcharsで適切に処理し、ユーザーへのお礼メールと管理者への通知メールの2通を送り分ける具体的な手順も習得しました。Webアプリケーション開発において必須のメール送信機能を、安全かつ効率的に実装する基礎を身につけることができたでしょう。