Подтвердить что ты не робот

Использование php swiftmailer с gmail

Я пишу простой script, в котором учетная запись gmail используется для отправки электронной почты самому себе.

Я изменил script из 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>
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Чтобы использовать сервер gmail smtp с учетной записью 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.

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 6

Я также пришел сюда после нескольких часов исследований. Наконец я нашел верный ответ. Я хотел отправить сообщение электронной почты с почтовых серверов 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('[email protected]')
->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

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