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

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

К сожалению, как только я начал обращаться с данным вопросом на крупнейших форумах рунета, то получил не совсем тот ответ, который я ожидал. При этом, лучшие из предложений сводились к тому, чтобы снести прекрасно работающий 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)


  1. blind_oracle
    16.06.2015 14:35
    +9

    Советовать людям ставить в 2015 году Sendmail, как минимум, несколько странно.


    1. svd71
      16.06.2015 14:44

      И чем плох sendmail?


      1. blind_oracle
        16.06.2015 15:07
        +7

        Sendmail has an extraordinarily obscure configuration file, a poor history of security breaches and a design centred around Unix in the early 1980s. Sendmail is known for being inefficient compared to alternatives so it might be hard to see why sendmail is still used at all, but history has its own inertia. There is no good reason for a site without Sendmail experience to install it, given the effectiveness of the alternatives. There are often good reasons why a site with Sendmail working should keep it.
        © lwn.net/Articles/196724

        Большинство дистрибутивов уже перестало пихать его как дефолтный МТА — перешли на Exim или Postfix.
        Так что не нужно его советовать.


        1. mmotor Автор
          16.06.2015 23:41
          +2

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


          1. blind_oracle
            17.06.2015 09:20
            +1

            In 2006

            Это цифры 10-летней давности всё же. Нынче его доля крайне низка, по объективным причинам.
            По старой памяти CentOS и прочие RHEL предлагают его на выбор при установке (вместе с Pfx/Exim), но смысла его выбирать нет.

            а лишь предлагаю использовать то, что уже установлено

            apt-get purge sendmail
            apt-get install postfix|exim
            

            Вот и установлено что-то другое :)
            Не стоит использовать плохое ПО только потому что оно уже стоит. Вам ведь его потом ещё и поддерживать.


            1. mmotor Автор
              17.06.2015 11:10
              +1

              Последняя версия sendmail вышла чуть больше года назад. Программа поддерживается и совершенствуется. Я не вижу причин сносить в общем-то хорошо работающее ПО, если оно вполне соответствует моим требованиям.


  1. mgyk
    16.06.2015 15:00
    -5

    Прикрутили бы лучше sendgrid какой-то. На небольшой кол-ве писем он еще и бесплатен. Получали бы ответы сразу вебхуком в приложение. Мне кажется локальные mail серверы уже умерли давно.


    1. blind_oracle
      16.06.2015 15:09
      +9

      Мне кажется локальные mail серверы уже умерли давно.

      Сильно ошибаетесь.


  1. RaveNoX
    16.06.2015 19:00
    +1

    вам exim + dovecot не просто так посоветовали, в этой связке (да и по отдельность) можно хранить данные про учётки (а также сопутствующую информацию) в БД. На выходе получаем возможность заводить учётку при регистрации пользователя на сайте без необходимости менять конфигурацию почтовика, а так же разложенную по учёткам почту (для каждой учётки — свой файл).

    В дальнейшем нам лишь останется разобрать, кому и чья почта принадлежит и отдать уже фактическому владельцу на нашем сайте.


    Вот тут то и кроются проблемы, если поток почты будет достаточно большой, то ваш файл «для всех» будет быстро распухать, а дальше — либо будет требоваться большое количество RAM для быстрого разбора файла, либо получаем тормоза при чтении почты.


    1. dsx
      16.06.2015 21:32
      +1

      а так же разложенную по учёткам почту (для каждой учётки — свой файл)


      Формату Maildir в этом году 20 лет. Может всё-таки уже пора начать им пользоваться, а?


      1. RaveNoX
        16.06.2015 21:35

        Я знаю про maildir, и dovecot'товские форматы, а также не использую формат mailbox практически нигде (где остался — требования стороннего ПО).
        В данном случае я показывал, что как минимум бонус в том чтобы иметь отдельный ящик на каждую учётку, а не общую помойку на всех.


    1. 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"
      


      Так что общей помойки не будет


  1. urbain
    16.06.2015 19:31
    +2

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

    И ещё:
    > /home/site.ru/public_html/mail
    означает, что используется древний формат mailbox, где все письма кучей в одном файле.
    Будете восстанавливать «случайно удалённые письма» — намучаетесь. Впрочем — про бэкап почты в статье ни слова, значит это не проблема.


    1. mmotor Автор
      17.06.2015 00:09
      +1

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

      По поводу кучи в одном файле полностью согласен, и решение предложил чуть выше.


  1. grossws
    16.06.2015 20:35

    wget -O — http://officeshield.drweb.com/drweb/drweb.key | apt-key add
    прекрасный способ добавить левый ключ (который может подменить кто угодно по дороге) в доверенные