Многодоменная почтовая система с использованием mail server`а IPS
Автор: Alex Samorukov
Источник: ru2.halfos.ru
Скачать статью в формате DOC.
У меня возникла такая задача:
- SMTP-сервер (только входящий), обслуживающий много доменов и пользователей;
- POP3-сервер на много пользователей и доменов, при этом должны быть доступны одинаковые имена в разных доменах (пример: postmaster@domain1.com и postmaster@domain2.com);
- всё это должно жить на одном IP-адресе;
- должны существовать аккаунты "на домен", то есть если юзера не найдено, но такой домен есть, то всё должно падать на него. Причём для некоторых доменов это было нужно, а для других -- нет;
- добавление доменов и юзеров не должно требовать рестарта сервера и должно просто автоматизироваться.
- программа должна иметь текстовые конфиги (см. 4) и не требовать PM (так как управление у меня -- ssh only)
- некоторые домены -- алиасы (например, 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.
Далее наша статья посвящена работе данного скрипта.
Что делает этот скрипт ?
- Перехватывает строчку RCPT TO: и разбирает e-mail на домен и имя пользователя. Проверяет установленные алиасы и заменяет их на основной домен (cм строку после
/* alias1 */ ). - Читает файл, указанный в переменной domain_file (текстовый файл, содержащий список локальных доменов, строка==домен) и проверяет, наш ли это домен. Если нет, то отдаёт строку без изменений (после чего IPS говорит, что forward not allowed).
- Если это наш домен, то ищем пользователя вида user%domain (e.g. samm%domain1.com).
Если такой пользователь найден -- отдаём IPS`у строку вида"RCPT TO: (например," RCPT TO: ). Если нет -- то строку вида"RCPT TO: (например," RCPT TO: ).
Вот, собственно, и всё. Теперь постараюсь рассказать, как это использовать.
- устанавливаем IPS и настраиваем секцию [SMTP-1] согласно моим рекомендациям;
- копируем скрипт в IPS\scripts\smtp\rxOnCommand.rexx;
- редактируем в xOnCommand.rexx переменную domain_file, чтобы она указывала на файл, где вы планируете разместить список доменов. Создаём этот файл и вносим туда список доменов и алиасов (строка=домен);
- прописываем после строчки alias все наши alias`ы (если они есть).таким образом:
if domain='alias.com' then domain='primary.com' /* alias */
Система готова к использованию. Теперь создадим пользователей.
- Если мы хотим создать пользователя, который будет получать только адресованные ему сообщения (e.g. samm@domain1.com), то создаете пользователя с именем вида user%domain (в нашем случае samm%domain1.com). Теперь все сообщения, адресованные ему, будут падать в его mailbox. Его pop3-логин будет вида user%domain (в нашем примере -- samm%domain1.com).
- Если мы хотим создать пользователя, получающего почту на весь домен (в случае если пользователь-адресат не найден), то надо создать пользователя вида domain (например, domain1.com). Его pop3-логин будет domain (в нашем случае -- domain1.com).
Вот, вроде, и всё. Хотелось бы добавить, что в настоящее время моя система обслуживает 16 доменов, 3 алиаса и более 60 пользователей :)