Я пытаюсь использовать 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/"}
Самое большое препятствие, с которым вы можете столкнуться, и никто не говорит о том, недостаточные разрешения. 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...');
Других решений пока нет …