php - Swiftmailer 无法使用 oauth2 令牌对 GMail 进行身份验证
问题描述
我正在尝试使用 SwiftMailer 登录到我拥有有效访问令牌的 GMail 帐户。我可以使用帐户凭据成功登录:
$Transport = new Swift_SmtpTransport('smtp.gmail.com',587,'tls');
$Transport->setAuthMode('login')
->setUsername('my-email-address')
->setPassword('my-password');
$Mailer = new Swift_Mailer($Transport);
// ... make a new message & send it
但是,如果我更改代码以使用我的 oauth2 令牌,如下所示:
$access_token = 'ya29.GLv....';
$Transport = new Swift_SmtpTransport('smtp.gmail.com',587,'tls');
$Transport->setAuthMode('XOAUTH2')
->setUsername('my-email-address')
->setPassword($access_token);
$Mailer = new Swift_Mailer($Transport);
我收到一条错误消息:Swift_TransportException: Expected response code 250 but got code "535".... Username and Password are not accepted.
我在其他地方使用 GMail API 使用相同的访问令牌,所以我知道该令牌是有效的。
我错过了什么?
编辑
只需在打开调试器的情况下再次运行代码。看起来抛出的第一个错误代码是 334 和消息:
Expected response code 235 but got code "334", with message "334 eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUiOiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ==
该消息的编码部分解码为:
{"status":"400","schemes":"Bearer","scope":"https://mail.google.com/"}
解决方案
您可能面临的最大障碍是没有人在谈论的权限不足。SwiftMailer 没有很好地阐述这个问题。因此,在将它们与 SwiftMailer 一起使用之前,您可能需要使用 GoogleClient 来确保您的凭据有效。
# Using SwiftMailer
// Create the Transport
$transport = (new Swift_SmtpTransport('smtp.gmail.com', 587, 'tls'))
->setAuthMode('XOAUTH2')
->setUsername('<SENDER_EMAIL>')
->setPassword('<ACCESS_TOKEN>');
// Create the Mailer using your created Transport
$mailer = new Swift_Mailer($transport);
// Create a message
$message = (new Swift_Message())
->setFrom(['<SENDER_EMAIL>' => '<SENDER_NAME>'])
->setTo(explode(';', '<RECEIVER_EMAIL>'))
->setSubject('<SUBJECT')
->setBody('<MESSGAE_BODY>');
// Send the message
if ($mailer->send($message)) {
print 'Mail sent...';
exit();
}
echo('Mail not sent...');
推荐阅读
- c# - 如何防止重复条目进入列表框
- python - 如何在 VS Code 中添加多个 Python 交互式窗口?
- php - 如何在 laravel Raw 查询中转义单引号
- fullcalendar - 如何在fullcalendar V3中获取后台事件交集?
- css - 如何布局按钮以堆叠在移动设备上?
- python - TypeError: 使用 tf.io.decode_jpeg 导入后,无法使用 plt.imshow 将图像数据转换为浮点数
- javascript - 如何在按下 React-native 中的 Swipout 按钮之一时将值传递到其他屏幕?
- omnet++ - 将 INET 与 OMNETPP 链接
- c++ - 获取以元音和辅音开头的单词数量的程序正在返回错误的答案
- batch-file - 为什么 % 变量不起作用!我的批处理文件中的变量?