Использование gmail smtp через Laravel: невозможно установить соединение с узлом smtp.gmail.com [Время ожидания подключения 110]

Когда я пытаюсь использовать SMTP GMail для отправки электронной почты через Laravel, я сталкиваюсь со следующей ошибкой:

Swift_TransportException

Connection could not be established with host smtp.gmail.com [Connection timed out #110]

Это трассировка ошибки:

...
 }
$this->_stream = @stream_socket_client($host.':'.$this->_params['port'], $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, stream_context_create($options));
if (false === $this->_stream) {
throw new Swift_TransportException(
'Connection could not be established with host ' . $this->_params['host'] .
' [' . $errstr . ' #' . $errno . ']'...

и вот моя конфигурация для почты:

'driver' => 'smtp',

'host' => 'smtp.gmail.com',

'port' => 587,

'from' => array('address' => '[email protected]', 'name' => 'some'),

'encryption' => 'tls',

'username' => '[email protected]',

'password' => 'mypassword',

'sendmail' => '/usr/sbin/sendmail -bs',

'pretend' => false

Я использую общий хост, и порт 587 на локальном хосте открыт.

Ответ 1

У меня была та же проблема, и я решил это следующим образом:

'driver' => 'sendmail',

Вам нужно изменить только эту строку.

Ответ 2

После многих исследований я нашел это полезным.

https://www.google.com/settings/security/lesssecureapps.

Откройте приведенную выше ссылку.

Нажмите "Включить". И спаси его.

Затем попробуйте отправить электронное письмо еще раз.

Для меня это сработало.

Ответ 3

Работает для меня с теми же настройками, кроме шифрования и порта. Изменить на:

'encryption' => ssl,
'port' => 465,

Так как это только для линии шифрования localhost, также должно быть специфично для среды. Поэтому вместо этого я сделал следующее:

env('MAIL_ENCRYPTION','tls'),

Теперь вы можете установить это в .env файле, который является специфичным для среды и должен находиться в .gitignore

Ответ 4

У меня возникла такая же проблема с использованием laravel forge + digitalocean.

Я нахожу, когда пытаюсь telnet smtp.gmail.com 465

telnet smtp.gmail.com 465
Trying 2404:6800:4003:c00::6d...  # more than 30 sec
Trying 74.125.200.108...          # less 1 sec
Connected to smtp.gmail.com.

Может быть, IPv6, что соединение завершено.

Итак, я меняю gai.conf на приоритет ipv4 над ipv6

vi /etc/gai.conf

#For sites which prefer IPv4 connections change the last line to
precedence ::ffff:0:0/96 100
...
#    For sites which use site-local IPv4 addresses behind NAT there is
#    the problem that even if IPv4 addresses are preferred they do not
#    have the same scope and are therefore not sorted first.  To change
#    this use only these rules:
#
scopev4 ::ffff:169.254.0.0/112  2
scopev4 ::ffff:127.0.0.0/104    2
scopev4 ::ffff:0.0.0.0/96       14

Ответ 5

Проблема заключается в том, что smtp.gmail.com разрешает IPv6-адрес и что служба google только прослушивает IPv4. Что вам нужно сделать, это установить IP-адрес источника, чтобы обеспечить разрешение доменов как IPv4, а не IPv6.

Важный метод:

    ->setSourceIp('0.0.0.0')

Как вы можете использовать его в коде:

   $this->_transport = Swift_SmtpTransport::newInstance
        (
            'smtp.gmail.com',
            465,
            'ssl'
        )
            ->setUsername('username')
            ->setSourceIp('0.0.0.0')
            ->setPassword('password');

Ответ 6

Решил шахту, изменив мой файл .env следующим образом:

'driver' => 'sendmail',

Ответ 7

Попробуйте

'encryption' => 'ssl',

'port' => 465,

Ответ 8

Если это учетная запись, отличная от Google Apps, обязательно включите доступ из менее безопасных приложений, как было предложено. Если вы этого не сделаете, это не сработает.

Если это учетная запись Google Apps (т.е. это бизнес-учетная запись), тогда есть панель администратора, которая управляет доступом. Вам нужно будет убедиться, что он указывает только доступ по аутентификации, а не по IP, поскольку, если это по IP, ваш IP предположительно отсутствует в списке.

Последнее, что нужно попробовать, - это использовать IPv4-адрес smtp.gmail.com вместо этого имени домена в вашем коде. Я обнаружил, что моя не будет подключаться с использованием домена (потому что это разрешено для IPv6-адреса), но будет подключаться, когда я использовал исходный IP-адрес на своем месте.

Ответ 9

Ошибка может быть вызвана включением двухэтапной аутентификации. В этом случае вам необходимо создать пароль для приложения gmail и использовать его как пароль.

Ответ 10

У меня такая же проблема с использованием Swiftmailer

В любом случае, быстрый грязный хак, который вы не должны использовать, - это редактировать swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php. В строке _establishSocketConnection() 253 замените:

$options = array();

с чем-то вроде этого:

$options = array('ssl' => array('allow_self_signed' => true, 'verify_peer' => false));

Это изменит параметры ssl для stream_context_create() (несколько строк ниже $options):

$this->_stream = @stream_socket_client($host.':'.$this->_params['port'], $errno, 
$errstr, $timeout, STREAM_CLIENT_CONNECT, stream_context_create($options));

Существует грязный взлом для этого Вы можете найти его здесь

Также мой ENV установлен на

MAIL_DRIVER=smtp
MAIL_HOST=mail.mydomain.com
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=mypassword

Ответ 11

В терминале используйте эту команду

sudo ufw разрешить в "Postfix Submission" этот порт разрешения 587 для SMTP

Ответ 12

вам нужно создать 2-фактовый аутентификационный и пользовательский пароль в учетной записи google. Также не забудьте добавить пользовательский пароль для каждого нового хоста, который вы используете.