it-roy-ru.com

Использование phift's swiftmailer с gmail

Я пишу простой сценарий, в котором учетная запись 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('[email protected]')
      ->setPassword('softrain1234')
    ;
*/

    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587)
      ->setUsername('[email protected]')
      ->setPassword('password')
    ;

    echo 'line 40 <br />';
    $mailer = Swift_Mailer::newInstance($transport);
    $message = Swift_Message::newInstance('Wonderful Subject')
      ->setFrom(array('[email protected]' => 'Evaluaciones'))
      ->setTo(array('[email protected]'=> '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>
35
andandandand

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

При использовании 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 работал нормально.

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

85
fullybaked

Я нашел этот вопрос, выполнив поиск в Google, и использовал код в ответе, предоставленном полностью испеченным. Это привело меня к тому, что в исключениях я увидел, что сервер 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 и войдите в систему, затем откройте еще одну вкладку в тот же браузер andgo по этому адресу:
https://accounts.google.com/DisplayUnlockCaptcha

According to Google you may have to enter a captcha.

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

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

35
Gene

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

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername('[email protected]')
  ->setPassword('password');

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

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

6
Richard

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

3
ducin

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

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

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

3
Brad F Jacobs

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

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

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

У @fulbaked был правильный ответ для аутентификации вашей электронной почты через 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('[email protected]')
->setPassword('password');

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

@gene также верен, вы должны аутентифицировать свое приложение, поэтому следуйте его инструкциям.

Кроме того, чтобы ваша электронная почта не попала в папку со спамом, вам также нужно будет добавить текстовые записи DNS с помощью DKIM (ключи домена).

https://support.google.com/a/answer/174124?hl=ru

SPF-записи

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

и DMARC

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

0
Dan Kinchen