PHPMailer導入とトラブル対策

post-063-img-0001

PHPMailerの導入とトラブルシューティング

PHPMailerは、PHPからメールを送信できる便利なライブラリですが、初期導入時にいろいろ動かなかったりすることがあるみたいなので、今回は導入からトラブルシューティングまでをカバーしていきたいと思います。

下準備

Gmailのアカウントを作成しておく

まずはGmailのアカウントを持っていない人はGoogleのサイトに行って、Gmailのアカウント作っておきます。ここで作成したアカウントのユーザーIDとパスワードは後述するサンプルソースを動かすために必要ですので、メモしておきます。

Composerの導入

PHPMailerを入れる前に、便利なコマンドラインツールComposerを導入しておきましょう。下記の例は、CentOSで実行しています。

  1. 適当な場所に作業フォルダを作成する
  2. php -r “copy(‘https://getcomposer.org/installer’, ‘composer-setup.php’);”
  3. php composer-setup.php
  4. mv composer.phar /usr/local/bin/composer

PHPMailerのインストール

Composerを使ってPHPMailerを導入する

Composerを導入したら、次はこのComposerを使ってPHPMailerをインストールします。まず、PHPのライブラリサーチパスの通っているフォルダに移動して作業するのが良いのですが、そんなもの知らないという人は、まずはPHPMailerを確実に動かすためのヒントとして、以下のようにすると良いかもしれません(あくまでも実験用の方法です。本番ではちゃんとライブラリの保存場所に入れたほうが良いです)。

ここでは、仮にサンプルソースを入れるフォルダが(/home/websrc/www/)だったと仮定します。そのうえで、下記のインストール用コマンドを実行します。

  1. cd /home/websrc/www/
  2. composer require phpmailer/phpmailer

インストール後の確認

上記のインストール用コマンドを実行すると、サンプルソースがある場所(/home/websrc/www/)の直下に、PHPMailerがダウンロードされます。これは、本番環境では好ましくないですが、初期トラブルでよくある require_oncesしているのにPHPMailerがうまく動作しない場合等の状態になってしまったときにデバッグを簡単にするための措置です。まずはとにかくPHPMailerを動かすことを最優先した配置です。

 この(/home/websrc/www/)フォルダの直下に、「vendor」という名前のフォルダが出来ているはずです。このvendorフォルダのなかにPHPMailerがあります。

 ここで、後述するサンプルソース(仮にsample.phpという名前だとします)も入れたとすると、フォルダの構成は以下のようになっているはずです。

[root@web02 /home/websrc/www/]# tree
.
├── sample.php
└── vendor
    ├── autoload.php
    ├── composer
    │   ├── autoload_classmap.php
    │   ├── autoload_namespaces.php
    │   ├── autoload_psr4.php
    │   ├── autoload_real.php
    │   ├── autoload_static.php
    │   ├── ClassLoader.php
    │   ├── installed.json
    │   └── LICENSE
    └── phpmailer
        └── phpmailer
            ├── get_oauth_token.php
            ├── language
            │   ├── phpmailer.lang-am.php
            │   ├── phpmailer.lang-ar.php
            │   ├── phpmailer.lang-az.php
            │   ├── phpmailer.lang-ba.php
            │   ├── phpmailer.lang-be.php
            │   ├── phpmailer.lang-bg.php
            │   ├── phpmailer.lang-ca.php
            │   ├── phpmailer.lang-ch.php
            │   ├── phpmailer.lang-cs.php
            │   ├── phpmailer.lang-da.php
            │   ├── phpmailer.lang-de.php
            │   ├── phpmailer.lang-el.php
            │   ├── phpmailer.lang-eo.php
            │   ├── phpmailer.lang-es.php
            │   ├── phpmailer.lang-et.php
            │   ├── phpmailer.lang-fa.php
            │   ├── phpmailer.lang-fi.php
            │   ├── phpmailer.lang-fo.php
            │   ├── phpmailer.lang-fr.php
            │   ├── phpmailer.lang-gl.php
            │   ├── phpmailer.lang-he.php
            │   ├── phpmailer.lang-hi.php
            │   ├── phpmailer.lang-hr.php
            │   ├── phpmailer.lang-hu.php
            │   ├── phpmailer.lang-id.php
            │   ├── phpmailer.lang-it.php
            │   ├── phpmailer.lang-ja.php
            │   ├── phpmailer.lang-ka.php
            │   ├── phpmailer.lang-ko.php
            │   ├── phpmailer.lang-lt.php
            │   ├── phpmailer.lang-lv.php
            │   ├── phpmailer.lang-ms.php
            │   ├── phpmailer.lang-nb.php
            │   ├── phpmailer.lang-nl.php
            │   ├── phpmailer.lang-pl.php
            │   ├── phpmailer.lang-pt_br.php
            │   ├── phpmailer.lang-pt.php
            │   ├── phpmailer.lang-ro.php
            │   ├── phpmailer.lang-rs.php
            │   ├── phpmailer.lang-ru.php
            │   ├── phpmailer.lang-sk.php
            │   ├── phpmailer.lang-sl.php
            │   ├── phpmailer.lang-sv.php
            │   ├── phpmailer.lang-tr.php
            │   ├── phpmailer.lang-uk.php
            │   ├── phpmailer.lang-vi.php
            │   ├── phpmailer.lang-zh_cn.php
            │   └── phpmailer.lang-zh.php
            ├── LICENSE
            ├── README.md
            ├── SECURITY.md
            ├── src
            │   ├── Exception.php
            │   ├── OAuth.php
            │   ├── PHPMailer.php
            │   ├── POP3.php
            │   └── SMTP.php
            └── VERSION

動作の確認

動作確認済みサンプルソース

では、今回実際に使用して動作確認したサンプルソースを示しておきます。

<?php
require_once("vendor/autoload.php");
$mail = new PHPMailer\PHPMailer\PHPMailer();
$subject = "タイトル";
$body = "メール本文";
$from_name = "送信者の氏名";
$from_addr = "送信者のメールアドレス";
$smtp_user = "GMAILのユーザーID";
$smtp_password = "GMAILのパスワード";
$to_address = "送信先アドレス";
$mail->IsSMTP();
$mail->SMTPDebug = 0; 
$mail->SMTPAuth = true;
$mail->CharSet = 'utf-8';
$mail->SMTPSecure = 'tls';
$mail->Host = "smtp.gmail.com";
$mail->Port = 587;
$mail->IsHTML(false);
$mail->Username = $smtp_user;
$mail->Password = $smtp_password; 
$mail->SetFrom($from_addr,$from_name);
$mail->Subject = $subject;
$mail->Body = $body;
$mail->AddAddress($to_address);
if( !$mail -> Send() ){
    $result_message  = "Email send failure.Error Message: " . $mail->ErrorInfo;
} else {
    $result_message  = "Email Sent Successful";
}
echo $result_message ;
?>

実際に使ってみる

サンプルソースをサーバーにアップロードして、phpコマンドで起動するか、もしくはウェブサーバにアップロードして、ウエブブラウザから開いてみてください。本サンプルはどちらでも動作するはずで、筆者も両方のケースで動作確認しました。
 実行後に、「Email Sent Successful」と表示され、実際に電子メールが受信者のアドレスに届けば成功です。おめでとうございます。

関連商品のご紹介

トラブルシューティング

PHPMailerのデバッグスイッチを入れる

PHPMailerのトラブルシューティングで、まず初めにやらなければならないのは、PHPMailerのデバッグ機能を有効にすることです。これは、上記のサンプルソースの13行目の「$mail->SMTPDebug = 0; 」の数値を変更することで行います。

0:デバッグOFF
1:クライアントから出されるメッセージのみ出力
2:「1」の出力に加えてサーバからの応答も出力
3:「2」の出力に加えて接続時のデバッグ情報も出力
4:「3」の出力に加えてより多くの情報を出力

また、php.iniファイル内の「log_errors」を「On」にして、PHPのエラーもキャッチできるようにしておきます。

メールの送信が異常に遅い

特にGoogleのGmailのSMTPサーバ経由でメールを送信しようとする場合、メールの送信完了までに数分かかることがあります。これはGoogleのほうでIPv6を使っているからで、回避するのは簡単です。PHPMailerのソースに以下の行を追加するだけで劇的に早くなります。

$mail->Host = gethostbyname("smtp.gmail.com");

更に下記の2行を加えてSMTPサーバの検証をさせないようにするという手もあります。

$mail->SMTPOptions = array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false));

