在已有访问令牌时使用 PHPMailer

问题描述 投票:0回答:2

我已经用谷歌搜索了几天,试图了解是否可以使用 PHPMailer OAUTH2 而不需要提供程序包。我已经有一个访问令牌管理流程,因此我始终可以在发送电子邮件时到达,最好使用有效的、未过期的访问令牌。我发现的所有使用 OAUTH2 的示例都显示了使用其中一个包创建提供程序,然后将其馈送到 mail->setOAuth() 参数。据我所知,这些的主要功能是返回我已经拥有的访问令牌,以及所需的所有其他位(ID、秘密等)。我希望找到有关如何将我的访问令牌输入到流程中的指导。

当我得知我遗漏了一些明显的东西时,我不会感到惊讶 - 所以如果有人能为我指出这一点,我将不胜感激。

oauth-2.0 phpmailer access-token
2个回答
1
投票
“显而易见”的部分是,所有这些机制都是通过提供 PHPMailer 的

OAuthTokenProvider

 接口的实现来工作的,该接口仅包含一个返回包含 base64 编码令牌的字符串的方法,因此这里的解决方案是使您的实现此接口的自己的类,大致如下:

namespace my\App; use PHPMailer\PHPMailer\OAuthTokenProvider; class MyTokenProvider implements OAuthTokenProvider { public function getOauth64() { //Do whatever you have to do to get the token here //See the interface code for the expected token format return 'my token string'; } }
然后将其传递给 PHPMailer 并告诉它使用 XOAUTH2:

$oauthTokenProvider = new \my\App\MyTokenProvider(); $mail->setOAuth($oauthTokenProvider); $mail->AuthType = 'XOAUTH2';
    

0
投票
我测试了这段代码,phpmailer 让它无限循环。

我使用请求多个范围的提供程序,将令牌放入会话中,并使用一个类。

$provider = new TheNetworg\OAuth2\Client\Provider\Azure([ 'clientId' => 'xyz', 'clientSecret' => 'xyz', 'tenantId' => 'xyz', 'redirectUri' => 'http://localhost/myurl', 'scopes' => ['openid profile email offline_access https://outlook.office.com/SMTP.Send'], 'defaultEndPointVersion' => '2.0', 'accessType' => 'offline' ]);
MyTokenProvider 类实现 OAuthTokenProvider{

public function getOauth64(){ return base64_encode( 'user=' . $_SESSION['userEmail']. "\001auth=Bearer " . $_SESSION['token']. "\001\001" ); }
然后

$myOwnOauth = new MyTokenProvider(); $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->SMTPAuth = true; $mail->AuthType = 'XOAUTH2'; $mail->setOAuth($myOwnOauth );
等等

phpmailer 然后不停地循环,微软显示太多请求,几分钟后: SMTP ERROR: AUTH command failed: 535 5.7.3 Authentication unsuccessful 我可以使用带有令牌的图形 api 进行邮件发送,但无法使其与 phpmailer 一起使用。

有什么我错过的吗?

© www.soinside.com 2019 - 2024. All rights reserved.