我已经用谷歌搜索了几天,试图了解是否可以使用 PHPMailer OAUTH2 而不需要提供程序包。我已经有一个访问令牌管理流程,因此我始终可以在发送电子邮件时到达,最好使用有效的、未过期的访问令牌。我发现的所有使用 OAUTH2 的示例都显示了使用其中一个包创建提供程序,然后将其馈送到 mail->setOAuth() 参数。据我所知,这些的主要功能是返回我已经拥有的访问令牌,以及所需的所有其他位(ID、秘密等)。我希望找到有关如何将我的访问令牌输入到流程中的指导。
当我得知我遗漏了一些明显的东西时,我不会感到惊讶 - 所以如果有人能为我指出这一点,我将不胜感激。
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';
我使用请求多个范围的提供程序,将令牌放入会话中,并使用一个类。
$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 一起使用。
有什么我错过的吗?