Настройка в Debian отправки почты через PHP

По умолчанию на веб-сервере с Debian не работает отправка почты, хоть из командной строки, хоть из PHP. Чтобы это поправить можно настроить Exim. Сделать это не сложно. В статье все показано, плюс разбираются другие проблемы, из-за которых бывают сложности с доставкой почты.

Устанавливаем пакет и запускаем его настройку:

apt-get install exim4
dpkg-reconfigure exim4-config

При настройке выбираем следующие опции:

После завершения работы мастера настройки, произойдет перезапуск exim4. Пробуйте отправить письмо, теперь должно работать.

Описанные опции предусматривают прямую отправку почты вашим сервером. С этим бывают сложности, т.к. крупые почтовые сервисы не воспринимают всерьез какие-то непонятные неизвестные среверы. Чаще всего именно с таих рассылкатеся СПАМ. Поэтому они жестко фильтруют подобную почту.

Еще обратите внимание, что если вам требуется на сервере не только отправлять почту, но и принимать, то к настройке следует подойти более внимательно. Некоторые настройки по умолчанию могут оказаться не оптимальны. И только этими настройками дело не ограничится. На мой взгляд, если в приеме почты именно вашим сервером нет особой необходимости, то лучше отдать эту задачу сервису «почта для домена» от Yandex.

Если не все письма доходят

Бывает, что письма отправляются не на все ящики. Например, на ящики yandex.ru и gmail.com письма доходят, а на ящик mail.ru – нет. Ошибка при отправке писем может иметь вид:

550 Your HELO string is incorrect

Вероятная причина – не указана обратная зона (reverse dns) для IP-адреса вашего сервера.

Проверить из Windows можно командой:

ping -a 46.4.209.100
 
Обмен пакетами с static.100.209.4.46.clients.your-server.de [46.4.209.100] с 32 байтами данных:
Ответ от 46.4.209.100: число байт=32 время=96мс TTL=48
Ответ от 46.4.209.100: число байт=32 время=101мс TTL=48
Ответ от 46.4.209.100: число байт=32 время=82мс TTL=48
Ответ от 46.4.209.100: число байт=32 время=82мс TTL=48
 
Статистика Ping для 46.4.209.100:
    Пакетов: отправлено = 4, получено = 4, потеряно = 0
    (0% потерь)
Приблизительное время приема-передачи в мс:
    Минимальное = 82 мсек, Максимальное = 101 мсек, Среднее = 90 мсек

В Linux проверку можно выполнить командой:

dig -x 82.165.106.7

; <<>> DiG 9.16.1-Ubuntu <<>> -x 82.165.106.7
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13931
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;7.106.165.82.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
7.106.165.82.in-addr.arpa. 86400 IN	PTR	d1mon.com.

;; Query time: 75 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Пт мая 21 08:07:59 +05 2021
;; MSG SIZE  rcvd: 81

В приведенном для Windows примере видно, что обмен данными происходит с сервером, именуемым:

static.100.209.4.46.clients.your-server.de

Это плохо. Подобные длинные и «кривые» имена (обратные зоны) даются по умолчанию. Вам нужно, чтобы в ответ сервер выдавал короткое и красивое имя. Это может быть домен вашего сайта, который работает на сервере. Например d1mon.com, как в примере для Linux. Если на сервере размещено несколько сайтов с разными доменами, то можно использовать любой из них, какой вам больше нравится.

Часто изменить обратную зону (reverse dns) можно в панели управления хостинга, но иногда такой настройки не предоставляется, тогда нужно обратиться в службу поддержки, попросив для определенного IP-адреса указать определенную обратную зону.

Кроме обратной зоны надо проверить настройки в файлах /etc/hostname и /etc/hosts. В первом должно быть имя хоста, например d1mon. Вручную менять его в этом файле обычно не надо. Это имя чаще прописывается в панели управления хостинга. После изменений и перезапуска сервера имя хоста прописывается в файл автоматически.

Если обратная зона d1mon.com, а имя хоста d1mon, то во втором файле /etc/hosts должна быть строчка:

127.0.0.1 d1mon.com d1mon

Правильный обратный адрес в письмах

Обычно письма, отправляемые скриптами сайта имеют не совсем подходящий обратный адрес. Что-нибудь типа admin@your-host.ru или root@your-host.ru, в зависимости от ваших настроек. Для разного рода автоматизированных уведомлений с сайта принято использовать адрес no-reply@your-host.ru. Прописать нужный обратный адрес можно в файле /etc/email-addresses. Следует добавить строчку:

www-data: no-reply@your-host.ru

Здесь www-data – это пользователь сервера под которым выполняются скрипты вашего сайта.

Желательно чтобы тот адрес, который вы прописываете и используете для оправок писем существовал. Некоторые почтовые службы отказываются принимать письма с адресов, которых не существует.

1 комментарий

Вл
Спасибо огромное! Переехал со старой centOS на Debian 9 и все формы на сайте отвалились. Ждать ответа техподдержки времени не было, да они бы и сказали скорее всего, что у меня VPS без панели, мол, разбирайся сам или плати за настройку.