🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SMTP

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

PHP

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

Q&A

解決済

1回答

4798閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

SMTP

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

PHP

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

0グッド

1クリップ

投稿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

1送信前 2debug level 3; message: Connection: opening to ssl://smtp.gmail.com:465, timeout=300, options=array() 3debug level 3; message: Connection: opened 4debug level 2; message: SERVER -> CLIENT: 220 smtp.gmail.com ESMTP t18sm6074337pfl.138 - gsmtp 5debug level 1; message: CLIENT -> SERVER: EHLO exsample.com 6debug 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 7 8Fatal 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

1<?php 2use PHPMailer\PHPMailer\PHPMailer; 3use PHPMailer\PHPMailer\SMTP; 4use PHPMailer\PHPMailer\Exception; 5use PHPMailer\PHPMailer\OAuth; 6 7// Alias the League Google OAuth2 provider class 8use League\OAuth2\Client\Provider\Google;// ### 追加 ### 9 10require(dirname(__FILE__). '/PHPMailer/vendor/autoload.php'); 11 12//mbstring の日本語設定 13mb_language("$MAILLANGUAGE"); 14mb_internal_encoding("UTF-8"); 15date_default_timezone_set("$TIMEZONE"); 16 17try { 18$sql = "SELECT * FROM q"; 19$stmt = $pdo1 -> query($sql); 20$result = $stmt->fetchall(); 21foreach($result as $row){ 22 23// インスタンスを生成 24$mail = new PHPMailer(true); 25 26$mail->CharSet = "UTF-8"; 27 28//サーバの設定 29$mail->SMTPDebug = 3; 30$mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str<br>";}; 31$mail->isSMTP(); 32$mail->Host = 'smtp.gmail.com'; 33$mail->SMTPAuth = true; 34$mail->AuthType = 'XOAUTH2'; 35$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; 36$mail->Port = 465; 37 38// ### OAUTH2 の設定 ### 39$google_email = $row['From']; 40$clientId = $row['Gid'];// 41$clientSecret = $row['Gsecret']; 42$refreshToken = $row['Gtoken']; 43 44$provider = new Google( 45[ 46'clientId' => $clientId, 47'clientSecret' => $clientSecret, 48] 49); 50 51$mail->setOAuth( 52new OAuth( 53[ 54'provider' => $provider, 55'clientId' => $clientId, 56'clientSecret' => $clientSecret, 57'refreshToken' => $refreshToken, 58'userName' => $google_email, 59] 60) 61); 62// ### OAUTH2 の設定 ここまで ### 63 64//差出人アドレス(Gmail のアドレス), 差出人名 65$mail->setFrom($google_email, mb_encode_mimeheader($TITLE)); 66$mail->addAddress($row['To'], mb_encode_mimeheader("")); 67$mail->addReplyTo($ReplyToEMAIL, mb_encode_mimeheader("")); 68 69//コンテンツ設定 70$mail->isHTML(false); // HTML形式を指定 71$mail->Subject = mb_encode_mimeheader($row['Title']); 72$mail->Body = mb_convert_encoding($row['Body'],"UTF-8","UTF-8"); 73 74echo "送信前"; 75 76$mail->send(); //送信 77 78echo "送信後"; 79 80//キューを消す 81$sql = "DELETE FROM q WHERE Id=?"; 82$stmt = $pdo1->prepare($sql); 83$array = array($row['Id']); 84$stmt -> execute($array); 85} 86}catch (Exception $e) { 87echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; 88} 89?>

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/01/15 02:22

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

2021/01/15 02:27

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

退会済みユーザー

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の設定等はどうでしょう?
退会済みユーザー

退会済みユーザー

2021/01/15 05:36

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

2021/01/15 05:42

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

退会済みユーザー

2021/01/15 05:48

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

2021/01/15 05:48

PHPのエラーログに何か出力されてませんか?
退会済みユーザー

退会済みユーザー

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);
退会済みユーザー

退会済みユーザー

2021/01/15 06:41

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

退会済みユーザー

2021/01/15 07:29

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

回答1

0

ベストアンサー

原因を特定することができずあきらめることにしました。
ご回答をくださった方々、誠にありがとうございました。
質問時の情報が足りず、ご迷惑おかけいたしました。

回避策として、OAuth2.0は自分の技術を超えていたのであきらめ、
SMTPのIDとPWでの認証方法にしました。
PHPMailerは引き続き使用しています。

難点としては、Google側で「安全性の低いアプリ」を許可しているところでしょうか。

以上になります。

投稿2021/01/21 22:09

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問