PHPMailerクラスが見つからない

サンプルソースを起動すると、こんなエラーが出力されます。

Fatal error: Class ‘PHPMailer’ not found in ….

かなり多くの人が、この問題で苦しんでいるようです。まず、動作させることを最優先にしてComposerでサンプルソースと同じフォルダにPHPMailerを入れた人で、上記のサンプルソースをコピペしてソースを作った人は、このエラーに陥らないような気もしますが、このエラーの要点を書いておきますと、まず、このエラーは、require_onceで「vendor/autoload.php」を導入できているのであれば、PHPMailerのクラスファイル自体は読み込めています。ですので、ここを疑う必要はありません。もしも、サンプルソースと同じフォルダではない場所にPHPMaierを入れたのであれば、autoload.phpが正しくrequireされていることを確かめなくてはいけません。

この問題の要点は、実はサンプルソースの2行目にあります。これを実際のエディタで開いてみたところが下記の通りです。
post-065-img-0001

そうなんです、クラス名とネームスペースを区切っている文字が「円マーク」つまりバックスラッシュなんです。Linuxでも円マークなんです。ここを間違えて、スラッシュ(/)にしてしまうと・・・「PHP Fatal error: Class ‘PHPMailer’ not found in … 」エラーが出てしまいます。これではまる人も多いと思うので注意が必要です。

Gmailに接続できない

次によくあるトラブルが、Gmailのアカウントのユーザー名とパスワードはちゃんと入れているはずなのに、ログに、「SMTP ERROR: Password command failed」とか、「SMTP connect() failed. 」といった内容のものが出てきてしまい、Gmailに接続できないというものです。
 これは、Gmail側で、未知の外部アプリからのアクセスを遮断しているからで、Gmailの設定を変更して、外部アプリからでもGmailのSMTPサーバにアクセスできるようにしてあげれば解決します。これをするには、Gmailの「安全性の低いアプリによるアクセスを許可する」設定をしてあげればOKです。

post-065-img-0002

の設定は、ONにしてもすぐには反映されないようで、しばらく時間がかかります。
 また、しばらくしてもアクセスできなかったり、「Please log in with your web browser and then try again」のような文字列を含むエラーが出るような場合は、ここのページにアクセスしてデバイスを許可してあげると、通るようになったりしますので、試してみて下さい。

php_mbstringが導入されていない

あまりないケースだとは思いますが、一応、日本語を扱う場合は、php_mbstringが導入されていなければなりません。これがないと、文字化けしたり動作しなかったりします。もしも導入していない場合は、こちらも導入してください。

関連商品のご紹介

おわりに

PHPMailerは非常に便利なライブラリで、筆者もよく利用させてもらっていますが、けっこうたくさんエラーで悩んでいる人をみかけたために、今回はPHPMailerのカンタンな導入方法と、よくあるトラブルの対処方法をブログで情報共有してみました。如何でしたでしょうか。またこのような情報の共有もしていきたいと思いますので、よろしくお願い致します。

タイトルとURLをコピーしました