【PHPMailer】問い合わせフォームのエラー対処法はアプリパスワードの設定だった

プログラミング

こんにちは、カヨです。

今回のお題は、
【PHPMailer】
問い合わせフォームのエラー対処法は
アプリパスワードの設定だった

問題解決 / 手順・方法

過去、サイトのお問い合わせを利用したがエラーで送れないことがありました。原因を探るためPHPmailerの設定でエラーを表示設定にして読んでみるとSMTP認証でエラーがでていたので、その時の対象方法を記録しました。もし、あなたも同じ事象がおいていたらこの記事が役に立つかもしれません。

 

 

 

こんな方に読んでいただきたいと思っています!

✔︎サイトのお問い合わせがエラーでいつの間に送れなくなっていた人
お問い合わせフォームにPHPmailerを使用してメールサーバーをGmailにしている人
アプリパスワードの発行方法がわからない人

 

 

 

前提

・お問い合わせがPHPmailerというライブラリで作成されている
・メールサーバーにGmailを採用している

 

 

 

原因

SMTP認証でメールサーバーにログインが拒否されているから
PHPmailerで作成しているお問い合わせフォームがGmailのメールサーバーを利用してメールを送る際にGmailのログインが必要になるので、アカウントの使用許可が必要になります。その認証パスがうまくいってない。「間違ってる」「認証できない」などのエラーがおきているということです。なので正しいパスを設置してあげれば解決します。

筆者
筆者

当時、筆者は今までうまく機能していたし、特別編集などもしてなかったのに突然メールがくれなくなったので、より驚きました。

 

 

 

原因の確認方法

あなたのエラーが実際に何のエラーかわからないとここに記載している解決方法を実践しても解決にはなりません。なので、確認しましょう。

 

① エラーを確認する設定準備 ✏📄

エラーを出力する設定する記述の場所へ移動。
 ⇒ ファイルの場所:メール送信するPHPファイル「送信処理のバックエンド部分」send.phpやform.phpのような命名が多い。

 

$mailer->SMTPDebug = 0;
この記述がエラーを出力する設定。もしも、書いてなかったら出力してもしなくても追記しておくのがGood!$mailer->IsSMTP(); の下に加えます。

 

$mailer->SMTPDebug = 2; へ変更する
【 0:非表示 / 1:簡易ログ / 2:詳細ログ 】の設定。詳細ログでエラーの内容を確認しましょう。

 

ログの出力先とログファイルを指定
以下のログ出力コードを $mailer->SMTPDebug = 0; の下に追記。logs フォルダをこのコードが書かれているファイルと同階層にlog フォルダがあれば、メールの送信ボタンが押されるたびにその中にdebug.logが作成されてエラーの詳細か見られます。

$logPath = __DIR__ . "/logs/debug.log";
$mailer->Debugoutput = function($str, $level) use ($logPath) {
    file_put_contents($logPath, $str . "\n", FILE_APPEND);
}
《解説》
【アウトプット場所】

$logPath = __DIR__ . “/logs/debug.log”; とファイル名を指定
【エラーの詳細をアウトプット】
$mailer->Debugoutput = function($str, $level) use ($logPath) {
    file_put_contents($logPath, $str . “\n”, FILE_APPEND);
}; 
実は、$mailer->SMTPDebug = 0; の数値を 2 に変更するだけでエラーの詳細は確認できますが本番のhtml画面に直接表示され、見えてはいけないパスワードなどが一般の人に見られて情報漏洩します。一見、パスワードが書かれてないように見えても Base64でエンコードされたユーザー名・パスワード が表示されますので出力先を必ず指定しましょう。

 

コードのおさらい

$mailer->SMTPDebug = 2; // debugging: 1 = errors and messages, 2 = messages only 本番では0、トラブル時のみ2に変更。
$logPath = __DIR__ . "/logs/debug.log";
$mailer->Debugoutput = function($str, $level) use ($logPath) {
    file_put_contents($logPath, $str . "\n", FILE_APPEND);
};
筆者
筆者

これで追記するコードが終わりました。ただし、出力するはずの logs フォルダがまだありません。ないものは出力できませんので作成しましょう。

 

logs.phpを作成する
send.phpに上記の記述をかいたとしたら(ファイル名はsendではない場合もあります。人それぞれです。)同じ階層に logs フォルダを手動で作成。

/var/www/html/
└── contact/
    ├── send.php        ← メール送信の処理がここに書かれている
    └── logs/           ← ログを保存するためのフォルダ(手動で作成)
        └── debug.log   ← ここにログが出力される!

 

