PHP Logo PHPMailer の使い方

PHPMailer は SMTP サーバを利用してメールを送信するための PHP のライブラリです。

PHPMailer を使えば MAMP などのローカル環境で外部の SMTP サーバを使ってメールを送信することができます。

また、mb_send_mail() はシンプルなメールを送る場合には問題ありませんが、HTML メールや添付ファイルを使ったメールを送る場合などは PHPMailer を利用すると簡単です。

但し、ライブラリは更新する必要があるなど実際に使用する場合は検討が必要です。

以下で使用している PHPMailer のバージョンは 6.1.4 です。5.2.x とはソースファイルの配置場所や名前空間の宣言などで異なっています(Upgrading from 5.2)。

※[脆弱性の問題]5.2.22 (2017/1/9 リリース) より前のバージョンにはセキュリティ上のリスクが存在するので注意が必要です(PHPMailer Security)。

更新日:2020年03月25日

作成日:2020年3月13日

PHPMailer のセットアップ

PHPMailer のインストールは Composer を使う方法が推奨されていますが、パッケージをダウンロードして使うこともできます。

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.1 for phpmailer/phpmailer  #最新のバージョンが適用される
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing phpmailer/phpmailer (v6.1.4): Loading from cache
phpmailer/phpmailer suggests installing psr/log (For optional PSR-3 debug logging)
phpmailer/phpmailer suggests installing league/oauth2-google (Needed for Google XOAUTH2 authentication)
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))
Writing lock file
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 です。

composer.json
{
    "require": {
        "phpmailer/phpmailer": "^6.1"
    }
}

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 の例です。

php.ini 一部抜粋
;;;;;;;;;;;;;;;;;;;;;;;;;
; 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 などのメーラの日本語に対応するための記述も追加しています。

test.php
<?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 Localization

[オンラインマニュアル]

PHPMailer のプロパティやメソッドはオンラインマニュアルで確認できます。

PHPMailer.PHPMailer.html

作成した 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」というエラーが表示されて送信できない可能性が高いです。

test_gmail.php
<?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.
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.

Gmail のアカウントの「安全性の低いアプリのアクセス」で設定を変更することでメールを送信できるようになります。

「安全性の低いアプリの許可」を有効にすると、Gmail から以下のようなメールが送られてきます。

「アクティビティを確認」をクリックすると、以下が表示されるので有効にする場合は「はい、心当たりがあります」をクリックします。

但し「安全性の低いアプリのアクセス」に以下のように書かれているようにアカウントのセキュリティが脆弱になる恐れがあります。

一部のアプリやデバイスでは安全性の低いログイン技術が使用されており、アカウントが脆弱になる恐れがあります。こうしたアプリについてはアクセスを無効にすることをおすすめします。有効にする場合は、そのようなリスクをご理解のうえでお使いください。この設定が使用されていない場合は自動的に無効になります。

「安全性の低いアプリの許可」を有効にせずに Gmail の SMTP サーバを使用するには次項「Gmail の SMTP 認証で XOAUTH2 を使う」を御覧ください。

Gmail の SMTP 認証で XOAUTH2 を使う

Gmail の SMTP 認証で XOAUTH2 を使えば、「安全性の低いアプリの許可」を有効にせずに 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 にも以下のように追加されます。

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 で作成していますが、他のテキストエディタを使って作成することもできます。

composer.json
{
    "require": {
        "phpmailer/phpmailer": "^6.1",
        "league/oauth2-google": "^3.0"
    }
}

上記の場合、バージョンの指定は以下のようになっていますが、必要であれば適宜変更します。

  • "^6.1": 6.1 以上の最新のバージョン。但し 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.1",
        "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 を指定します。

get_auth_token.php
$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}";
}