Многодоменная почтовая система с использованием mail server`а IPS

Автор: Alex Samorukov

Источник: ru2.halfos.ru

Скачать статью в формате DOC.

У меня возникла такая задача:

  1. SMTP-сервер (только входящий), обслуживающий много доменов и пользователей;
  2. POP3-сервер на много пользователей и доменов, при этом должны быть доступны одинаковые имена в разных доменах (пример: postmaster@domain1.com и postmaster@domain2.com);
  3. всё это должно жить на одном IP-адресе;
  4. должны существовать аккаунты "на домен", то есть если юзера не найдено, но такой домен есть, то всё должно падать на него. Причём для некоторых доменов это было нужно, а для других -- нет;
  5. добавление доменов и юзеров не должно требовать рестарта сервера и должно просто автоматизироваться.
  6. программа должна иметь текстовые конфиги (см. 4) и не требовать PM (так как управление у меня -- ssh only)
  7. некоторые домены -- алиасы (например, alias.com и domain1.com).

Когда у меня возникла данная задача, я не нашёл готового решения для OS/2. Идея использовать sendmail, локальный сортировщик и отдельный pop3d меня не привлекала. Тогда я обратил своё внимание на IPS. В данном вопросе меня интересовали только его pop3/smtp-компоненты. Встроенная поддержка доменов меня не устроила из-за невозможности реализовать пункты 2, 4 и 5. Но в IPS встроенна поддержка Rexx-хуков, что позволило создать систему, удоволетворяющую всем вышеперечисленным требованиям :) Ниже я постараюсь рассказать о том, как она работает, и как можно применить её на вашем сервере.

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

Секция [SMTP-1] у меня содержит такие настройки:

[SMTP-1]
Address=217.66.96.131
# my ip address
Protocol=smtpd
ClientAddress=*
Host=smtp
ForwardAddress=
ForwardToServer=
QueueDirectory=.\queue\mail
LocalDomain=localhost
# You need to specify ONLY localhost here.
LocalDomains=@localhost @[127.0.0.1]
hookOnCommand=.\scripts\smtp\rxOnCommand.rexx
# our rexx script.

Из нижеприведённого следует, что IPS думает, что обслуживает ТОЛЬКО 1 домен, а на каждую комманду запускает скрипт rxOnCommand.rexx.

Далее наша статья посвящена работе данного скрипта.

Что делает этот скрипт ?

  1. Перехватывает строчку RCPT TO: и разбирает e-mail на домен и имя пользователя. Проверяет установленные алиасы и заменяет их на основной домен (cм строку после /* alias1 */).
  2. Читает файл, указанный в переменной domain_file (текстовый файл, содержащий список локальных доменов, строка==домен) и проверяет, наш ли это домен. Если нет, то отдаёт строку без изменений (после чего IPS говорит, что forward not allowed).
  3. Если это наш домен, то ищем пользователя вида user%domain (e.g. samm%domain1.com).
    Если такой пользователь найден -- отдаём IPS`у строку вида "RCPT TO: " (например, RCPT TO: ). Если нет -- то строку вида "RCPT TO: " (например, RCPT TO: ).

Вот, собственно, и всё. Теперь постараюсь рассказать, как это использовать.

  1. устанавливаем IPS и настраиваем секцию [SMTP-1] согласно моим рекомендациям;
  2. копируем скрипт в IPS\scripts\smtp\rxOnCommand.rexx;
  3. редактируем в xOnCommand.rexx переменную domain_file, чтобы она указывала на файл, где вы планируете разместить список доменов. Создаём этот файл и вносим туда список доменов и алиасов (строка=домен);
  4. прописываем после строчки alias все наши alias`ы (если они есть).таким образом: if domain='alias.com' then domain='primary.com' /* alias */

Система готова к использованию. Теперь создадим пользователей.

  1. Если мы хотим создать пользователя, который будет получать только адресованные ему сообщения (e.g. samm@domain1.com), то создаете пользователя с именем вида user%domain (в нашем случае samm%domain1.com). Теперь все сообщения, адресованные ему, будут падать в его mailbox. Его pop3-логин будет вида user%domain (в нашем примере -- samm%domain1.com).
  2. Если мы хотим создать пользователя, получающего почту на весь домен (в случае если пользователь-адресат не найден), то надо создать пользователя вида domain (например, domain1.com). Его pop3-логин будет domain (в нашем случае -- domain1.com).

Вот, вроде, и всё. Хотелось бы добавить, что в настоящее время моя система обслуживает 16 доменов, 3 алиаса и более 60 пользователей :)