Использование phift's swiftmailer с gmail - PullRequest
36 голосов
/ 13 августа 2010

Я пишу простой скрипт, в котором учетная запись 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>

Ответы [ 6 ]

86 голосов
/ 14 января 2011

Не хочу воскрешать старый пост, но на всякий случай, если другие ищут ответ, и потому что этот пост появился во время моего поиска решения несмотря на возраст.

При использовании PHP SwiftMailerдля подключения к учетным записям электронной почты Gmail или Служб Google вам необходимо использовать следующие

$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 работал нормально.

Надеюсь, это поможет.

35 голосов
/ 19 апреля 2015

Я нашел этот вопрос, выполнив поиск в Google, и использовал код в ответе, предоставленном полностью выпеченным.Это привело меня к тому, что в исключениях я увидел, что сервер smtp Google отвечает кодом ошибки, указывающим, что пароль и имя пользователя не приняты.После дальнейшего расследования я обнаружил следующие шаги.Теперь он отлично работает, и я могу продолжать уточнять код для производства.

Не уверен, когда Google внес изменение, но в дополнение к настройке вашего кода с вашим именем пользователя, паролем и портом Google (465 / ssl или587 / tls), чтобы использовать smtp-сервер Google, вам необходимо выполнить следующие шаги.

Чтобы использовать smtp-сервер gmail с вашей учетной записью gmail, вам необходимо:

1)В Google «Настройки учетной записи» включите «Доступ для менее защищенных приложений», установив для него значение «Разрешить».

2) В настройках Gmail на вкладке «Пересылка и POP / IMAP» проверьте состояние IMAP, онодолжен быть включен.(Это позволит сохранить отправленные сообщения электронной почты в отправленной папке.)

3) Если после шагов 1 и 2 вы по-прежнему выбрасываете исключение, SMTP-сервер Google не принимает имя пользователя и пароль, которые необходимо открыть.в браузере, перейдите в gmail и войдите в систему, затем откройте еще одну вкладку в том же браузере и перейдите по этому адресу:
https://accounts.google.com/DisplayUnlockCaptcha

According to Google you may have to enter a captcha.

4) Немедленно отправьте письмо с кодом, так как это будетразрешите ему авторизоваться для использования вашей учетной записи Gmail.

Надеюсь, это поможет.

6 голосов
/ 15 февраля 2012

Я обнаружил, что то, что сказал Эвад, было правдой, но мне пришлось немного изменить его работу для текущей версии Swift Mailer.Теперь это:

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername('username@gmail.com')
  ->setPassword('password');

$mailer = Swift_Mailer::newInstance($transporter);

Должно работать нормально.

3 голосов
/ 23 сентября 2012

465 - это порт для SSL, 587 используется для шифрования TLS (см. http://swiftmailer.org/docs/sending.html#encrypted-smtp)

3 голосов
/ 13 августа 2010

В системе GMail SMTP есть проблемы, связанные с SSL и портами. Мне трудно заставить его хорошо работать с PHP.

Лучшее, что я нашел, это работает phpGMailer . Возможно, вы сможете просмотреть этот код, чтобы увидеть, как они заставили его работать, но это всегда работало без нареканий.

Я знаю, что это не решает проблему SwiftMail, просто решил, что я укажу на это:)

1 голос
/ 08 декабря 2017

Я также пришел сюда после нескольких часов исследований. Я наконец нашел верный ответ. Я хотел отправлять электронную почту с почтовых серверов Google, а не с моего хоста с аутентификацией SMTP.

Вы можете отследить письмо с его полными заголовками внутри gmail, следуйте этому руководству.

https://support.google.com/mail/answer/29436?hl=en

У @ fullbaked был правильный ответ для аутентификации вашей электронной почты через 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 records

https://support.google.com/a/answer/33786?hl=en

и DMARC

https://support.google.com/a/answer/2466580?hl=en

...