PHPMailer の使い方
PHPMailer は SMTP サーバを利用してメールを送信するための PHP のライブラリです。
PHPMailer を使えば MAMP などのローカル環境で外部の SMTP サーバを使ってメールを送信することができます。
また、mb_send_mail() はシンプルなメールを送る場合には問題ありませんが、HTML メールや添付ファイルを使ったメールを送る場合などは PHPMailer を利用すると簡単です。
但し、脆弱性の問題などのため、割と頻繁にライブラリを更新する必要があるなど実際に使用する場合は検討が必要です。
以下で使用している PHPMailer のバージョンは 6.5.1 です(6.4.1以下には脆弱性あり)。
5.2.x とはソースファイルの配置場所や名前空間の宣言などで異なっています(Upgrading from 5.2)。
※[脆弱性の問題]5.2.22 (2017/1/9 リリース) より前のバージョンにはセキュリティ上のリスクが存在するので注意が必要です(PHPMailer Security)。
※【脆弱性の問題】追記 2021/11/04
PHPMailerにおける脆弱性の問題:深刻度は緊急(Critical)および重要(High)
バージョン 6.5.1 で修正されているようなので、それ未満のバージョンは更新が必要です。以下は Security notices relating to PHPMailer からの抜粋です。
PHPMailer 6.4.1 以前(PHPMailer 6.4.1 and earlier)には信頼できないコードが呼び出される可能性のある脆弱性が含まれています・・・中略・・・
PHPMailerバージョン6.4.1以前には、setLanguage() メソッドの $lang_path パラメーターを介したリモートコード実行の脆弱性が含まれている可能性があります。$lang_path パラメータがユーザー入力からフィルタリングされずに渡された場合、それを UNC パスに設定できます。また、攻撃者がサーバーにその UNC パスからファイルをロードするようにできる場合、その制御下にあるスクリプトファイルが実行される可能性があります・・・以下省略・・・
更新日:2022年03月11日
作成日:2020年3月13日
関連ページ:コンタクトフォーム(お問い合わせページ)の作り方
PHPMailer のセットアップ
PHPMailer のインストールは Composer を使う方法が推奨されていますが、パッケージをダウンロードして使うこともできます。
- PHPMailer 公式サイト:https://github.com/PHPMailer/PHPMailer
Composer を使ってインストール
Composer の基本的な使い方は「Composer のインストールと使い方」を参照ください。
Composer の composer require コマンドを使うと簡単にインストールすることができます。以下は Mac のターミナルを使ってインストールする例です。(関連ページ:Mac ターミナルの基本的な使い方)
以下の例ではターミナルを使って php_mailer というディレクトリを作成し、そこで composer require phpmailer/phpmailer を実行して PHPMailer をインストールしています。
$ mkdir php_mailer return # ディレクトリを作成 $ cd php_mailer return # php_mailer へ移動 $ composer require phpmailer/phpmailer return # PHPMailer をインストール Using version ^6.5 for phpmailer/phpmailer ./composer.json has been created Running composer update phpmailer/phpmailer Loading composer repositories with package information Updating dependencies Lock file operations: 1 install, 0 updates, 0 removals - Locking phpmailer/phpmailer (v6.5.1) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Downloading phpmailer/phpmailer (v6.5.1) - Installing phpmailer/phpmailer (v6.5.1): Extracting archive 5 package suggestions were added by new dependencies, use `composer suggest` to see details. Generating autoload files
以下は上記で PHPMailer をインストールした php_mailer というディレクトリの内容です。
$ tree php_mailer return # tree コマンドで内容を確認 php_mailer ├── composer.json # Composer により生成されるファイル ├── composer.lock # Composer により生成されるファイル └── vendor ├── autoload.php # Composer により提供されるオートローダー ├── composer │ ├── ClassLoader.php │ ├── LICENSE │ ├── autoload_classmap.php │ ├── autoload_namespaces.php │ ├── autoload_psr4.php │ ├── autoload_real.php │ ├── autoload_static.php │ └── installed.json └── phpmailer # PHPMailer の本体 └── phpmailer ├── COMMITMENT ├── LICENSE ├── README.md ├── SECURITY.md ├── VERSION ├── composer.json ├── get_oauth_token.php # Gmail の認証で XOAUTH2 を使う場合に使用 ├── language │ ├── phpmailer.lang-af.php ・・・中略・・・ │ ├── phpmailer.lang-ja.php #エラーメッセージの日本語翻訳ファイル ・・・中略・・・ └── src # プログラム本体(ソースファイル) ├── Exception.php ├── OAuth.php ├── PHPMailer.php ├── POP3.php └── SMTP.php 12 directories, 80 files
以下は前述の composer require コマンドでインストールで自動的に生成された composer.json です。
{ "require": { "phpmailer/phpmailer": "^6.5" } }
PHPMailer をダウンロード
Composer を使わない場合は PHPMailer 公式サイトの「Clone or download」から PHPMailer-master.zip をダウンロードすることができます。
Zip ファイルを解凍して内容を確認すると以下のようになっています。フォルダ名は「PHPMailer-master」となっていますが、「PHPMailer」など任意の名前に変更しても問題ありません。
$ tree PHPMailer-master return # tree コマンドで内容を確認 PHPMailer-master ├── COMMITMENT ├── LICENSE ├── README.md ├── SECURITY.md ├── VERSION ├── composer.json ├── get_oauth_token.php ├── language │ ├── phpmailer.lang-af.php ・・・中略・・・ │ ├── phpmailer.lang-ja.php # エラーなどの日本語翻訳ファイル ・・・中略・・・ └── src # プログラム本体(ソースファイル) ├── Exception.php ├── OAuth.php ├── PHPMailer.php ├── POP3.php └── SMTP.php 2 directories, 63 files
Composer を使ってインストールした場合はオートローダーのファイル(autoload.php)が自動生成されますが、ダウンロードしたパッケージにはないので php.ini の include_path で指定されているディレクトリに保存して(または include_path に配置した PHPMailer の PATH を追加)、それぞれのソースファイルを読み込む必要があります。
以下は MAMP の php.ini の include_path の例です。
;;;;;;;;;;;;;;;;;;;;;;;;; ; Paths and Directories ; ;;;;;;;;;;;;;;;;;;;;;;;;; #以下にPATHが記述されているのでコメントアウトを外して必要に応じ適宜修正します。 ; UNIX: "/path1:/path2" include_path = ".:/Applications/MAMP/bin/php/php7.4.1/lib/php" ; ; Windows: "\path1;\path2" ;include_path = ".;c:\php\includes"
上記の場合、例えば以下のように /Applications/MAMP/bin/php/php7.4.1/lib/php にダウンロードして解凍したフォルダ(以下の例では PHPMailer に名前を変更)を配置します。
関連項目:XAMPP を使ってメールを送信/PHPMailer(古い情報です)
動作確認
PHPMailer をインストールしたら、A Simple Example に掲載されているような PHP ファイルを作成して動作確認をすることができます。
公式サイトのサンプル:PHPMailer code examples
以下の test.php は PHPMailer を Composer を使ってインストールした場合の例です。また、Windows などのメーラの日本語に対応するための記述も追加しています。
<?php // HPMailer のクラスをグローバル名前空間(global namespace)にインポート // スクリプトの先頭で宣言する必要があります use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; // Composer のオートローダーの読み込み(ファイルの位置によりパスを適宜変更) require 'vendor/autoload.php'; //エラーメッセージ用日本語言語ファイルを読み込む場合(25行目の指定も必要) require 'vendor/phpmailer/phpmailer/language/phpmailer.lang-ja.php'; //言語、内部エンコーディングを指定 mb_language("japanese"); mb_internal_encoding("UTF-8"); // インスタンスを生成(引数に true を指定して例外 Exception を有効に) $mail = new PHPMailer(true); //日本語用設定 $mail->CharSet = "iso-2022-jp"; $mail->Encoding = "7bit"; //エラーメッセージ用言語ファイルを使用する場合に指定 $mail->setLanguage('ja', 'vendor/phpmailer/phpmailer/language/'); try { //サーバの設定 $mail->SMTPDebug = SMTP::DEBUG_SERVER; // デバグの出力を有効に(テスト環境での検証用) $mail->isSMTP(); // SMTP を使用 $mail->Host = 'mail.example.com'; // SMTP サーバーを指定 $mail->SMTPAuth = true; // SMTP authentication を有効に $mail->Username = 'info@example.com'; // SMTP ユーザ名 $mail->Password = 'password'; // SMTP パスワード $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // 暗号化を有効に $mail->Port = 465; // TCP ポートを指定 //受信者設定 //※名前などに日本語を使う場合は文字エンコーディングを変換 //差出人アドレス, 差出人名 $mail->setFrom('sender@example.com', mb_encode_mimeheader('差出人名')); //受信者アドレス, 受信者名(受信者名はオプション) $mail->addAddress('someone@xxxx.com', mb_encode_mimeheader("受信者名")); //追加の受信者(受信者名は省略可能なのでここでは省略) $mail->addAddress('someone@gmail.com'); //返信用アドレス(差出人以外に別途指定する場合) $mail->addReplyTo('info@example.com', mb_encode_mimeheader("お問い合わせ")); //Cc 受信者の指定 $mail->addCC('foo@example.com'); //コンテンツ設定 $mail->isHTML(true); // HTML形式を指定 //メール表題(文字エンコーディングを変換) $mail->Subject = mb_encode_mimeheader('日本語メールタイトル'); //HTML形式の本文(文字エンコーディングを変換) $mail->Body = mb_convert_encoding('メッセージ <b>BOLD</b>',"JIS","UTF-8"); //テキスト形式の本文(文字エンコーディングを変換) $mail->AltBody = mb_convert_encoding('テキストメッセージ',"JIS","UTF-8"); $mail->send(); //送信 echo 'Message has been sent'; } catch (Exception $e) { //エラー(例外:Exception)が発生した場合 echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; }
[パスワードなどに関する注意]
動作確認のサンプルではパスワードなどを直接ファイルに記述していますが、実際に使用する際は、パスワードなどの情報は別のファイルに記述して .htaccess を使って外部からアクセスできないようにしたり、外部からアクセスできない場所に保存して、require などで読み込むようにします。
[暗号化の設定]
暗号化の設定(35、36行目)は以下のように $mail->SMTPSecure に PHPMailer::ENCRYPTION_STARTTLS(TLS)を指定することもできます。
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587; //上記(TLS)を設定した場合はポートに 587 を指定
[日本語用の設定]
Windows のメーラなどでは、文字コードなどを指定しないと文字化けしてしまうので、差出人名やメールの表題などは mb_encode_mimeheader() で、本文は mb_convert_encoding() でエンコーディングを指定(変換)しています。
[日本語エラーメッセージ]
PHPMailer のエラーメッセージはデフォルトでは英語ですが、言語ファイルを読み込んで(11行目)言語を指定(25行目)すると日本語のエラーメッセージを表示することができます。
[オンラインマニュアル]
PHPMailer のプロパティやメソッドはオンラインマニュアルで確認できます。
作成した test.php にブラウザからアクセスすると、デバグ情報が出力され最後に「Message has been sent」と表示されてメールが送信できればOKです。
メールが送信できない場合は、出力されるログをもとに原因を探します。
ライブラリをダウンロードした場合
Composer を使わずに PHPMailer をダウンロードした場合は、前述の test.php の読み込みの部分(9行目や11行目)を変更する必要があります。
それぞれのソースファイルを個別に読み込みます(9〜11行目)。
<?php // HPMailer のクラスをグローバル名前空間(global namespace)にインポート // スクリプトの先頭で宣言する必要があります use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; // PHPMailer のソースファイルの読み込み(ファイルの位置によりパスを適宜変更) require 'PHPMailer-master/src/Exception.php'; require 'PHPMailer-master/src/PHPMailer.php'; require 'PHPMailer-master/src/SMTP.php';
Gmail の SMTP サーバを使う例
以下は Gmail の SMTP サーバでの動作確認の例です。
公式サイトのサンプル(gmail.phps)には IMAP を使ったメールの保存の方法も記載されています。
但し、デフォルトの Gmail のアカウントの設定のままだと認証に失敗して「Could not authenticate」というエラーが表示されて送信できない可能性が高いです。
認証に失敗しないようにするには Gmail のアカウントの「安全性の低いアプリの許可」を有効にするか、(パスワードの2段階認証を設定して)アプリパスワードを生成する必要があります。
<?php // HPMailer のクラスをグローバル名前空間(global namespace)にインポート // スクリプトの先頭で宣言する必要があります use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; // Composer のオートローダーの読み込み(ファイルの位置によりパスを適宜変更) require 'vendor/autoload.php'; //mbstring の日本語設定 mb_language("japanese"); mb_internal_encoding("UTF-8"); // インスタンスを生成(引数に true を指定して例外 Exception を有効に) $mail = new PHPMailer(true); //日本語用設定 $mail->CharSet = "iso-2022-jp"; $mail->Encoding = "7bit"; try { //サーバの設定 $mail->SMTPDebug = SMTP::DEBUG_SERVER; // デバグの出力を有効に(テスト環境での検証用) $mail->isSMTP(); // SMTP を使用 $mail->Host = 'smtp.gmail.com'; // ★★★ Gmail SMTP サーバーを指定 $mail->SMTPAuth = true; // SMTP authentication を有効に $mail->Username = 'xxxxxx@gmail.com'; // ★★★ Gmail ユーザ名 $mail->Password = 'password'; // ★★★ Gmail パスワード $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // ★★★ 暗号化(TLS)を有効に $mail->Port = 587; //★★★ ポートは 587 //受信者設定 //差出人アドレス, 差出人名 $mail->setFrom('sender@example.com', mb_encode_mimeheader('差出人名')); // 受信者アドレス, 受信者名(受信者名はオプション) $mail->addAddress('someone@xxxxxx.com', mb_encode_mimeheader("受信者名")); // 追加の受信者(受信者名は省略可能) $mail->addAddress('xxxxxx@example.com'); //返信用アドレス(差出人以外に必要であれば) $mail->addReplyTo('info@example.com', mb_encode_mimeheader("お問い合わせ")); //Cc 受信者の指定 $mail->addCC('someone@example.com'); //コンテンツ設定 $mail->isHTML(true); // HTML形式を指定 //メール表題(タイトル) $mail->Subject = mb_encode_mimeheader('日本語メールタイトル'); //本文(HTML用) $mail->Body = mb_convert_encoding('HTML メッセージ <b>BOLD</b>',"JIS","UTF-8"); //テキスト表示の本文 $mail->AltBody = mb_convert_encoding('プレインテキストメッセージ non-HTML mail clients',"JIS","UTF-8"); $mail->send(); //送信 echo 'Message has been sent'; } catch (Exception $e) { echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; }
上記のファイルにブラウザからアクセスすると、以下のようなエラー「SMTP Error: Could not authenticate.(認証失敗)」が表示されておそらく送信に失敗します。
・・・中略・・・ SMTP Error: Could not authenticate. 2020-03-12 05:53:43 CLIENT -> SERVER: QUIT 2020-03-12 05:53:43 SERVER -> CLIENT: xxx xxx.0.0 closing connectionwxxxxxxxxxx - gsmtp SMTP Error: Could not authenticate. Message could not be sent. Mailer Error: SMTP Error: Could not authenticate.
また、以下のような「誰かがあなたのパスワードを使って Google 以外のアプリからあなたのアカウントにログインしようとしました」という内容のメールが届きます。
「アクティビティを確認」をクリックすると以下が表示されます。
前述のメール送信の操作によるもので問題がない場合は「はい、心当たりがあります」をクリックすると以下が表示されます。
安全性の低いアプリの許可
Gmail のアカウントの「安全性の低いアプリのアクセス」で設定を変更することでメールを送信できるようになります。
「安全性の低いアプリの許可」を有効にすると、Gmail から以下のようなメールが送られてきます。
「アクティビティを確認」をクリックすると、以下が表示されるので有効にする場合は「はい、心当たりがあります」をクリックします。
但し「安全性の低いアプリのアクセス」に以下のように書かれているようにアカウントのセキュリティが脆弱になる恐れがあります。
一部のアプリやデバイスでは安全性の低いログイン技術が使用されており、アカウントが脆弱になる恐れがあります。こうしたアプリについてはアクセスを無効にすることをおすすめします。有効にする場合は、そのようなリスクをご理解のうえでお使いください。この設定が使用されていない場合は自動的に無効になります。
「安全性の低いアプリの許可」を有効にせずに Gmail の SMTP サーバを使用するには次項の「アプリパスワードを生成」や「Gmail の SMTP 認証で XOAUTH2 を使う」を御覧ください。但し、これらの方法でも Gmail アカウントのセキュリティ診断では「問題」として認識されます。
アプリパスワードを生成
通常の Gmail アカウントのパスワードの代わりにアプリパスワードを生成して、それを使用することで認証エラーにならずにメールを送信することもできます。
アプリパスワードとは、Google 以外のアプリやデバイスに Google アカウントへのアクセスを許可すパスコードです。
但し、アプリパスワードは2段階認証プロセスを有効にしているアカウントでのみ使用できるため、予め2段階認証プロセスを有効にしておく必要があります。それぞれの設定方法の詳細は以下で確認できます。
以下は既に2段階認証プロセスを有効にしてある場合の例です。
Google アカウントへログインして、左にある「セキュリティ」の項目を選択し、Google へのログインに表示されている「アプリ パスワード」をクリックします。
本人確認のためのパスワードを入力して「続行」をクリックすると以下のようなアプリパスワードの設定画面になるので、「アプリ」と「端末」を入力してアプリパスワードを生成します。
以下は「アプリを選択」で「その他(名前を入力)」を選択して適当な名前(以下の場合は localhost_phpmailer)を入力して生成する例です。
「生成」をクリックすると、以下のようにパスコードが表示されるので、生成されたパスコードを Gmail のパスワード($mail->Password )の値にコピーします。
これでメールは送信できるようになります。但し、Gmail アカウントのセキュリティ診断では以下のように表示されます。
Gmail の SMTP 認証で XOAUTH2 を使う
Gmail の SMTP 認証で XOAUTH2 を使えば、「安全性の低いアプリの許可」や「2段階認証プロセス」を有効にせずに Gmail の SMTP サーバを使用することができます。
但し、この方法で設定しても危険性の高いデータアクセスとして判定され、アカウントで確認すると以下のように表示されます。
また、XOAUTH2 のライブラリを使用するには PHP 5.5 またはそれ以上のバージョンの使用が必須です。また、以下を実施する必要があり少し手間がかかります。
- league/oauth2-client(league/oauth2-google)のインストール
- Google API プロジェクトの登録(以下の情報を作成)
- クライアントID
- クライアントシークレット
- トークン(Refresh Token)
関連リンク
oauth2-google のインストール
Composer を使っていれば、簡単に XOAUTH2 用のパッケージ(league/oauth2-google)をインストールすることができます(PHPMailer のデフォルトではインストールされていません)。
以下は既に Composer を使って PHPMailer がインストールされている場合の例です。
以下のように既存の(Composer を使ってインストールした)PHPMailer のディレクトリで composer require コマンドに league/oauth2-google を指定して実行するだけです。
$ composer require league/oauth2-google return # OAUTH2 を追加(インストール) Using version ^3.0 for league/oauth2-google ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 8 installs, 0 updates, 0 removals - Installing paragonie/random_compat (v9.99.99): Downloading (100%) - Installing ralouphie/getallheaders (3.0.3): Downloading (100%) - Installing psr/http-message (1.0.1): Downloading (100%) - Installing guzzlehttp/psr7 (1.6.1): Downloading (100%) - Installing guzzlehttp/promises (v1.3.1): Downloading (100%) - Installing guzzlehttp/guzzle (6.5.2): Downloading (100%) - Installing league/oauth2-client (2.4.1): Downloading (100%) - Installing league/oauth2-google (3.0.2): Downloading (100%) paragonie/random_compat suggests installing ext-libsodium (Provides a modern crypto API that can be used to generate random bytes.) guzzlehttp/psr7 suggests installing zendframework/zend-httphandlerrunner (Emit PSR-7 responses) guzzlehttp/guzzle suggests installing psr/log (Required for using the Log middleware) guzzlehttp/guzzle suggests installing ext-intl (Required for Internationalized Domain Name (IDN) support) Writing lock file Generating autoload files
league/oauth2-google がインストールされ、composer.json にも以下のように追加されます。
{ "require": { "phpmailer/phpmailer": "^6.1", "league/oauth2-google": "^3.0" } }
vendor フォルダには league などの必要なパッケージ(依存ファイル)がインストールされます。
$ tree php_mailer -L 2 return #tree コマンドで内容を確認 php_mailer ├── composer.json ├── composer.lock └── vendor ├── autoload.php ├── composer ├── guzzlehttp #追加されたライブラリ ├── league #追加されたライブラリ ├── paragonie #追加されたライブラリ ├── phpmailer ├── psr #追加されたライブラリ └── ralouphie #追加されたライブラリ
PHPMailer と共にインストール
まだ PHPMailer をインストールしていない場合は Composer を使って oauth2-google と PHPMailer を一緒にインストールします。
- PHPMailer と oauth2-google をインストールするディレクトリを作成
- composer.json を作成
- composer install コマンドを実行して PHPMailer と oauth2-google をインストール
以下のような composer.json を作成します。この例では vim で作成していますが、他のテキストエディタを使って作成することもできます。
{ "require": { "phpmailer/phpmailer": "^6.1", "league/oauth2-google": "^3.0" } }
上記の場合、バージョンの指定は以下のようになっていますが、必要であれば適宜変更します。
- "^6.5": 6.5 以上の最新のバージョン。但し 7.0.0 未満
- "^3.0": 3.0 以上の最新のバージョン。但し 4.0.0 未満
以下は Mac のターミナルを使ってインストールする例です。
$ mkdir phpmailer_oauth2 return # インストールするディレクトリを作成 $ cd phpmailer_oauth2 return # 作成したディレクトリに移動 $ vi composer.json return # vim で composer.json を作成 # composer.json を作成する部分は省略 $ cat composer.json return # 作成した composer.json を確認 { "require": { "phpmailer/phpmailer": "^6.5", "league/oauth2-google": "^3.0" } } $ composer install return # PHPMailer と oauth2-google をインストール Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 9 installs, 0 updates, 0 removals - Installing phpmailer/phpmailer (v6.1.5): Downloading (100%) - Installing paragonie/random_compat (v9.99.99): Loading from cache - Installing ralouphie/getallheaders (3.0.3): Loading from cache - Installing psr/http-message (1.0.1): Loading from cache - Installing guzzlehttp/psr7 (1.6.1): Loading from cache - Installing guzzlehttp/promises (v1.3.1): Loading from cache - Installing guzzlehttp/guzzle (6.5.2): Loading from cache - Installing league/oauth2-client (2.4.1): Loading from cache - Installing league/oauth2-google (3.0.2): Loading from cache phpmailer/phpmailer suggests installing psr/log (For optional PSR-3 debug logging) phpmailer/phpmailer suggests installing hayageek/oauth2-yahoo (Needed for Yahoo XOAUTH2 authentication) phpmailer/phpmailer suggests installing stevenmaguire/oauth2-microsoft (Needed for Microsoft XOAUTH2 authentication) phpmailer/phpmailer suggests installing symfony/polyfill-mbstring (To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)) paragonie/random_compat suggests installing ext-libsodium (Provides a modern crypto API that can be used to generate random bytes.) guzzlehttp/psr7 suggests installing zendframework/zend-httphandlerrunner (Emit PSR-7 responses) guzzlehttp/guzzle suggests installing psr/log (Required for using the Log middleware) guzzlehttp/guzzle suggests installing ext-intl (Required for Internationalized Domain Name (IDN) support) Writing lock file Generating autoload files $ tree -L 2 return #インストールされたファイルを確認 . ├── composer.json ├── composer.lock └── vendor ├── autoload.php ├── composer ├── guzzlehttp ├── league ├── paragonie ├── phpmailer ├── psr └── ralouphie
Google API プロジェクトの登録
Google Developers Console でプロジェクトを作成し、Gmail API を登録して認証情報を取得します。
以下がおおまかな手順です。
- プロジェクトを作成
- プロジェクトに Gmail API を登録して有効化
- 認証情報を作成するために「OAuth 同意画面」を設定
- 認証情報(OAuth クライアントID/クライアントシークレット)を作成
- トークン(Refresh Token)の取得
プロジェクトの作成
Google Developers Console にログインして、「CREATE PROJECT」をクリックしてプロジェクトを作成します。
任意のプロジェクト名を入力すると、自動的にプロジェクトIDが表示されるので必要に応じて変更し「作成」をクリックします。
プロジェクトへ Gmail API を登録
作成したプロジェクトが選択されている状態で、左上のメニューボタンをクリックして、表示される「API とサービス」を選択します。
「API とサービスを有効化」をクリックします。
「Gmail API」をクリックします。
「有効にする」をクリックします。
これで作成したプロジェクト(この例の場合は PHPMailer)に Gmail API が登録されます。
何らかの理由で Developers Console を離れて、また戻って来た場合は作成したプロジェクトを選択し、メニューから「API とサービス」を選択して登録されている「Gmail API」をクリックします。
「Gmail API」の画面が表示されます。
OAuth 同意
「認証情報を作成」をクリックします。
「認証情報を作成」を作成する前に、「OAuth 同意画面」を設定します。
左側メニューの「OAuth 同意画面」をクリックします。
何も選択せずに「作成」をクリックします(おそらく自動的に「外部」が選択されます)。
「OAuth 同意画面」が表示されるので、「アプリケーション名」に任意の名前を指定し、「サポートメール」で使用する Gmail の E-mail アドレスを選択し、「保存」をクリックします(その他はデフォルトのままで大丈夫です)。
設定した「OAuth 同意画面」が表示されます。
認証情報を作成
左側メニューの「認証情報」をクリックし「認証情報」のページで「認証情報を作成」をクリックし、「OAuth クライアント ID」を選択します。
「アプリケーションの種類」は「ウェブ アプリケーション」を選択し、「承認済みのリダイレクト URI」に PHPMailer に同梱されている get_auth_token.php の URL(※)を指定して「作成」をクリックします。
※ get_auth_token.php の URL はインストールした PHPMailer に同梱されているスクリプトです。
「クライアントID」と「クライアントシークレット」が表示されるのでコピーします。
トークン(Refresh Token)の取得
PHPMailer に同梱されているスクリプト get_auth_token.php を開いて、コピーした「クライアントID」と「クライアントシークレット」を設定します。
以下の $clientId と $clientSecret の値をコピーした値に変更します。また、$redirectUri は自動的に取得するようになっていますが、もしうまく行かない場合は「承認済みのリダイレクト URI」で指定した URL を指定します。
$clientId = 'RANDOMCHARS-----.apps.googleusercontent.com'; //コピーした値に変更 $clientSecret = 'RANDOMCHARS-----PcRtvP'; //コピーした値に変更 //自動的に取得する URL が機能しない場合は「承認済みのリダイレクト URI」を指定 $redirectUri = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; //$redirectUri = 'http://localhost/PHPMailer/redirect';
ブラウザで get_auth_token.php へアクセスすると、いかのような表示になるので「Google」をクリックします。
もし、以下のようなエラーが表示される場合は get_auth_token.php の require のデフォルトの値 vendor/autoload.php のパスを修正します。
Warning: require(vendor/autoload.php): failed to open stream: No such file or directory in /Applications/MAMP/htdocs/xxxx/php_mailer/vendor/phpmailer/phpmailer/get_oauth_token.php on line 59
デフォルトでは require 'vendor/autoload.php' になっているので環境に合わせて変更します。
require '../../vendor/autoload.php'; //環境に合わせて変更
アクセス権の許可
アカウントの選択画面が表示されるので、アカウント名をクリックします。
以下のような警告が表示されたら「詳細」をクリックして「PHPMailer(安全ではないページ)に移動」をクリックして認証ページに進みます。
権限付与のダイアログが表示されるので「許可」をクリックします。
いかが表示されるので、問題がなければ「許可」をクリックします(この時点で「お使いの Google アカウントへのアクセスが PHPMailer に許可されました」という通知メールが届きます)。
ブラウザに「Refresh Token」の値が表示されるのでコピーします。
動作確認サンプル
Google API プロジェクトの登録で作成した以下が必要になります。
- クライアントID
- クライアントシークレット
- トークン(Refresh Token)
以下のサンプルは「Gmail の SMTP サーバを使う例」の最初のサンプル test_gmail.php を元に書き換えてものです。追加や変更をしてある箇所は ### 追加 ### などで示しています。
PHPMailer の公式サイトのサンプル:PHPMailer/examples/gmail_xoauth.phps
関連ページ:コンタクトフォーム(お問い合わせページ)の作り方
<?php // HPMailer のクラスをグローバル名前空間(global namespace)にインポート // スクリプトの先頭で宣言する必要があります use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; use PHPMailer\PHPMailer\OAuth; // ### 追加 ### // Alias the League Google OAuth2 provider class use League\OAuth2\Client\Provider\Google;// ### 追加 ### // Composer のオートローダーの読み込み(ファイルの位置によりパスを適宜変更) require 'vendor/autoload.php'; //mbstring の日本語設定 mb_language("japanese"); mb_internal_encoding("UTF-8"); // インスタンスを生成(引数に true を指定して例外 Exception を有効に) $mail = new PHPMailer(true); //日本語用設定 $mail->CharSet = "iso-2022-jp"; $mail->Encoding = "7bit"; try { //サーバの設定 $mail->SMTPDebug = SMTP::DEBUG_SERVER; // デバグの出力を有効に(テスト環境での検証用) $mail->isSMTP(); // SMTP を使用 $mail->Host = 'smtp.gmail.com'; // ★★★ Gmail SMTP サーバーを指定 $mail->SMTPAuth = true; // SMTP authentication を有効に $mail->AuthType = 'XOAUTH2';// ### 追加 ### AuthType を XOAUTH2 に指定 //$mail->Username = 'xxxxxx@gmail.com'; // ### 不要 ### //$mail->Password = 'xxxxxx'; // ### 不要 ### // ★★★ 暗号化を有効に PHPMailer::ENCRYPTION_STARTTLS を使う場合はポートを 587 に $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465; //ポートの指定 // ### OAUTH2 の設定 ### //Gmail メールアドレス $google_email = 'xxxxxx@gmail.com'; //クライアント ID $clientId = 'xxxxxx.apps.googleusercontent.com'; //クライアントシークレット $clientSecret = 'xxxxxx'; //トークン(Refresh Token) $refreshToken = 'xxxxxx'; //OAuth2 プロバイダのインスタンスの生成 $provider = new Google( [ 'clientId' => $clientId, 'clientSecret' => $clientSecret, ] ); //OAuth プロバイダのインスタンスを PHPMailer へ渡す $mail->setOAuth( new OAuth( [ 'provider' => $provider, 'clientId' => $clientId, 'clientSecret' => $clientSecret, 'refreshToken' => $refreshToken, 'userName' => $google_email, ] ) ); // ### OAUTH2 の設定 ここまで ### //受信者設定 //差出人アドレス(Gmail のアドレス), 差出人名 $mail->setFrom($google_email, mb_encode_mimeheader('差出人名')); // ### 変更 ### // 送信先アドレス, 受信者名(受信者名はオプション) $mail->addAddress('xxxxxx@xxxxxx.com', mb_encode_mimeheader("受信者名")); // 追加の受信者(受信者名は省略可能) $mail->addAddress('xxxxxx@xxxxxx.com'); //返信用アドレス(差出人以外に必要であれば) $mail->addReplyTo('info@example.com', mb_encode_mimeheader("お問い合わせ")); //Cc 受信者の指定 $mail->addCC('xxxxxx@xxxxxx.com'); //コンテンツ設定 $mail->isHTML(true); // HTML形式を指定 //メール表題(タイトル) $mail->Subject = mb_encode_mimeheader('日本語メールタイトル'); //本文(HTML用) $mail->Body = mb_convert_encoding('HTML メッセージ <b>BOLD</b>',"JIS","UTF-8"); //テキスト表示の本文 $mail->AltBody = mb_convert_encoding('テキストメッセージ',"JIS","UTF-8"); $mail->send(); //送信 echo 'Message has been sent'; } catch (Exception $e) { echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; }
アクセス権を削除した場合
何らかの理由で Gmail のアカウントで PHPMailer のアクセス権を削除すると、例えば、メールを送信しようとすると以下のようなエラーが表示され、サービスの利用を再開するにはアクセス権を再度許可する必要があります。
Fatal error: Uncaught League\OAuth2\Client\Provider\Exception\IdentityProviderException: invalid_grant in /Applications/MAMP/htdocs/.../phpmailer/vendor/league/oauth2-google/src/Provider/Google.php:118 Stack trace: #0 /Applications/MAMP/htdocs/.../phpmailer/vendor/league/oauth2-client/src/Provider/AbstractProvider.php(628): League\OAuth2\Client\Provider\Google->checkResponse(Object(GuzzleHttp\Psr7\Response), Array) #1 /Applications/MAMP/htdocs/.../phpmailer/vendor/league/oauth2-client/src/Provider/AbstractProvider.php(537): League\OAuth2\Client\Provider\AbstractProvider->getParsedResponse(Object(GuzzleHttp\Psr7\Request)) #2 /Applications/MAMP/htdocs/.../phpmailer/vendor/phpmailer/phpmailer/src/OAuth.php(115): League\OAuth2\Client\Provider\AbstractProvider->getAccessToken in /Applications/MAMP/htdocs/.../phpmailer/vendor/league/oauth2-google/src/Provider/Google.php on line 118
承認済みのリダイレクト URI から再度アクセスを許可
以下は承認済みのリダイレクト URI から再度アクセスを許可する場合の例です。
「認証情報」で対象のクライアントIDを選択して、その画面で承認済みの URI をコピーします。
「Google」をクリックして、再度アクセス権の許可を実行します。