Почтовый сервер на собственном сайте

в 11:15, , рубрики: php, sendmail, Веб-разработка

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

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

К сожалению, как только я начал обращаться с данным вопросом на крупнейших форумах рунета, то получил не совсем тот ответ, который я ожидал. При этом, лучшие из предложений сводились к тому, чтобы снести прекрасно работающий sendmail и установить на него Postfix и Dovecot, которые тянули и другие зависимости. А установочный пакет выглядел бы примерно так: exim4, exim4-base, exim4-config, exim4-daemon-heavy, dovecot-common, dovecot-imapd, dovecot-pop3d, php5-imap. В худшем оговаривали баснословные суммы, аж в 2000$, или советовали пройти мимо и не позориться.

К сожалению, позориться долго не пришлось. Так как однозначной инструкции, которая бы удовлетворяла мои нужды, и другие возможные подобные решения в сети не нашлись, я решил, что данное руководство будет как нельзя кстати.

Поставленная мною задача решалась с помощью старого доброго sendmail и небольших настройках в его конфигурациях.

В первую очередь необходимо прописать настройки в dns-зоне:

Для MX:

@ IN MX 10 mx.site.ru.

И для AAAA:

@ IN AAAA 2001:0db8:85a3:0000:0000:8a2e:0370:7334

И для A:

mx.site.ru.  IN A <IP>

Указанный в ДНС MX адрес также надо будет прописать в /etc/hosts, добавив:

<IP> mail.construktor.info

Теперь перейдем непосредтственно к конфиругации sendmail.

Начнем с файла /etc/mail/sendmail.mc. Для начала откроем двери для всех желающих, так как по умолчанию smtp-порт открыт только на раздачу. Проблему вирусов, спама и дос-атак обсудим позже. Делается это так:

DAEMON_OPTIONS(`Port=smtp,Addr=<ip>, Name=MTA-ext')dnl

Затем сразу после записи:

FEATURE(`use_cw_file')dnl

Добавим таблицы виртуальных пользователей и доменов:

FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')dnl

Теперь создадим файл, куда будем класть почту:

touch "/home/site.ru/public_html/mail"

И назначим ему права владельца а группу sendmail агента:

chown user:mail /home/site.ru/public_html/mail

Путь и название файла условное и рекомендуется создавать файл вне зоны доступа для случайных пользователей.

В файле /etc/aliases пропишем имя виртуального пользователя, которому и будут приходить сообщения.

user:   /home/site.ru/public_html/mail

В этом случае вся почта будет скапливаться в файле /home/site.ru/public_html/mail

Большой файл разобрать сложно, да и неудобно обращаться к нему отдельно от самого sendmail. Поэтому наиболее удобный вариант направить сразу на php скрипт, который будет его обрабатывать на лету.

user:   "|php5-cgi -c /path/to/php.ini /site.ru/public_html/mail.php"

Чтобы письма всех возможных пользователей отправлялись в файл /site.ru/public_html/mail.php

Запишем в файл /etc/mail/virtusertable инструкцию:

@site.ru user

Данная инструкция сообщает, что всех возможных пользователей сайта site.ru мы определяем как пользователя user, для которого ранее мы уже определили место для хранение почты. В дальнейшем нам лишь останется разобрать, кому и чья почта принадлежит и отдать уже фактическому владельцу на нашем сайте.

Завершающим этапом останется лишь прописать список имен хостов, принимаемых программой sendmail в файле
/etc/mail/local-host-names.

Добавив к существующим:

mx.site.ru
site.ru
(В конце пробел обязателен)

Активируем изменения командой sendmailconfig.

Защита от DDoS-атак

Для защиты от дос-атак я приведу несколько настроек, которые будут полезны. Их необходимо прописать в файле /etc/mail/sendmail.mc:

# максимальное число соединений в секунду. Если частота превышена, дополнительные соединения будут поставлены в очередь (не отброшены).
Define(confCONNECTION_RATE_THROTTLE',43')dnl 
#максимальное число дочерних процессов sendmail. Если это число будет превышено, дополнительные соединения будут поставлены в очередь (не отброшены).
Define(confMAX_DAEMON_CHILDREN',40')dnl 
#если на диске осталось указанное количество блоков, сервер больше не будет принимать сообщения. По умолчанию - 100.
Define(4configSIN_FREE_BLOCKS',100')dnl
#максимальный размер заголовка входящего сообщения, в байтах.
Define(confMAX HEADERS LENGTH', 4024')dnl
#максимальный размер тела входящего сообщения. Значение по умолчанию равно 4 Мб (4 194 302 байта). Не нужно устанавливать слишком маленькое значение, так как оно может быть легко превышено вложениями (attachments).
Define(confMAX_MESSAGE_SIZE',4194304')dnl

После чего еще раз активируем изменения командой sendmailconfig.

Антиспам и антивирус

В качестве антивирусной программы будем использовать Dr.Web. Он же поможет нам справиться и со спамом. Я не стал использовать дополнительные спам-фильтры, так как сам после долгих страданий от того, что в сервисе gmail.com нужные мне письма постоянно попадали в спам. Принял решение перейти на yandex. Поэтому чистку спамом считаю делом индивидуальным, а использование каких-либо спам-листов и фильтров довольно сомнительным удовольствием.

Установим ключ:

wget -O - http://officeshield.drweb.com/drweb/drweb.key | apt-key add

Подключим репозиторий:

nano /etc/apt/sources.list
deb http://officeshield.drweb.com/drweb/debian stable non-free

Обновляем репозиторий:

aptitude update

Устанавливаем Dr.Web:

aptitude install drweb-sendmail-av-as

Основной файл настройки антиспама /etc/drweb/plugin_vaderetro.conf. В нем нас особо интересуют черные и белые списки:

WhiteList = /home/site.ru/public_html/mail/WhiteList 
BlackList = /home/site.ru/public_html/mail/BlackList 

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

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

Используемые материалы

www.pettingers.org/code/sendmail-local.html
www.sendmail.com/sm/open_source/docs/m4/features.html
it-e.ru/blogs/administrirovanie/nastrojka-mta-sendmail
www.freebsd.org/doc/ru/books/handbook/sendmail.html
progressive0.livejournal.com/15919.html
adatum.ru/ustanovka-sendmail-dovecot-drweb-na-ubuntu.html

Автор: mmotor

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js