logs フォルダを本番にアップ
一旦ここで設定したファイルではなくて出力先を上げます。

 

logs フォルダにアクセス制限をかける
セキュリティ面が足りません。そのため、最後にまたやり方に触れますがこの出力ファイル(debug.log)は本番で見られる可能性があります。なのでこの時点で本番の設定で IISや .htaccess で logs フォルダにアクセス制限をかけましょう。

 

設定したファイルも本番にアップする
これでテストの準備ができました。

筆者
筆者

正直かなりアクセス制限などの作業に手間がかかってしまうので、ログ出ししてすぐにローカルに控えがとれたら削除したい気持ちもありますが人間の「○○し忘れ」が漏洩の原因ではあるのでセキュリティ面ではご自身でご判断よろしくお願いいたします。

 

 

② テストをしてエラーを確認 🔍

エラーになるメール送信フォームからメールを送ってみる。
この作業でエラーが出るのはわかっていますが、ここで送信ボタン > エラー画面の再確認。送信作業でエラーログが出力されます。

筆者
筆者

もし、出力先を設定せずに $mailer->SMTPDebug = 0; だけを設定変更していたら、この際にみんなが見える画面で漏洩してはいけない情報が表示されてしまいます。

 

logs / debug.log を確認する
詳細ログが出力されているはずなので中身を見てみましょう。例ですが以下のように詳細が掲載されていればここから原因がわかるはずです。

【SMTP エラー: 認証できませんでした。】
SMTP Error: Could not authenticate.
【サーバー -> クライアント:535-5.7.8 ユーザー名とパスワードが受け入れられません。】
SERVER -> CLIENT: 535-5.7.8 Username and Password not accepted.
筆者
筆者

エラーと書いてあるところを読み、2つ目の例のような場所には テスターコードやGoogle独特の補足などが書かれているかもしれません。しっかり読みましょう。これでエラー原因が確認できました。今回筆者はGoogle のSMTP認証エラー でした。

 

原因がわかれば設定もとに戻しておく
そのままだと出力され続けてしまうので戻しておきましょう。

【ログを出さない設定とコメントアウト】
$mailer->SMTPDebug = 0; // debugging: 1 = errors and messages, 2 = messages only 本番では0、トラブル時のみ2に変更。
// デバッグログを出力する場合は、下の行のコメントアウトを外し、このファイルと同じ階層に logs/ フォルダを作成すること。
// $logPath = __DIR__ . "/logs/debug.log";
// $mailer->Debugoutput = function($str, $level) use ($logPath) {
//     file_put_contents($logPath, $str . "\n", FILE_APPEND);
// };
筆者
筆者

IIS設定はログを残している人は特にそのままでもいいかなと思います。アクセス制限解除をしたら見られる可能危険な状態に逆戻りです。筆者は上記のように次回もログ出力時には logs フォルダが必要なのを忘れないようメモと、下から3行をコメントアウトしました。使用時はコード部分だけコメントアウト外して使います。

 

 

 

詳しい原因追及:エラーからわかった原因

①「SMTP認証が拒否された」のが原因

Gmail(Google Workspace)に対して、ログインパスワードでSMTPログインを試みたが拒否された。
「App Passwordを使わずにSMTP認証を試みた場合に出る典型的なエラー」がログに出力されていました。

 

Gmailのパスワードに関する背景と拒否理由

2022年5月30日から、Gmailは「通常のパスワードでのSMTP認証」を原則禁止しました。

2022年5月29日までは通常のパスワードでSMTP認証OKでした。しかし、2022年5月30日からは「安全性の低いアプリ(LSA)」によるアクセスが完全停止されました。禁止されてからも機能していたものもあったようですが、現在ではこの件でエラーがでるフォームに関しての相談が多いようです。ご存じない方からすると何も変えてないのに急にメールが送れないようになってしまう事態に陥るということだと思います。

 

 

③今回の原因に対する 「対策・対応」 は?

その後のGoogleの対応策が「アプリパスワード」

・2段階認証を有効にした状態のみで発行できる
・1つの用途(アプリ)に対して1つの限定的なパスワードを北郊
・万が一漏れても、そのパスワードだけ無効化すれば被害が広がらない

現在は上記のように安全性を考えられ、使い捨てたり、切り離しができるパスワードを発行する形式にかわっています。

 

