Пользователи получают возможность писать сообщения фирмам со своего личного ящика, сохранив их в адресной книги, или любым другим удобным для них способом. А организации будут вынуждены им с него отвечать, что в результате должно увеличить посещаемость и соответственно монетизировать мой проект.
К сожалению, как только я начал обращаться с данным вопросом на крупнейших форумах рунета, то получил не совсем тот ответ, который я ожидал. При этом, лучшие из предложений сводились к тому, чтобы снести прекрасно работающий 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.site.ru
Теперь перейдем непосредтственно к конфиругации 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
Комментарии (15)
mgyk
16.06.2015 15:00-5Прикрутили бы лучше sendgrid какой-то. На небольшой кол-ве писем он еще и бесплатен. Получали бы ответы сразу вебхуком в приложение. Мне кажется локальные mail серверы уже умерли давно.
blind_oracle
16.06.2015 15:09+9Мне кажется локальные mail серверы уже умерли давно.
Сильно ошибаетесь.
RaveNoX
16.06.2015 19:00+1вам exim + dovecot не просто так посоветовали, в этой связке (да и по отдельность) можно хранить данные про учётки (а также сопутствующую информацию) в БД. На выходе получаем возможность заводить учётку при регистрации пользователя на сайте без необходимости менять конфигурацию почтовика, а так же разложенную по учёткам почту (для каждой учётки — свой файл).
В дальнейшем нам лишь останется разобрать, кому и чья почта принадлежит и отдать уже фактическому владельцу на нашем сайте.
Вот тут то и кроются проблемы, если поток почты будет достаточно большой, то ваш файл «для всех» будет быстро распухать, а дальше — либо будет требоваться большое количество RAM для быстрого разбора файла, либо получаем тормоза при чтении почты.dsx
16.06.2015 21:32+1а так же разложенную по учёткам почту (для каждой учётки — свой файл)
Формату Maildir в этом году 20 лет. Может всё-таки уже пора начать им пользоваться, а?RaveNoX
16.06.2015 21:35Я знаю про maildir, и dovecot'товские форматы, а также не использую формат mailbox практически нигде (где остался — требования стороннего ПО).
В данном случае я показывал, что как минимум бонус в том чтобы иметь отдельный ящик на каждую учётку, а не общую помойку на всех.
mmotor Автор
17.06.2015 00:02+1Статья о том, как принять данные и отдать ее php скрипту. А получив ее сделать с ней все необходимое, в том числе и раскидать соответствующим образом не проблема. Смысл сводился именно к тому, чтобы хранить ее в соответствующем виде, согласно структуре уже работающего сайта, в моем случае каталога, как раз без необходимости переустановки и замены уже работающего почтовика.
Согласен, большой файл разобрать сложно, да и неудобно обращаться к нему отдельно от самого sendmail. Поэтому наиболее удобный вариант направить сразу на php скрипт, который будет его обрабатывать на лету.
Сделать это можно в файле
/etc/aliases
user: "|php5-cgi -c /path/to/php.ini /site.ru/public_html/mail.php"
Так что общей помойки не будет
urbain
16.06.2015 19:31+2Не увидел никакой авторизации (а у тем более защиты от перебора учёток). Насколько я понимаю, узнав любой адрес из вашего домена site.ru, можно смело проводить рассылки через ваш сервер.
И ещё:
> /home/site.ru/public_html/mail
означает, что используется древний формат mailbox, где все письма кучей в одном файле.
Будете восстанавливать «случайно удалённые письма» — намучаетесь. Впрочем — про бэкап почты в статье ни слова, значит это не проблема.mmotor Автор
17.06.2015 00:09+1Авторизация и учетка будет создаваться уже на конкретном сайте, в моем случае на каталоге. Поэтому этот момент уже полностью отдается под контроль самого php скрипта, и его разработчика. Соответственно и контроль рассылки.
По поводу кучи в одном файле полностью согласен, и решение предложил чуть выше.
grossws
16.06.2015 20:35wget -O — http://officeshield.drweb.com/drweb/drweb.key | apt-key add
прекрасный способ добавить левый ключ (который может подменить кто угодно по дороге) в доверенные
blind_oracle
Советовать людям ставить в 2015 году Sendmail, как минимум, несколько странно.
svd71
И чем плох sendmail?
blind_oracle
Большинство дистрибутивов уже перестало пихать его как дефолтный МТА — перешли на Exim или Postfix.
Так что не нужно его советовать.
mmotor Автор
Although there are no recent surveys, Sendmail usage appears to be dropping over time. Dan Bernstein's 2001 SMTP survey (without published source code, and therefore not replicable) put Sendmail at about 42% market share. In 2006 it seems reasonable to assume [4] that Sendmail is on substantially fewer than 40% of the world's SMTP servers.
Я не призываю не использовать Exim или Postfix, а лишь предлагаю использовать то, что уже установлено, если оно вполне способно соответствовать необходимым нуждам и требованиям вследствие небольшой настройки.
blind_oracle
Это цифры 10-летней давности всё же. Нынче его доля крайне низка, по объективным причинам.
По старой памяти CentOS и прочие RHEL предлагают его на выбор при установке (вместе с Pfx/Exim), но смысла его выбирать нет.
Вот и установлено что-то другое :)
Не стоит использовать плохое ПО только потому что оно уже стоит. Вам ведь его потом ещё и поддерживать.
mmotor Автор
Последняя версия sendmail вышла чуть больше года назад. Программа поддерживается и совершенствуется. Я не вижу причин сносить в общем-то хорошо работающее ПО, если оно вполне соответствует моим требованиям.