Меню

Debian настройка php sendmail



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

Дмитрий Корнев

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

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

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

  • 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 можно командой:

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

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

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

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

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

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

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

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

Читайте также:  Mekanism настройка цифрового шахтера

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

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

Источник

Debian, exim4. Настраиваем SMTP сервер для нашего веб-сервера

В данной статье я рассмотрю один из самых быстрых способов настройки smtp-демона для нашего вебсервера. Если вам нужен сервер, который ещё и должен принимать почту — проходите мимо. Эта статья подойдёт для тех, кто принимает почту гуглом или яндексом (на своём домене, само собой), но не хочет дергать их SMTP серверы, чтобы слать письма.

Внимание! Этот мануал описывает то, как настроить SMTP сервер (сервер отправки писем), отправить письмо через который можно только с того же сервера (то есть с localhost). При этом не будет требоваться никакой авторизации! Будьте внимательны.

Если необходимо настроить отправку почты с нашего сервера через почту для доменов от Яндекса.

Type Machine handling outgoing mail for this host (smarthost): smtp.yandex.ru:587

прописываем пароль для ящика в файле /etc/exim4/passwd.client:

Если почтовый сервер яндекс ругается, что нужно заполненное поле FROM. Прописываем его в файле /etc/exim4/conf.d/rewrite/00_exim4-config_header:

Теперь вы можете отправлять письма при помощи апача (чуть позже опишу как настроить) или командой вида echo «Testing Exim» | mail -s Test vlad@debian.pro

Ну и да — не стоит спамить 😉
Так же не используйте этот метод для тех случаев, когда доступ к серверу по ssh (или даже по ftp в каталоги, доступные по http) имеют доступ люди, которые могут начать спамить.

Как ограничить список ящиков, которым можно отправлять письма с сервера

Теперь создаём необходимые нам файлы:

В файл /etc/exim4/conf.d/router/01_exim4-outgoing-filter пишем правила, которые будут применяться к исходящей почте:

Если вы всё же выбрали «Split configuration into small files: no», то эти правила нужно вписать сразу после строчки

Это правило позволит отправлять только почту с любых ящиков доменов, которые перечислены в файле /etc/exim4/allowed.domains, или ящиков, перечисленных в файле /etc/exim4/allowed.mails. Обратите внимание на «или» — если домен написан в первом файле, то во втором смысле перечислять его ящики нет смысла. А если вам нужно разрешить отправку только с одного ящика домена — то не нужно писать его в allowed.domains, нужно написать конкретный ящик в allowed.mails

Ящики и домены нужно писать целиком (без регулярок, звездочек и прочего) по одному на строчку:

Проверить можно так:

где noreply@somepieceofshit.com — адрес отправителя, а youremail@adminunix.ru — адрес получателя.

В /var/log/exim4/mainlog в ответ на это вы увидите что-то в духе:

Как работают эти правила. Для начала стоит упомянуть, что у писем есть 2 важных заголовка — smtp.sender и header From:. smtp.sender, по сути, smtp-аккаунт, с которого происходит отправка письма. Поле From может содержать произвольную чушь, в том числе и совершенно левый ящик. Например, можно отправить письмо с smtp-аккаунта blah@someshit.com, но в поле From поставить admin@gmail.com. Чтобы посмотреть, кто реально отправил письмо — нужно будет лезть в его исходники. Большинство почтовых провайдеров при несовпадении этих полей кладёт такое письмо в спам. А спамеры, в свою очередь, шлют тонны писем с несовпадающими заголовками. Кхе.
Собственно, правило check_outgoing_from_header проверяет, чтобы в заголовке From содержалось имя smtp-аккаунта. Тут стоит упомянуть, что заголовок From: в нормальном письме выглядит примерно так — «inkvizitor68sl » (то есть помимо ящика содержит и имя/фамилию отправителя/ник или какую-нибудь другую чушь, которую он соизволит вписать туда). Именно поэтому, полагаться здесь на точное совпадение полей нельзя.

