По умолчанию на веб-сервере с Debian не работает отправка почты, хоть из командной строки, хоть из PHP. Чтобы это поправить можно настроить Exim. Сделать это не сложно. В статье все показано, плюс разбираются другие проблемы, из-за которых бывают сложности с доставкой почты.
Устанавливаем пакет и запускаем его настройку:
apt-get install exim4
dpkg-reconfigure exim4-config
При настройке выбираем следующие опции:
- General type of mail configuration: internet site; mail is sent and received directly using SMTP
- System mail name: обратная зона (Reverse DNS) для IP-адреса сервера, например d1mon.com
- IP-addresses to listen on for incoming SMTP connections: 127.0.0.1
- Other destinations for which mail is accepted: домен, с которого мы планируем отправлять письма с этого сервера (через пробел можно указать несколько доменов).
- Domains to relay mail for: пусто
- Machines to relay mail for: пусто
- Keep number of DNS-queries minimal (Dial-on-Demand): No
- Delivery method for local mail: оставьте по умолчанию
- Split configuration into small files: No
- Root and postmaster mail recipient: пусто
После завершения работы мастера настройки, произойдет перезапуск 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
– это пользователь сервера под которым выполняются скрипты вашего сайта.
Желательно чтобы тот адрес, который вы прописываете и используете для оправок писем существовал. Некоторые почтовые службы отказываются принимать письма с адресов, которых не существует.