вторник, 25 июня 2013 г.

Боремся с ошибкой fsockopen(): unable to connect to ssl://smtp.googlemail.com:465 (PHP-не хочет отправлять почту через GMail)

Пришлось перенести сайт на новый хостинг. После переноса перестала отправляться почта из скриптов. Для отправки использовалась библиотека PHPMailer, а сама почта отправляется через аккаунт Gmail. Начал читать логи и увидел такую ошибку:
PHP Warning:  fsockopen(): unable to connect to ssl://smtp.googlemail.com:465 
 В интернете советуют изменить протокол и вместо SSL указывать TLS и изменить порт на 587, но это ничего не изменило.

Возникла мысль, что каким-то образом блокируется попытка связи с smtp.google.com, проверил соединение из терминала командами:
telnet smtp.gmail.com 465
и
openssl s_client -connect smtp.gmail.com:465
Подключения прошли успешны, значит дело не в блокировках.

А проблема оказалась в том, что в PHP 5.3 имеется баг, который приводит к такой ошибке, если на сервере включена поддержка IPv6. Есть два метода борьбы:

  1. Указать в настройках PHPMailer не домен SMTP-сервера, а его IP-адрес.
  2. Прописать в /etc/hosts соответствие домена IP-адресу.
  3. Отключить IPv6 на сервере.
Я выбрал третий вариант, т.к. первые два могут принести много проблем, если IP-адрес сервера изменится. У меня на сервере стоял Debian 7 (для Debian 6 все аналогично), для него отключение IPv6 довольно просто:
sudo echo net.ipv6.conf.all.disable_ipv6=1 > /etc/sysctl.d/disableipv6.conf
И для надежности перезагрузиться (выполнив: sudo reboot). Если вдруг понадобиться вернуть поддержку IPv6, то нужно просто удалить файл /etc/sysctl.d/disableipv6.conf.

На сегодня всё!

Комментариев нет:

Отправить комментарий