Не удалось установить соединение SwiftMailer с хостом smtp.gmail.com (173.194.205.108) [# 0]

Эта проблема встречается не очень часто и возникает, когда вы используете SwiftMailer с учетной записью Gmail для отправки электронных писем (даже если вы используете такую ​​среду, как Laravel, Symfony CakePHP). Некоторые разработчики столкнулись с той же проблемой: код работает, как и ожидалось, локально, на вашей машине разработки, но не на сервере развертывания.

Многие разработчики сталкивались с этой проблемой при отправке электронных писем с помощью Swift Mailer с Gmail, к сожалению, каждое возможное решение может работать не для всех. В этой статье мы расскажем о нескольких возможных решениях, которые могут помочь решить эту проблему в вашем проекте.

1. gethostbyname может быть вашим врагом или союзником

gethostbyname Функция PHP получает IPv4-адрес, соответствующий заданному имени хоста в Интернете. В некоторых случаях эта функция помогла заставить код работать, но для других предоставление адреса smtp в виде строки делает свое дело (мы рекомендуем вам протестировать оба и посмотреть, что произойдет):

setUsername('qweqwe@qweqweqew.com')->setPassword('qweqwe+');
$mailer = \Swift_Mailer::newInstance($transport);
$message = \Swift_Message::newInstance()
->setFrom(array("john@doe.com" => 'John Doe'))
->setTo(array("john@doe.com" => 'John Doe'));
$message->setBody('

Contact message

', 'text/html'); $mailer->send($message);

2. Измените smtp Gmail

Вы можете подключиться к почтовым серверам Gmail, используя SMTP, SSL / TLS. Чтобы сделать это с помощью Swift Mailer, вам необходимо подключиться к smtp.gmail.com на порту 465, однако, если вы получаете упомянутое исключение при попытке отправить электронное письмо, измените SMTP-адрес Gmail вместо smtp.gmail.com используйте любой из следующих IP-адресов или адресов:

  • 173.194.65.108
  • 173.194.205.108
  • 74.125.133.108
  • gmail-smtp-msa.l.google.com

Рекомендуется сделать пинг до smtp.gmail.com адрес терминала в вашем сервере, который должен напечатать IP-адрес SMTP, который вы можете использовать для отправки электронной почты:

SMTP Gmail Ping

Как упоминалось ранее, это может работать в некоторых случаях.

3. Если вы используете Symfony

Если вы работаете в проекте Symfony, ваш код для отправки электронного письма с помощью SwiftMailer, вероятно, будет выглядеть так:

public function indexAction($name)
{
$message = \Swift_Message::newInstance()
->setSubject('Hello Email')
->setFrom('send@example.com')
->setTo('recipient@example.com')
->setBody(
$this->renderView(
// app/Resources/views/Emails/registration.html.twig
'Emails/registration.html.twig',
array('name' => $name)
),
'text/html'
)
/*
* If you also want to include a plaintext version of the message
->addPart(
$this->renderView(
'Emails/registration.txt.twig',
array('name' => $name)
),
'text/plain'
)
*/
;
$this->get('mailer')->send($message);
return $this->render(...);
}

Ваш код не обрабатывает учетные данные напрямую, так как они получены через parameters.yml файл или config.ymlВ любом случае, уловка, которая может помочь вам обойти. Начните с изменения варианта транспорта в вашем parameters.yml (или же config.yml в соответствии с вашим рабочим процессом):

# Swiftmailer Configuration
swiftmailer:
transport: mail

Затем установите тип буфера в память:

# app/config/config.yml
swiftmailer:
# ...
spool: { type: memory }

Или в parameters.yml (в соответствии с вашим рабочим процессом):

# app/config/parameters.yml
parameters:
spool: { type: memory }

Когда вы используете SwiftmailerBundle для отправки электронного письма из приложения Symfony, по умолчанию оно отправляется немедленно. Однако вы можете избежать снижения производительности связи между Swift Mailer и транспортом электронной почты, что может привести к тому, что пользователь будет ждать загрузки следующей страницы во время отправки электронной почты. Этого можно избежать, выбрав «буферизовать» электронные письма, а не отправлять их напрямую. Это означает, что Swift Mailer не пытается отправить электронное письмо, а вместо этого сохраняет сообщение в каком-либо месте, например в файле. Затем другой процесс может читать из буфера и позаботиться об отправке писем в буфере. В настоящее время Swift Mailer поддерживает только буферизацию в файл или память.

Пусть сила будет с вами и счастливого кодирования!

Ссылка на основную публикацию
Adblock
detector