PHPMailerの導入とトラブルシューティング
PHPMailerは、PHPからメールを送信できる便利なライブラリですが、初期導入時にいろいろ動かなかったりすることがあるみたいなので、今回は導入からトラブルシューティングまでをカバーしていきたいと思います。
下準備
Gmailのアカウントを作成しておく
まずはGmailのアカウントを持っていない人はGoogleのサイトに行って、Gmailのアカウント作っておきます。ここで作成したアカウントのユーザーIDとパスワードは後述するサンプルソースを動かすために必要ですので、メモしておきます。
Composerの導入
PHPMailerを入れる前に、便利なコマンドラインツールComposerを導入しておきましょう。下記の例は、CentOSで実行しています。
- 適当な場所に作業フォルダを作成する
- php -r “copy(‘https://getcomposer.org/installer’, ‘composer-setup.php’);”
- php composer-setup.php
- mv composer.phar /usr/local/bin/composer
PHPMailerのインストール
Composerを使ってPHPMailerを導入する
Composerを導入したら、次はこのComposerを使ってPHPMailerをインストールします。まず、PHPのライブラリサーチパスの通っているフォルダに移動して作業するのが良いのですが、そんなもの知らないという人は、まずはPHPMailerを確実に動かすためのヒントとして、以下のようにすると良いかもしれません(あくまでも実験用の方法です。本番ではちゃんとライブラリの保存場所に入れたほうが良いです)。
ここでは、仮にサンプルソースを入れるフォルダが(/home/websrc/www/)だったと仮定します。そのうえで、下記のインストール用コマンドを実行します。
- cd /home/websrc/www/
- 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; 」の数値を変更することで行います。
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クラスが見つからない
サンプルソースを起動すると、こんなエラーが出力されます。
かなり多くの人が、この問題で苦しんでいるようです。まず、動作させることを最優先にしてComposerでサンプルソースと同じフォルダにPHPMailerを入れた人で、上記のサンプルソースをコピペしてソースを作った人は、このエラーに陥らないような気もしますが、このエラーの要点を書いておきますと、まず、このエラーは、require_onceで「vendor/autoload.php」を導入できているのであれば、PHPMailerのクラスファイル自体は読み込めています。ですので、ここを疑う必要はありません。もしも、サンプルソースと同じフォルダではない場所にPHPMaierを入れたのであれば、autoload.phpが正しくrequireされていることを確かめなくてはいけません。
そうなんです、クラス名とネームスペースを区切っている文字が「円マーク」つまりバックスラッシュなんです。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です。
の設定は、ONにしてもすぐには反映されないようで、しばらく時間がかかります。
また、しばらくしてもアクセスできなかったり、「Please log in with your web browser and then try again」のような文字列を含むエラーが出るような場合は、ここのページにアクセスしてデバイスを許可してあげると、通るようになったりしますので、試してみて下さい。
php_mbstringが導入されていない
あまりないケースだとは思いますが、一応、日本語を扱う場合は、php_mbstringが導入されていなければなりません。これがないと、文字化けしたり動作しなかったりします。もしも導入していない場合は、こちらも導入してください。
関連商品のご紹介
おわりに
PHPMailerは非常に便利なライブラリで、筆者もよく利用させてもらっていますが、けっこうたくさんエラーで悩んでいる人をみかけたために、今回はPHPMailerのカンタンな導入方法と、よくあるトラブルの対処方法をブログで情報共有してみました。如何でしたでしょうか。またこのような情報の共有もしていきたいと思いますので、よろしくお願い致します。
- AmazonFireTVをUSBメモリに録画する方法
- さくらのVPSのubuntuにLAMP環境をインストール
- WEBサイトHowTo
- エレクトロハーモニクス
- 漢字書き順表示WEB
- Windows11 削除できないファイル・フォルダを削除
- STM32 Nucleo Boardで電子サイコロ
- STM32 Nucleo BoardでGPIO
- STM32 Nucleo BoardでLED点滅
- STM32F103でマイコン遊び
- windows11のエクスプローラのクイックアクセスを復活させる方法
- iCloud写真でjpg画像をダウンロードできない
- Acrobatが遅い時に見る記事
- Wordpress サイト・ヘルスチェック
- imgur:既にアップロードした写真を既存のpost(Album)に入れ…
- 無料SSL Let's EncryptでWordpressサイトをSSL化する-Ubuntu版
- [ubuntu]ドメイン購入からWordpress設定までの全工程解説
- WordPressのメール送信が遅い時のトラブルシューティングとGmai…
- ドコモ携帯が海外でネット接続できなくなるトラブル・パケット…
- R Studio 統計分析システムの導入方法
- Let's Encrypt revoke & サイト消去 @ubuntu
- paiza.ioのjavaプログラムにコマンドライン引数を与える方法2選
- PHP - Ajaxでリアルタイムチャットなど
- PHPMailer導入とトラブル対策
- Netflixの音声をHome Pod mini で再生できない
- wordpress二段階認証の注意点など
- Wordpressの保存ができない・オートセーブを完全に停止する
- ブラザー・レーザープリンタ HL-317CDW リセット
- 動画配信のトラブル対処(ブーンというノイズが乗る)
- 無料SSL Let's EncryptでWordpressサイトをSSL化する-centos版
- 一番簡単なCentOS PHP7.3から7.4への移行方法
- 一番わかりやすいBracketsの導入とトラブルシューティング
- パソコンへのLinuxの導入
- Wordpressの投稿一覧画面から要らない項目を削除する
- VisualStudio2013にあったセットアッププロジェクトを戻す!
- Visual Studioで使うSSHの秘密鍵をputtygenで作成する方法
- PHPMailerのログ出力をSyslogにする
- Open Graph HTML手書きのウエブサイトをSNSでシェアできるよう…
- MacBookProにBootcampでWindows10を入れる際のポイント
- Let's Encryptのトラブルシューティング
- 無料SSL Let's EncryptでWordpressサイトをSSL化する
- client denied by server configuration
- CentOs8 インストール後にすべきことメモ
- C# でWindowsサービスの「説明」を取得する方法
- C# NotifyIconの実装
- 【Windows10】ホテルのWiFi接続時にWiFiのログイン画面が出ない…