PHP. PhpMailer как отправить почту по SMTP через gmail.com от Google?Почему ошибка авторизации?

Пробую отправить почту по SMTP через Google Gmail.com используя PhpMailer на языке PHP. Почему то возникает ошибка авторизации. Хотя через Яндекс, Майл и HotMail от Microsoft нормально отправляется.

Использую примерно следующий код

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require "vendor/autoload.php";

$mail = new PHPMailer(true);

try {
  $mail->SMTPDebug = SMTP::DEBUG_SERVER;
  $mail->isSMTP();
  $mail->Host = "smtp.gmail.com";//Сервер SMTP gmail
  $mail->SMTPAuth = true;
  $mail->Username = "gmaillogin@gmail.com";//В документации Google указано что логин это адрес вместе с собакой
  $mail->Password = "password";//Пароль
  $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;//Указываем что TLS
  $mail->Port = 587;
  $mail->setFrom("gmaillogin@gmail.com","От кого отправляю");
  $mail->addAddress("kudaotpravlyau@yandex.ru","");//Кому отправляем письмо
  $mail->isHTML(true);//Письмо в формате HTML
  $mail->Subject = "Тема сообщения";
  $mail->Body = "Содержание сообщения";
  $mail->AltBody = "Альтернативное содержание сообщения";

  $mail->send();
  echo 'Сообщение отправлено';
} catch (Exception $e) {
    echo "Ошибка отправки: {$mail->ErrorInfo}";
}


Согласно информации размещённой на сайте google SMTP должен работать именно так, вот ссылка https://support.google.com/mail/answer/7126229 при этом в Интернете есть посты что необходимо использовать протокол OAuth 2(может быть это не совсем к этому вопросу)

На всякий случай я обновил PHPMailer, код который я привёл выше уже версии скачанной с помощью composer хотя до недавнего времени я пользовался довольно старой библиотекой PHPMailer подключаемой по require_once

Странно что при отладке SMTP сервер Gmail ругается на неверный логин или пароль. Но я несколько раз перепроверил они указаны правильно. Может быть в Gmail нужно где то предварительно включить поддержку отправки по SMTP?

Для тех кто по статье будет настраивать отправку почты на серверах яндекса, майла или microsoft: у майкрософта(live.com и hotmail.com) настройки полностью идентичные. Для майл и яндекс уберите TLS, в хосте добавьве ssl://smtp.далее_адрес_сервера и порт 465 в остальном настройки такие же.

Так же после включения переключателя небезопасных приложений по ссылке https://myaccount.google.com/lesssecureapps ничего не изменилось, по прежнему ошибка авторизации.

Вот лог дебагера PHPMailer:

2020-04-26 20:58:58 SERVER -> CLIENT: 220 smtp.gmail.com ESMTP x21sm8657596ljm.74 - gsmtp
2020-04-26 20:58:58 CLIENT -> SERVER: EHLO [здесь хост сервера]
2020-04-26 20:58:58 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [62.109.23.192]250-SIZE 35882577250-8BITMIME250-STARTTLS250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
2020-04-26 20:58:58 CLIENT -> SERVER: STARTTLS
2020-04-26 20:58:58 SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
2020-04-26 20:58:58 CLIENT -> SERVER: EHLO [здесь хост сервера]
2020-04-26 20:58:58 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [62.109.23.192]250-SIZE 35882577250-8BITMIME250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8
2020-04-26 20:58:58 CLIENT -> SERVER: AUTH LOGIN
2020-04-26 20:58:58 SERVER -> CLIENT: 334 VXNlcm5hbWU6
2020-04-26 20:58:58 CLIENT -> SERVER: [credentials hidden]
2020-04-26 20:58:58 SERVER -> CLIENT: 334 UGFzc3dvcmQ6
2020-04-26 20:58:58 CLIENT -> SERVER: [credentials hidden]
2020-04-26 20:58:59 SERVER -> CLIENT: 535-5.7.8 Username and Password not accepted. Learn more at535 5.7.8 https://support.google.com/mail/?p=BadCredentials x21sm8657596ljm.74 - gsmtp
2020-04-26 20:58:59 SMTP ERROR: Password command failed: 535-5.7.8 Username and Password not accepted. Learn more at535 5.7.8 https://support.google.com/mail/?p=BadCredentials x21sm8657596ljm.74 - gsmtp
SMTP Error: Could not authenticate.
2020-04-26 20:58:59 CLIENT -> SERVER: QUIT
2020-04-26 20:58:59 SERVER -> CLIENT: 221 2.0.0 closing connection x21sm8657596ljm.74 - gsmtp
SMTP Error: Could not authenticate.
Message could not be sent. Mailer Error: SMTP Error: Could not authenticate.
  • Вопрос задан
  • 2888 просмотров
Решения вопроса 1
nikolaevevge
@nikolaevevge Автор вопроса
Сделал следующее, поьзователь wisgest предложил переключить флажок небезопасных приложений по ссылке https://myaccount.google.com/lesssecureapps, он у меня был выключен переключил сразу не помогло.(потом я его кстати назад переставил так что и при выключенном видимо отправляется).

Затем я из кода убрал строку(закомментировал): $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
вместо неё добавил такую $mail->SMTPSecure = 'tls';

Вот окончательный код с использованием которого у меня отправилось:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';
$mail = new PHPMailer(true);

try {
  $mail->SMTPDebug = SMTP::DEBUG_SERVER;
  $mail->isSMTP();
  $mail->Host = 'smtp.gmail.com';
  $mail->SMTPAuth   = true;
  $mail->Username   = 'gmaillogin@gmail.com';
  $mail->Password   = 'password';
  $mail->Port = 587;
  $mail->setFrom("gmaillogin@gmail.com","Имя от кого отправлять");
  $mail->addAddress("komuotpravlyaem@yandex.ru","");//Кому отправляем
//$mail->addReplyTo("kudaotvetit@yandex.ru","Имя кому писать при ответе");
  $mail->SMTPSecure = 'tls';
  $mail->isHTML(true);//HTML формат
  $mail->Subject = "Тема сообщения";
  $mail->Body    = "Содержание сообщения";
  $mail->AltBody = "Альтернативное содержание сообщения";

  $mail->send();
  echo "Сообщение отправлено";
} catch (Exception $e) {
  echo "Ошибка отправки: {$mail->ErrorInfo}";
}


Уже когда всё заработало увидел что оказывается google вот такое уведомление присылал:
5ea5fd45bf5da648691348.jpeg
Так что возможно переключатель небезопасных приложений имел значение, не смотря на то что я его сейчас выключил и без него тоже отправляется. Так же есть предположение что после переключения настройки небезопасных приложений, это изменение применяется не сразу, поэтому есть смысл повторно попробовать к примеру через час после его переключения.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
Антон Цуцанский, нехороший человек
2FA включена?

телнетом проверил? вплоть до отправки, не только авторизации ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы