PHP でメールを送るには、mail 関数とか、mb_send_mail 関数とかありますが、これで送信すると、スパム扱いされることもあるし、付加機能を付けるのも大変なんですよね。
メール送信用のPHP ライブラリ、「PHP Mailer」は、外部の SMTP サーバーを利用(経由)してメールを送信できるので、このような問題が解決でき、設定も簡単です!
公式ページ → https://github.com/PHPMailer/PHPMailer
PHP Mailer のインストールには、Composer の利用が推奨されています。
PHP のインストールから、Composer の利用の仕方まで、前回まとめました。
→ PHP 開発ローカル環境構築
Composer を利用、SMTP サーバーは Gmail を利用する仮定でまとめます。
目次
・ Composer で PHP Mailer をインストール
・ 送信フォーム作成
・ Gmail の2段階承認利用時のパスワード
Composer で PHP Mailer をインストール
任意のディレクトリ(どこでも大丈夫です。名前もなんでも)に、「composer.json」という名前のファイルをテキストエディターで作ります。composer.json には、以下のコードを書き込みます。(PHP Mailer の公式マニュアル通りです。)
{
"require": {
"phpmailer/phpmailer": "~6.1"
}
}
コマンドプロンプトを立ち上げ(ここでは、どこに Comproser を置いたかにもよりますが、コマンドプロンプトに「管理者」で入らないと、権限エラーになることもあります。)、Composer のインストールされているディレクトリ(PHP のインストールされているディレクトリ)で、「composer require phpmailer/phpmailer」とコマンドを入力し、実行します。このように表示されます。(ファイルがインストールされるまで、少し時間がかかるかもしれません。)
PHP (XAMPP) のあるディレクトリの中に、「vendor」、「composer.json」、「composer.lock」があるのを確認。
「vendor」をディレクトリごと、PHP Mailer を利用したい PHP ファイルのあるディレクトリの中に移動させます。
送信フォーム作成
まず、簡単なメールフォームを作ってみます。
<mail.html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>メール送信フォーム</title>
</head>
<body>
<h1>メール送信フォーム</h1>
<form action="submit.php" method="post">
<div>氏名: <input type="text" name="name" id="name"></div>
<div>メールアドレス: <input type="text" name="to" id="to"></div>
<div>件名: <input type="text" name="subject" id="subject"></div>
<div>本文: <br />
<textarea name="message" id="message" cols="50" rows="10"></textarea>
</div>
<div><input type="submit" value="送信" /></div>
</form>
</body>
</html>
ページ例 → https://exp.hazu.jp/mail-form/mail.html
(submit.php がないので、「送信」をクリックしてもメールは送れませんが)
次に、PHP Mailer を利用した SMTP 送信の PHP ファイルを作ります。
<submit.php>
<?php
// 入力内容の取得・変数に格納
$name = $_POST['name']; // 氏名
$to = $_POST['to']; // メールアドレス
$subject = $_POST['subject']; // 件名
$message = $_POST['message']; // 本文
// メール日本語対応
mb_language("japanese");
mb_internal_encoding("UTF-8");
// PHPMailer クラスをネーム空間にインポート
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
// Composer の autoloader をロード
require 'vendor/autoload.php';
// インスタンス生成
$mail = new PHPMailer(true);
try {
// SMTPの設定
$mail->isSMTP(); // SMTP 利用
$mail->Host = 'smtp.gmail.com'; // SMTP サーバー(Gmail の場合これ)
$mail->SMTPAuth = true; // SMTP認証を有効にする
$mail->Username = 'XXXXX@gmail.com'; // ユーザ名 (Gmail ならメールアドレス)
$mail->Password = 'xxxxxxxxxx'; // パスワード
$mail->SMTPSecure = 'tls'; // 暗号化通信 (Gmail では使えます)
$mail->Port = 587; // TCP ポート (TLS の場合 587)
// メール本体
$mail->setFrom('XXXXX@gmail.com', 'hazuki'); // 送信元メールアドレスと名前
$mail->addAddress($to, mb_encode_mimeheader($name, 'ISO-2022-JP')); // 送信先メールアドレスと名前
$mail->Subject = mb_encode_mimeheader($subject, 'ISO-2022-JP'); // 件名
$mail->Body = mb_convert_encoding($message, "JIS","UTF-8"); // 本文
// 送信
$mail->send();
echo '送信済み';
} catch (Exception $e) {
echo "送信失敗: {$mail->ErrorInfo}";
}
?>
これでいいんですが、ちょっと説明付け足します。
29行目: パスワードは、ここでは、Gmail(Google)の普通のログインパスワードになるんですが、もし2段階認証を利用している場合、PHP Mailer では、普通のパスワードでログインできません。これについて、詳しく後述します。
35、36行目: ヘッダー情報にそのまま日本語を書き込むと文字化けしてしまうことがあります。mb_encode_mimeheader 関数を使って、ヘッダーに使われる「ISO-2022-JP」にエンコーディングします。
37行目: 本文も同じく、文字化けに備えて、mb_convert_encoding 関数を使って、一応 JIS にエンコーディングします。
上手くいかない場合は、SMTP の設定あたりに、「$mailer->SMTPDebug = 2;」(詳細デバッグ)を加えて、デバックを取ってみてください。詳細がコメントアウトされるので、おかしなところが分かるかもしれません。
その他、Cc や Bcc、返信用アドレス、添付ファイル、HTML メールとテキストメールの切り替え等も含めることができますが、公式ページ(https://github.com/PHPMailer/PHPMailer)をご覧ください。
Gmail(Google)の2段階認証利用時のパスワード
Gmail(Google)で2段階認証を利用している場合、PHP Mailer の SMTP 設定では普通のログインパスワードだとログインエラーになります。それ専用のパスワードを生成する必要があります。手順は以下の通りです。
ブラウザで Gmail(Google)を開き、ログインした状態で、右上の自分のサムネイルをクリック。
ドロップダウンメニューの中の「アカウント」をクリック。
左のメニュー項目の「セキュリティ」をクリック。
「Google へのログイン」で、「2段階認証プロセス」が「オン」になっていることを確認の上、「アプリ パスワード」をクリック。
「アプリを選択」をクリック。
「その他(名前を入力)」の欄に、「PHP Mailer」など分かりやすい名前を付ける。
「生成」をクリック。
16桁のパスワードが生成されます。これを PHP Mailer を利用した PHP ファイルの SMTP の設定において利用します。