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

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

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 или Google.

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

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

550 Your HELO string is incorrect

Вероятная причина – не указана обратная зона (reverse dns) для IP-адреса вашего сервера. Проверить из Windows можно командой ping с ключиком:

C:\>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 46.4.209.100

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

Часто изменить обратную зону (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 – это пользователь сервера под которым выполняются скрипты вашего сайта.

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

Из распространенных почтовых служб самая привередливая уже упомянутая mail.ru. Хотя, с другой стороны, они стараются делать все по правилам. Если письмо отправлено с несуществующего адреса или с сомнительного сервера, то зачем его принимать?