Swiftmailer не может пройти аутентификацию в GMail с помощью токена oauth2 - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь использовать 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.

Я использую тот же токен доступа в другом месте с использованием API GMail, поэтому я знаю, что токен действителен.

Чего мне не хватает?

Редактировать

Просто снова запустил код с включенным отладчиком.Похоже, что первый выданный код ошибки - 334 с сообщением:

Expected response code 235 but got code "334", with message "334 eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUiOiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ==

Кодированная часть этого сообщения декодируется в:

{"status":"400","schemes":"Bearer","scope":"https://mail.google.com/"}

1 Ответ

0 голосов
/ 27 июля 2018

Самым большим препятствием, с которым вы можете столкнуться и о котором никто не говорит, является недостаточные разрешения .SwiftMailer не справляется с этой задачей;поэтому вы можете использовать GoogleClient, чтобы убедиться, что ваши учетные данные работают, прежде чем использовать их с SwiftMailer.

Полный исходный код

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