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のエラーもキャッチできるようにしておきます。
PHPMailerクラスが見つからない
サンプルソースを起動すると、こんなエラーが出力されます。
Fatal error: Class 'PHPMailer' not found in ....
かなり多くの人が、この問題で苦しんでいるようです。まず、動作させることを最優先にしてComposerでサンプルソースと同じフォルダにPHPMailerを入れた人で、上記のサンプルソースをコピペしてソースを作った人は、このエラーに陥らないような気もしますが、このエラーの要点を書いておきますと、まず、このエラーは、require_onceで「vendor/autoload.php」を導入できているのであれば、PHPMailerのクラスファイル自体は読み込めています。ですので、ここを疑う必要はありません。もしも、サンプルソースと同じフォルダではない場所にPHPMaierを入れたのであれば、autoload.phpが正しくrequireされていることを確かめなくてはいけません。
この問題の要点は、実はサンプルソースの2行目にあります。これを実際のエディタで開いてみたところが下記の通りです。
そうなんです、クラス名とネームスペースを区切っている文字が「円マーク」つまりバックスラッシュなんです。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のカンタンな導入方法と、よくあるトラブルの対処方法をブログで情報共有してみました。如何でしたでしょうか。またこのような情報の共有もしていきたいと思いますので、よろしくお願い致します。
このカテゴリのページリンク |
同一カテゴリの記事一覧
- 【テクニカル】WordPressを多言語化する
- 【テクニカル】CentOs8 インストール後にすべきことメモ
- 【テクニカル】一番簡単なCentOS PHP7.3から7.4への移行方法
- 【テクニカル】パソコンへのLinuxの導入
- 【テクニカル】Open Graph 手書きのウエブサイトをSNSでシェアできるよう…
- 【テクニカル】C# NotifyIconの実装
- 【テクニカル】一番わかりやすいBracketsの導入とトラブルシューティング
- 【テクニカル】無料SSL Let's EncryptでWordpressサイトをSSL化する
- 【テクニカル,未分類】【Windows10】ホテルのWiFi接続時に「インターネット接続…
- 【テクニカル】Let's Encryptのトラブルシューティング
- 【テクニカル】C# で Task を使う
- 【テクニカル】MacBookProにBootcampでWindows10を入れる際のポイント
- 【テクニカル】PHPMailer導入とトラブル対策
- 【テクニカル】PHPMailerのログをSYSLOGに出力
- 【テクニカル】Visual Studio 2017で使うSSHの秘密鍵をputtygenで作成す…
- 【テクニカル】Wordpressの投稿一覧で要らない項目を削除する方法
- 【テクニカル】Google SEO の要点 - Better Google SEO
- 【テクニカル】wordpressを始める前に絶対すべき準備 - Things you need …
- 【テクニカル】Wordpress URL設定間違い・サイト移動のトラブル対応 - Ho…
- 【テクニカル】VisualStudio2013セットアッププロジェクトを戻す! - Vis…
- 【テクニカル】C# でWindowsサービスの「説明」の文を取得する方法 - C# …
- 【テクニカル】動画配信に最低限必要なモノ(動画配信環境)
- 【テクニカル】動画配信のトラブル対処(ブーンというノイズが乗る)
- 【テクニカル】client denied by server configuration: