質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
SMTP

SMTP(Simple Mail Transfer Protocol)はIPネットワークでemailを伝送する為のプロトコルです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

解決済

PHPMailerでSMTP(OAuth2.0)を利用したメール送信ができなくなった

sanechan
sanechan

総合スコア74

SMTP

SMTP(Simple Mail Transfer Protocol)はIPネットワークでemailを伝送する為のプロトコルです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1回答

0評価

1クリップ

1890閲覧

投稿2021/01/15 01:10

編集2021/01/15 06:22

※エラーログを追記しました。
function.phpの「error_reporting(0);」を削除したらエラーログが出ました。

PHPMailerライブラリを利用して、
メールの送信キューをプログラムで組んでいました。
※送信タスクに格納して、バックエンドで1分おきに動作して、送信タスクがあれば送信

突然、メールが送信されなくなりました。
送信されないので、当然ながら受信はされません。

送信されないと判断した理由は、DBを確認すると、
格納されていた送信タスクからレコードが削除されなくなったからです。

そこで、問題の切り分けのため、初歩的ですが...

$mail->send();の前後に、echoで出力しました。
結果はデバッグログにある通り、「送信前」しかありませんでした。

分かったことは、
「送信後」まで到達していないことでした。

昨日までは正常に動作していたのに...

デバックログを確認しても理由が分かりませんでした。
また、 echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";のログもありません。

デバックのログと、PHPMailerのプログラムコードは以下になります。
アドバイス等ありましたら教えて頂けますでしょうか。

何卒よろしくお願い致します。

php

送信前 debug level 3; message: Connection: opening to ssl://smtp.gmail.com:465, timeout=300, options=array() debug level 3; message: Connection: opened debug level 2; message: SERVER -> CLIENT: 220 smtp.gmail.com ESMTP t18sm6074337pfl.138 - gsmtp debug level 1; message: CLIENT -> SERVER: EHLO exsample.com debug level 2; message: SERVER -> CLIENT: 250-smtp.gmail.com at your service, [*.*.*.*] 250-SIZE 35882577 250-8BITMIME 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-CHUNKING 250 SMTPUTF8 Fatal error: Uncaught League\OAuth2\Client\Provider\Exception\IdentityProviderException: invalid_grant in /home/***/***.com/public_html/***/***/PHPMailer/vendor/league/oauth2-google/src/Provider/Google.php:118 Stack trace: #0 /home/***/***.com/public_html/***/***/PHPMailer/vendor/league/oauth2-client/src/Provider/AbstractProvider.php(628): League\OAuth2\Client\Provider\Google->checkResponse(Object(GuzzleHttp\Psr7\Response), Array) #1 /home/***/***.com/public_html/***/***/PHPMailer/vendor/league/oauth2-client/src/Provider/AbstractProvider.php(537): League\OAuth2\Client\Provider\AbstractProvider->getParsedResponse(Object(GuzzleHttp\Psr7\Request)) #2 /home/***/***.com/public_html/***/***/PHPMailer/vendor/phpmailer/phpmailer/src/OAuth.php(115): League\OAuth2\Client\Provider\AbstractProvider->getAccessToken(Object(League\OAuth2\Client\Grant\RefreshToken), Array) #3 /home/***/***.com/public_html/***/***/PHPMailer/vendor/phpmailer/phpmailer/src/OAuth.php(128): PHPMailer\PHPM in /home/***/***.com/public_html/***/***/PHPMailer/vendor/league/oauth2-google/src/Provider/Google.php on line 118

php

<?php 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;// ### 追加 ### require(dirname(__FILE__). '/PHPMailer/vendor/autoload.php'); //mbstring の日本語設定 mb_language("$MAILLANGUAGE"); mb_internal_encoding("UTF-8"); date_default_timezone_set("$TIMEZONE"); try { $sql = "SELECT * FROM q"; $stmt = $pdo1 -> query($sql); $result = $stmt->fetchall(); foreach($result as $row){ // インスタンスを生成 $mail = new PHPMailer(true); $mail->CharSet = "UTF-8"; //サーバの設定 $mail->SMTPDebug = 3; $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str<br>";}; $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->AuthType = 'XOAUTH2'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465; // ### OAUTH2 の設定 ### $google_email = $row['From']; $clientId = $row['Gid'];// $clientSecret = $row['Gsecret']; $refreshToken = $row['Gtoken']; $provider = new Google( [ 'clientId' => $clientId, 'clientSecret' => $clientSecret, ] ); $mail->setOAuth( new OAuth( [ 'provider' => $provider, 'clientId' => $clientId, 'clientSecret' => $clientSecret, 'refreshToken' => $refreshToken, 'userName' => $google_email, ] ) ); // ### OAUTH2 の設定 ここまで ### //差出人アドレス(Gmail のアドレス), 差出人名 $mail->setFrom($google_email, mb_encode_mimeheader($TITLE)); $mail->addAddress($row['To'], mb_encode_mimeheader("")); $mail->addReplyTo($ReplyToEMAIL, mb_encode_mimeheader("")); //コンテンツ設定 $mail->isHTML(false); // HTML形式を指定 $mail->Subject = mb_encode_mimeheader($row['Title']); $mail->Body = mb_convert_encoding($row['Body'],"UTF-8","UTF-8"); echo "送信前"; $mail->send(); //送信 echo "送信後"; //キューを消す $sql = "DELETE FROM q WHERE Id=?"; $stmt = $pdo1->prepare($sql); $array = array($row['Id']); $stmt -> execute($array); } }catch (Exception $e) { echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; } ?>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

