PHP编译器oauth2-需要专家
我正在试着用phpmailer6。我想连接身份验证令牌,而无需在phpmailer内协商刷新令牌。我将自己处理错误,并在必要时请求过期令牌。这是我的密码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
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
所做的那样),而不是要求提供程序生成它。