Читайте также:  Fear 3 настройка графики

Второе правило (check_outgoing) проверяет, что значение поля sender (он же — smtp.sender, он же — smtp.name) подходит под одно из трех правил. Первое — sender пустой (сюда входят письма, сгенерированные самим почтовым сервером — например, отлупы о недоставке писем). Второе — sender совпадает с шаблоном *@любойдоменизспискаallowed.domains. Третье — поле sender целиком (пользователь@домен) указано в allowed.mails.

Так же учитывайте, что строчка в конфиге apache2 для вхоста вида:

выставляет значения поля sender в noreply@adminunix.ru (при том обойти это из самих скриптов уже не получится, только через htaccess). Поэтому, если ваша CMS шлет письма от ящика, отличного от указанного в этом месте — письма слать она перестанет.

Само собой, такая защита обходится (достаточно начать рассылать спам от «доверенных» ящиков) — авторизации всё ещё не требуется. Но мы можем в любой момент выключить ящик до того момента, пока не разберемся, что послужило источником спама на сервере.

В файле конфигурации php поправим sendmail_path.

В Debian: /etc/php5/apache2/php.ini или /etc/php4/apache2/php.ini

Правильная настройка SPF

Если кратко, то SPF — это способ борьбы со спамом.

Мы собираемся отправлять почту с сервера, PTR IP которого не равен одной из MX-записей сервера, а так же в большинстве случаев PTR IP не равен самому нашему домену (не всегда хостеры соглашаются менять PTR). В этом случае вероятность попадания писем в спам повышается. Но есть хороший способ ее понизить: указать правильно запись SPF нашего домена.

SPF-запись — это обыкновенная запись доменной зоны, имеющая тип TXT. Узнать текущее ее значение для домена можно с помощью команды host в Linux:

В данном примере SPF-запись не задана. Зададим ее. С моего домена почта может отправляться с серверов Gmail и с моего сервера. Для начала узнаем, какой PTR моего сайта (adminunix.ru):

IP-адрес моего сервера 93.174.6.118. Узнаем PTR:

Видно, что PTR IP, к которому привязан мой домен (IP моего сервера) — server.adminunix.ru.

v=spf1 — версия SPF (первая);
a — разрешение отправлять почту с IP, указанного в A-записи домена (собственно с сервера, на который ваш домен ссылается);
mx — разрешение отправлять почту с IP, указанных в MX-записях домена (в нашем случае сервера Gmail);
ptr — разрешение отправлять почту с IP, PTR-запись которых содержит ваш домен (т.е. сам домен и поддомены);
include:_spf.google.com — подключение разрешений для серверов отправки почту Gmail (совсем не обязательно почта будет слаться с серверов, указанных в MX-записи);

all — нейтральная реакция на всю остальную почту; здесь можно указать -all, что будет значить, что почта, не попадающая под эти правила, — спам.
Если вы хотите отправлять почту с сервера, не попадающего под все эти правила, его можно указать по IP или домену PTR, например:

v=spf1 a mx ptr ptr:example.com include:_spf.google.com

Запись указывается для вашего домена соответствующим образом, который определяет владелец DNS-сервера. Обычно сервером заведует хостер и предоставляет возможность вносить изменения в DNS-зоны через панель хостинга. Либо сам по запросу в саппорт меняет запись. В зональном файле должна появиться запись вида:

adminunix.ru. TXT v=spf1 a mx ptr include:_spf.google.com

После обновления зоны host выдаст следующее:

$ host -t TXT adminunix.ru
adminunix.ru TXT »v=spf1 a mx ptr include:_spf.google.com

После всей этой настройки функция mail () в PHP начнет слать почту через ваш локальный сервер на законных основаниях для антиспам-ботов. Но косяк будет в том, что в поле отправителя будет фигурировать адрес системного пользователя www-data@localdomain. Нас это не устраивает. Чтобы почта правильно слалась из mail (), необходимо использовать ее дополнительный параметр.

