Я пишу простой скрипт, в котором учетная запись gmail используется для отправки электронной почты самому себе.
Я изменил скрипт из ссылки SwiftMailer, но я не получаю никаких результатов. Что не так?
Изменить: после дальнейшей отладки я обнаружил, что оператор
$result = $mailer->send($message);
приводит к сбою кода (эхо под ним не печатается).
Почему это? Просто вызвать сообщение не отправлено сбой программы? : /
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?php require_once '/var/www/swift/lib/swift_required.php'; echo 'Mail sent <br />'; /* //create the transport $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587); ->setUsername('softrain.evaluaciones@gmail.com') ->setPassword('softrain1234') ; */ $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587) ->setUsername('softrain.evaluaciones@gmail.com') ->setPassword('password') ; echo 'line 40 <br />'; $mailer = Swift_Mailer::newInstance($transport); $message = Swift_Message::newInstance('Wonderful Subject') ->setFrom(array('softrain.evaluaciones@gmail.com' => 'Evaluaciones')) ->setTo(array('softrain.evaluaciones@gmail.com'=> 'A name')) ->setBody('Test Message Body') ; echo 'line 52 <br />'; $result = $mailer->send($message); echo $result; echo 'line 58 <br />'; ?> </body> </html>
Форма испытания:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <title>Test Mail Script</title> </head> <body> <form action="scriptmail.php" method="post"> <input type="submit"/> </table> </form> </body> </html>
Не означает воскресить старый пост, но на всякий случай другие ищут ответ, и потому, что это сообщение появилось во время моего поиска решения, несмотря на возраст.
При использовании PHP SwiftMailer для подключения к учетным записям Gmail или Google Apps вам необходимо использовать следующие
$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl') ->setUsername($this->username) ->setPassword($this->password); $this->mailer = Swift_Mailer::newInstance($transporter);
Это отлично работает для меня. В исходном коде вы используете порт 587, а не 465, и вы не указываете протокол (ssl). Не знаю, имеет ли это значение, но для меня порт 587 не удалось, а 465 работал нормально.
Надеюсь, это поможет.
Я нашел этот вопрос, выполнив поиск в Google, и использовал код в ответе, предоставленном fullbaked. Это дошло до того, что я мог видеть в Исключениях, которые сервер smtp Google отвечал кодом ошибки, указывающим пароль и имя пользователя, которые не были приняты. После дальнейшего расследования я нашел следующие шаги. Теперь он отлично работает, и я могу продолжать использовать код для производства.
Не знаю, когда Google внес изменения, но помимо настройки кода с вашим именем пользователя, паролем и портом Google (465 / ssl или 587 / tls) вам необходимо выполнить следующие шаги, чтобы использовать smtp-сервер Google.
Чтобы использовать SMTP-сервер gmail с учетной записью gmail, вам необходимо:
1) В настройках Google «Настройки учетной записи» включите «Доступ для менее защищенных приложений», установив его «Разрешить».
2) В настройках gmail на вкладке «Пересылка и POP / IMAP» проверьте статус IMAP, его необходимо активировать. (Это позволит отправлять сообщения электронной почты в папку, отправленную).
3) Если после шагов 1 и 2 вы по-прежнему бросаете исключение Google smtp-сервер, он не принимает имя пользователя и пароль, необходимые для открытия браузера, перейдите в gmail и войдите в систему, затем откройте другую вкладку в том же браузере и откройте этот адрес :
https://accounts.google.com/DisplayUnlockCaptcha
According to Google you may have to enter a captcha.
4) Немедленно отправьте электронное письмо с вашего кода, так как это позволит ему получить разрешение на использование вашей учетной записи gmail.
Надеюсь это поможет.
Я обнаружил, что сказанное было правдой, но мне пришлось немного изменить его работу для текущей версии Swift Mailer. Теперь это:
$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl') ->setUsername('username@gmail.com') ->setPassword('password'); $mailer = Swift_Mailer::newInstance($transporter);
Должен работать нормально.
Система SMTP GMail имеет свои проблемы, учитывая SSL и порты. Мне трудно заставить его работать с PHP красиво.
Лучшее, что я нашел, это работа phpGMailer . Вы можете пропустить этот код, чтобы посмотреть, как они его наняли, но это всегда безупречно работало для меня.
Я знаю, что это не касается проблемы SwiftMail, просто я решил указать на это 🙂
465 – это порт для ssl, 587 используется для шифрования tls (см. http://swiftmailer.org/docs/sending.html#encrypted-smtp )
Я также приехал сюда после нескольких часов исследований. Наконец я нашел верный ответ. Я хотел отправить сообщение электронной почты с почтовых серверов Google, а не с моего хоста с аутентификацией smtp.
Вы можете проследить электронное письмо с его полными заголовками внутри gmail, следуйте этому руководству.
https://support.google.com/mail/answer/29436?hl=en
@fullybaked имел правильный ответ для аутентификации вашей электронной почты через smtp, но вы все равно отправляли бы через ваш хост.
$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl') ->setUsername($this->username) ->setPassword($this->password); $this->mailer = Swift_Mailer::newInstance($transporter);
@ducin был прав с разными портами и типами шифрования.
$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
ИЛИ более современное и более безопасное, использование;
$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls')
Если вы хотите отправить напрямую с сервера gmail, вам необходимо установить режим авторизации. Обычная по умолчанию.
$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls') ->setAuthMode('login') ->setUsername('username@gmail.com') ->setPassword('password'); $mailer = Swift_Mailer::newInstance($transporter);
@gene также верна, вам нужно аутентифицировать свое приложение, поэтому следуйте его инструкциям.
Кроме того, чтобы ваша почта не попадала в папку спама, вам также придется добавлять текстовые записи dns с помощью DKIM (ключей домена)
https://support.google.com/a/answer/174124?hl=en
Записи SPF
https://support.google.com/a/answer/33786?hl=en
и DMARC