PHPmailer × Gmail での送信エラーは一度パスワード確認を!
もし、サイトのお問い合わせフォームなどが Gmail を使用している場合はエラーを確認せずとも、メールの受け口になっているアカウントのGoogle設定が2段階認証設定になっており、アプリパスワードが発行されているか確認してみるも早くていいかもしれません。

筆者
筆者

原因がSMTP認証の拒否によるものだと分かり、対応がアプリパスワードの発行とアプリパスワードの設定だと分かりました。では、ここからその方法を見ていきましょう👍

 

 

 

エラー解決方法:Googleのアプリパスワード

アプリパスワードを発行してログインパスワードと入れ替えることで解決することがわかりました。ではやっていきましょう!

 

① アプリパスワードの発行ができる状態か確認(2 段階認証設定)

2 段階認証が有効になっていれは発行可。確認のため設定ページへ。
 ⇒ 対象のGoogleアカウントへログイン > アカウントアイコンをクリック Google アカウントの管理

 

2 段階認証設定画面へ移動
 ⇒ セキュリティ > 2 段階認証プロセス

筆者
筆者

「2 段階認証プロセス」という項目がない場合、このアカウントの管理者がその設定を許可していない場合があります。組織に所属しているとGoogleがビジネス仕様になっていて、個々のアカウントが管理されている場合があります。その際は管理者へお願いするしかありません。

 

2 段階認証を有効にする
 ⇒ 2 段階プロセスを有効にする

筆者
筆者

写真では「無効にする」になっていますが有効状態からです。「無効→有効」の場合は「有効にする」という表示になっています。すでに写真の状態であれば有効なので、そのままでOKです◎これてアプリパスワードが使用できるようになりました。

 

 

② アプリパスワードを発行

アプリパスワード作成画面へ
 ⇒ 先ほどの画面をそのまま下へスクロール > アプリ パスワード

筆者
筆者

なければページを入りなおしたり、更新してください。

アプリ パスワードを作成
 ⇒ アプリ名を入力 > 作成

筆者
筆者

これから発行するアプリ パスワードに名前を付けます。管理するためです。パスワード自体をここに表示して管理できないからです。これから発行する 16 桁のパスはこの名前でここで表記されます。削除するときにどこのパスワードかわかりやすい名前などがいいかなと筆者は考えてます。

 

生成されたアプリ パスワード
 ⇒ アプリ パスワード をコピー > 完了

筆者
筆者

これで発行完了しました。作成したアプリ パスワードはこの画面を閉じれば2度と確認できません。使いすてパスワードということです。

 

 

③ アプリ パスワード を設置

  パスワードを書きかえる
メール送信するPHPファイル(send.php や form.php)にあったもともとログインパスを設定していたところに設定しましょう。文字間の空白はなくして設定しす。

$smtp_password = “xxxxxxxxxxxxxxxx”; // 16桁のアプリパスワード
筆者
筆者

この場所が設定場所ですが注意点があります。セキュリティー面からパスワードを直接書かくのは望ましくありません。別ファイルに書いてそこから読み取りアクセス制限をかけるようにすることなど、セキュリティー面の強化も考えていきましょう。

 

 

設置したらメールを送れるか確認
状態が完全したか最終確認も忘れずに行いましょう。送信できたら完了です。

 

 

 

お疲れさまでした!
問い合わせフォームのエラーの解消が完了しました✨

 

 

 

その他

IISでのアクセス制限について

(現在、別記事で方法を記載するため作成中。。。)

 

 

アプリパスワードの命名について
Gmailのアプリパスワードの命名(名前)は完全に自分で決めてOKですが、後で見返したときに「何に使ったかすぐわかる」ようにしておくのがポイントです。

 

✅ 命名の目的
Google アカウントの「セキュリティ」>「アプリパスワード」の画面で、発行したアプリパスワード一覧が表示されるので:

「どのサービスで使ってるか?」
「いつ、何のために発行したか?」

が分かるようにしておくと、不要なパスワードを削除するときも安心です。

 

✅ 実用的な命名ルールの例

名前の付け方 コメント
用途+場所 Mailer_contact_form Webフォーム用とすぐ分かる
プロジェクト名+機能 Sample_予約フォーム 複数プロジェクトがある人向け
ドメイン名+処理名 sample-site.com_send どのサイトかすぐ分かる
日付つき ContactForm_20240504 使い捨て用途/履歴を残したい場合

 

 

 

 

 

筆者
筆者

こうしたシステム関連や「ゆるくIT関連」の記事も更新していきますので、ブックマークやお気に入りにしておいてくださいね。♡もクリックしてもらえると励みになります☺

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