Swiftmailer无法使用oauth2令牌

时间:2018-06-04 21:41:01

标签: php smtp gmail swiftmailer smtp-auth

我试图使用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/"}

1 个答案:

答案 0 :(得分:0)

您可能会遇到的最大障碍,没有人在谈论。权限不足。 SwiftMailer在阐述此问题方面做得不好。因此,在与SwiftMailer一起使用之前,您可能希望使用GoogleClient来确保您的凭据有效。

Full source code

# 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...');