2010-08-13 5 views
32

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

Я изменил сценарий из reference SwiftMailer, но я не получаю никаких результатов. Что не так?

Edit: после дальнейшей отладки я обнаружил, что заявление

$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> 
+0

Это может быть полезно: http: // stackoverflow.com/a/12317831/386579 –

+0

полезно для меня: [Symfony - как использовать Gmail для отправки писем] (http://symfony.com/doc/current/email/gmail.html) – Trix

+0

это может быть полезно: https: //stackoverflow.com/a/46864725/4680523 – manish1706

ответ

3

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

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

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

+0

Спасибо, я посмотрю. Тем не менее, я хочу исправить это. – andandandand

82

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

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

Большое спасибо. Теперь он работает ^^ –

+6

Для тех, у кого есть двухэтапная аутентификация, включенная в Goole, вы должны использовать сгенерированный пароль. – singles

+0

ну, я объявил транспортера, но не почтовый. слишком много абстракций для моей маленькой головы :-) +1 в любом случае –

5

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

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

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

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

+7

Хосе это отличается от полностью искушенного решения? –

+1

это то же самое, что указано выше –

+0

Если у кого-то есть адрес электронной почты с учетной записью Google Apps, используя свой зарегистрированный домен, например [email protected]: http://stackoverflow.com/questions/17970096/swiftmailer-send-email- using-gmail-with-custom-domain –

31

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

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

Чтобы использовать сервер SMTP Коллективы Gmail с учетной записью GMAIL вам нужно:

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

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

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

According to Google you may have to enter a captcha. 

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

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

+1

вы рок-звезда! – uchamp

+0

@Gene Уважаемый, я попробовал все это. Все работало на моем локальном хосте, но не на реальном сервере. Я столкнулся с этой ошибкой и не добился успеха, после того, как через 4 часа отыграл и попробовал все. «Не удалось выполнить аутентификацию на SMTP-сервере с именем пользователя« [email protected] »с использованием 2 возможных аутентификаторов» –

+0

Я не обращал особого внимания на шаг 3, но на самом деле решил проблему –

0

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

Смежные вопросы