вторник, 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.

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

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

Gmail: пересылка всех писем, включая спам, на другой ящик.

Многие в своей работе используют несколько gmail-аккаунтов. Постоянное переключение между ящиками создают массу неудобств и на это тратится куча времени. Google пошел на встречу пользователям с несколькими аккаунтами gmail-почты и сделал несколько вариантов аккумулирования почты из нескольких почтовых ящиков ("дочерних") в один "основной" (путем пересылки или сбора почты). К сожалению, в мире еще нет совершенства и многие нужные письма (привет письмам со ссылкой на скачку Денвера) все еще попадают в папку Спам. А логика работы GMail такова, что спам-письма не пересылаются и не "отдаются" при сборке почты через POP.

Далее речь пойдет о "дочернем" ящике, т.е. том, из которого письма пересылаются в основной.

Т.к. "в лоб" обойти спам-фильтр нельзя, то воспользуемся другой мощной функцией - Фильтрами.
Чтобы создать фильтр, нужно немного вникнуть в работу почтовой системы в борьбе со спамом, а там все просто - входящие письма проходят через спам-фильтр на почтовом сервере, где им ставится флаг "спам" или "не спам", на основе этого флага, gmail применяет ярлык "Спам" к письму и мы можем их видеть в почтовом интерфейсе:
К ярлыку "Спам" можно быстро добраться, введя в поиске "is:spam" или "label:spam"

Итак, идём в "Настройки" (нажав значок с шестеренкой, в правом верхнем углу и выбрав соответствующий пункт меню).

Далее выбираем вкладку "Фильтры" и кликаем "Создать новый фильтр".

В поле "Содержит слова" пишем — label:spam
Кликаем ниже ссылку "Создать фильтр в соответствии с этим запросом" (нам выдадут предупреждение — согласимся) и на следующем шаге устанавливаем галочку "Никогда не отправлять в спам". Нажимаем кнопку "Создать фильтр".


Теперь, после создания этого фильтра, весь спам у нас будет попадать во "Входящии", что минус, но при этом абсолютно все письма будут пересылаться на основной ящик, что плюс. Так же, полученные, после пересылки, письма НЕ будут попадать в спам в "основном" ящике.