PHP编译器oauth2-需要专家

PHP编译器oauth2-需要专家,php,oauth,phpmailer,Php,Oauth,Phpmailer,我正在试着用phpmailer6。我想连接身份验证令牌,而无需在phpmailer内协商刷新令牌。我将自己处理错误,并在必要时请求过期令牌。这是我的密码 use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('PHPMailer/src/PHPMailer.php'); require_once('PHPMailer/src/SMTP.php'); require_once('P

我正在试着用phpmailer6。我想连接身份验证令牌,而无需在phpmailer内协商刷新令牌。我将自己处理错误,并在必要时请求过期令牌。这是我的密码

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;   
require_once('PHPMailer/src/PHPMailer.php');
require_once('PHPMailer/src/SMTP.php');
require_once('PHPMailer/src/Exception.php');

    $FROM_EMAIL = 'xxxxxxxxx@gmail.com';
    $FROM_NAME  = 'name';
    $SMTP_HOST = 'smtp.gmail.com';
    $SMTP_ENCRYPTION = 'ssl';
    $SMTP_PORT = '465'; 
$TOKEN = "ya29.Il-8B-B3c7F-TdeiLV4RfK4RD_zchewnOerrZPdH8D3wJmVZwrwOQr8Wrx7R0IJsoTS5Lg5OIcX424suheD_RI6cZ-qvV6SCtGV_2trVM7xg1PaVXqMWouRavv2HnHyCcA";

try {  
$mail = new PHPMailer(true);      
$mail->AuthType = 'XOAUTH2';
$mail->SMTPDebug = 4;   
$mail->isSMTP();            
$mail->Host = $SMTP_HOST; 
$mail->SMTPAuth = true;         
$mail->SMTPSecure = $SMTP_ENCRYPTION;   
$mail->Port = $SMTP_PORT;   
$tokenbase46 = base64_encode(
            'user=' .
            $FROM_EMAIL .
            "\001auth=Bearer " .
            $TOKEN .
            "\001\001"  );  

$mail->addCustomHeader('Authorization', $tokenbase46 ); 
$mail->smtpConnect();

}
catch (Exception $e) {
  $err = $e->errorMessage(); 
}
错误

2020-01-30 20:00:48 Connection: opening to ssl://smtp.gmail.com:465, timeout=300, options=array()
2020-01-30 20:00:48 Connection: opened
2020-01-30 20:00:48 SMTP INBOUND: "220 smtp.gmail.com ESMTP x14sm7412178wmj.42 - gsmtp"
2020-01-30 20:00:48 SERVER -> CLIENT: 220 smtp.gmail.com ESMTP x14sm7412178wmj.42 - gsmtp
2020-01-30 20:00:48 CLIENT -> SERVER: EHLO localhost
2020-01-30 20:00:48 SMTP INBOUND: "250-smtp.gmail.com at your service, [88.16.61.281]"
2020-01-30 20:00:48 SMTP INBOUND: "250-SIZE 35882577"
2020-01-30 20:00:48 SMTP INBOUND: "250-8BITMIME"
2020-01-30 20:00:48 SMTP INBOUND: "250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH"
2020-01-30 20:00:48 SMTP INBOUND: "250-ENHANCEDSTATUSCODES"
2020-01-30 20:00:48 SMTP INBOUND: "250-PIPELINING"
2020-01-30 20:00:48 SMTP INBOUND: "250-CHUNKING"
2020-01-30 20:00:48 SMTP INBOUND: "250 SMTPUTF8"
2020-01-30 20:00:48 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [88.16.61.281]250-SIZE 35882577250-8BITMIME250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
2020-01-30 20:00:48 Auth method requested: XOAUTH2
2020-01-30 20:00:48 Auth methods available on the server: LOGIN,PLAIN,XOAUTH2,PLAIN-CLIENTTOKEN,OAUTHBEARER,XOAUTH
SMTP Error: Could not authenticate.
2020-01-30 20:00:48 CLIENT -> SERVER: QUIT
2020-01-30 20:00:48 SMTP INBOUND: "221 2.0.0 closing connection x14sm7412178wmj.42 - gsmtp"
2020-01-30 20:00:48 SERVER -> CLIENT: 221 2.0.0 closing connection x14sm7412178wmj.42 - gsmtp
2020-01-30 20:00:48 Connection: closed
更新

我更改了Smtp.php

    case 'XOAUTH2': 
    if (null === $OAuth) { 
//return false; 
} 
    $oauth = base64_encode( 'user=' . $FROM_EMAIL . "\001auth=Bearer " . $TOKEN . "\001\001" ); 
结果:已传递身份验证字符串,但出现新错误

2020-01-31 13:37:52 Auth methods available on the server: LOGIN,PLAIN,XOAUTH2,PLAIN-CLIENTTOKEN,OAUTHBEARER,XOAUTH 
2020-01-31 13:37:52 CLIENT -> SERVER: AUTH XOAUTH2 dXNlcj1BXmF1dGg9QmVhcmVyIEFeQV4= 
2020-01-31 13:37:52 SMTP INBOUND: "501 5.5.2 Cannot Decode response a198sm10442370wme.12 - gsmtp"

你肯定是在逆流而上!要让它像那样失败,它必须达到目标。当您没有创建
OAuth
实例时,这并不奇怪-PHPMailer本身没有
oauthToken
属性。你读过吗?有,我有代币。所有这些都取决于使用具有google客户端id和客户端机密的刷新令牌请求访问令牌。我只想使用存储的令牌登录。我迷路了。我想让phpmailer登录成为一个用户,仅此而已:(我明白你的意思,但是身份验证令牌过期了,所以你也需要一个刷新令牌和一个使用它的机制。你不能把它放在消息头中——这不是HTTP。我想办法是注入OAuth类的一个子类,允许你手动存储身份验证令牌,并直接返回它,而不是使用再生函数在使用league软件包时,它是隐含的。作为记录,我发现OAuth也非常混乱…我想我需要更改smtpConnect函数以允许发送OAuth字符串,但是如何更改呢?如果按照我的建议创建OAuth类的子类并将其注入PHPMailer,那么
$OAuth
将不会是
null
,当它随后调用
getOauth64()
方法时,您可以直接返回身份验证令牌(就像您使用
$tokenbase46
所做的那样),而不是要求提供程序生成它。