Читайте также:  Lg lb650v настройка изображения

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

Именно $additional_parameters нас и интерисует. В него надо передавать реального отправителя:

mail ($to, $subject, $message, $additional_headers, $additional_parameters.» -frealsender@adminunix.ru»);

Указывается отправитель слитно с параметром -f.

Теперь отправленные через mail () письма будут абсолютно адекватны (при условии, что вы указываете все нужные SMTP-заголовки, вроде “FROM:”, “TO:” и т.д.).

А если несколько сайтов с разными IP (настройка Exim для отправки писем с разных IP)?

Мы хотим использовать локальный SMTP-сервер для отправки почты со всех сайтов на сервере. Никаких проблем нет, если настроен Exim правильно (см. выше). Но проблема появляется, если разные сайты работают на разных IP. Мы не хотим в почте «палить» то, что все наши сайты живут на одном сервере. Но Exim по умолчанию шлет всю почту с основного (первого) IP сетевого интерфейса, а этот IP всем получателям в SMTP-заголовках “Received:” письма. Кроме того, там указывается и имя сервера, которые мы в случае с разными сайтами на сервере выбрали нейтральными.

Чтобы не «палить» IP сервера, нужно отсылать письмо на удаленный сервер с IP, равного A-записи домена сайта. Делается это несложно путем изменения конфига Exim. Внесем изменения в настройки транспорта SMTP Exim. Если вы выбрали монолитный конфиг, то нужно отредактировать файл:

local_interfaces = a.a.a.a : b.b.b.b : c.c.c.c : d.d.d.d
smtp_active_hostname = $lsearch<$value>>
smtp_banner = «$smtp_active_hostname ESMTP $tod_full»

Находим в файле строку “remote_smtp:” (поиск в nano — F6). Добавляем в конец этого блока:

Это значит, что при отправке письма нужно определить домен отправителя почты (для sender@adminunix.ru это adminunix.ru) и отправить почту с IP, к которому этот домен привязан. Само собой разумеется, что домен должен быть привязан к серверу, где установлен Exim.

Так же нужно создать файл в любом месте файл привязки доменов к IP (у домена может быть несколько IP, так что просто lookup-ить его не прокатит). Я выбрал для файла место: /etc/exim4/domain2ip

Туда вводим наши домены по шаблону:

adminunix.ru: 123.123.123.123
vasya.ws: 123.123.123.124

Не забудьте дописать домен в файл в случае появления нового сайта.
Кстати, строку helo_data = «$sender_address_domain» можно добавить в файл даже если у вас один IP на все сайты. Тогда в команде HELLO SMTP-протокола (а, следовательно, и в заголовках писем) будет фигурировать ваш домен.

Идея с указанием интерфейса взята отсюда: http://www.directadmin.com/forum/showthread.php?t=36468

Остается проверить, чтобы все ваши настройки работали верно. Для этого просто отправим письмо с локального сервера через консоль.

$ mail -a «From:feedbee@adminunix.ru» -s Test feedbee@gmail.com — -ffeedbee@adminunix.ru
Test
Cc:

Проверяем отосланное письмо в ящике получателя:

А вот текст SMTP-протокола:

P.S. Чтобы отправленная почта не попадала в спам, отправляйте письма только от имени реально существующих на серверах Gmail адресов на ваших доменах. Туда же повалятся уведомления о недоставках.

Чтобы при отправке писем root’у, как это любят делать многие утилиты (например smartd), письмо уходило не на root@example.org, а на admin@adminunix.ru. Я изменил /etc/aliases:

В файл /etc/exim4/conf.d/rewrite/00_exim4-config_header пишем правила,

А для затирания Received из заголовков писем с ip серверов которые коннектятся к нашему почтовику надо добавить вот эту строчку:

Источник

Adblock
detector