退会済みユーザー

退会済みユーザー

2021/01/15 02:22

しらねーよ、てめえで考えろや
Y.H.

2021/01/15 02:27

> 送信ができなくなりました。 送信時にエラーになるのか、エラーにはならないが受信側で受信できていないのか など具体的に記載しないと誰にも回答できないですよ。 gmailでspam判定されるようになったとか?
sanechan

2021/01/15 03:27

ありがとうございます。 ご指摘の通り、送信時のエラーの詳細が必要でした。 書き直すため いったん、こちらの質問は締めるかもしれません。 ありがとうございます。
Y.H.

2021/01/15 03:33

新たに質問せずに編集して情報を追記して下さい。
Y.H.

2021/01/15 05:05

> 送信されないので、当然ながら受信はされません。 送信されない(送信時に何らかの問題が発生している)と判断された根拠は何でしょう? SMTPのステータスはすべて250で返ってきているので(4xx/5xxが返ってきていないので) PHP→google smtpサーバーの送信は正常に動作していると思うのですが。 > debug level 2; message: SERVER -> CLIENT: 250-smtp.gmail.com at your service, [*.*.*.*] 250-SIZE 35882577 250-8BITMIME 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-CHUNKING 250 SMTPUTF8
AbeTakashi

2021/01/15 05:33 編集

迷惑メール扱いになってるとかでは? SPFレコードの設定やDKIMの設定等はどうでしょう?
sanechan

2021/01/15 05:36

Y.Hさんありがとうございます。 >送信されない(送信時に何らかの問題が発生している)と判断された根拠は何でしょう? 追記しましたが、格納されていた送信タスクからレコードが削除されなくなったからです。
Y.H.

2021/01/15 05:42

> echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; このメッセージは表示されてないのでしょうか?
sanechan

2021/01/15 05:48

> echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; >このメッセージは表示されてないのでしょうか? 表示されておりません。 該当のメール送信キューをプログラムを実行すると、 記した、デバックログのみ表示される状況です。
Y.H.

2021/01/15 05:48

PHPのエラーログに何か出力されてませんか?
sanechan

2021/01/15 06:07

>PHPのエラーログに何か出力されてませんか? エックスサーバーのサーバーパネルから「エラーログ」を確認しました。 以下のログはありましたが、これは関係のないログだと思われます。 ファイルを修正しているときのログだと思われます。 「[Fri Jan 15 13:17:46.294237 2021] [proxy_fcgi:error] [pid 41133:tid 140231277307648] [client 147.192.117.188:38678] AH01071: Got error 'PHP message: PHP Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR) in /home/***/***.com/public_html/***/***/q.php on line 87''」
Y.H.

2021/01/15 06:17

以下のようにしてエラーを出力するようにするとコンソールに何かエラーなり警告なり表示されませんか? <?php ini_set('display_errors', 1); ini_set('error_reporting', E_ALL);
sanechan

2021/01/15 06:41

>以下のようにしてエラーを出力するようにするとコンソールに何かエラーなり警告なり表示されませんか? ><?php >ini_set('display_errors', 1); >ini_set('error_reporting', E_ALL); 該当のメール送信キューのプログラムに追加しましたが、エラーログは変わらずでした。 function.phpに設定し忘ていた、 「error_reporting();」を削除したらエラーログがありました。
sanechan

2021/01/15 07:29

Y.H.さん、ありがとうございます。 エラーログは大変失礼しました。 余計なお手数をお掛けいたしました。 アドバイスを参考に明日からまた調べてみます。 解決したら記載いたします。 失礼いたします。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

SMTP

SMTP(Simple Mail Transfer Protocol)はIPネットワークでemailを伝送する為のプロトコルです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。