РазделПочта
ДокументацияРуководство

Почтовый сервер

Реализовано 2026-09-07, проверено на Ubuntu 24.04 (postfix 3.8.6, dovecot 2.3.21, opendkim 2.11, Roundcube 1.7.4).

Панель поднимает полноценный почтовый сервер для доменов, которые она обслуживает: приём и отправка (SMTP), доступ к ящикам (IMAP/POP3), подпись писем (DKIM) и вебпочту (Roundcube). Как и везде в MonoPanel, источник истины — база панели: конфигурация postfix и dovecot перегенерируется целиком при каждом изменении, а руками её править не нужно.

1. Из чего собрано

КомпонентРольПочему так
postfixSMTP: приём на 25, отправка клиентами на 587/465, транспорт наружуСтандарт де-факто, предсказуемая конфигурация, дешёвый в поддержке набор карт
dovecotIMAP, POP3, LMTP-доставка, SASL для postfix, квоты, sieve-фильтрыОдин демон отвечает за ящики целиком: пароли, доставку, квоты и фильтры. postfix не трогает файлы почты вообще
opendkimПодпись исходящих и проверка входящихОтдельный milter вместо встроенных решений: ключи лежат отдельно от postfix, ротация не трогает MTA
RoundcubeВебпочтаСтавится обычным сайтом панели: свой php-fpm пул, свой сертификат, свой владелец

Пользователи почты не unix-аккаунты: все ящики принадлежат системному пользователю vmail, а адреса, пароли и квоты живут в базе панели.

2. Что где лежит

ПутьЧто это
/etc/postfix/main.cf, master.cfГенерируются панелью целиком
/etc/postfix/monopanel/domains|mailboxes|aliases|sendersКарты (hash:), после записи собираются postmap
/etc/postfix/monopanel/submission_header_checksУбирает Received и X-Originating-IP у писем, отправленных через 587/465
/etc/dovecot/dovecot.confГенерируется целиком; conf.d дистрибутива намеренно не подключается
/etc/dovecot/monopanel/userspasswd-файл: адрес, хеш {BLF-CRYPT}, userdb_quota_rule
/etc/opendkim.conf, /etc/opendkim/KeyTable, SigningTable, TrustedHostsТаблицы подписи
/etc/opendkim/keys/<домен>/<селектор>.privateПриватный ключ (0600, opendkim); копия хранится в базе панели зашифрованной
/var/mail/monopanel/<домен>/<ящик>/Maildir, владелец vmail

Панель хранит домены, ящики и алиасы в таблицах mail_domains, mailboxes, mail_aliases (миграция 0011_mail.sql); серверные настройки — в settings под ключом mail.

3. Путь письма

Входящее: :25 smtpd → проверки (HELO, домен отправителя, reject_unlisted_recipient, при желании RBL) → opendkim проверяет подпись → virtual_transport = lmtp:unix:private/dovecot-lmtp → dovecot кладёт в Maildir, применяет sieve-фильтры и считает квоту.

Исходящее от клиента: :587 (STARTTLS) или :465 (сразу TLS) → SASL к dovecot по private/auth → reject_sender_login_mismatch (отправлять можно только от своего адреса или от алиаса, ведущего в этот ящик) → submission-header-cleanup убирает следы IP клиента → opendkim подписывает → доставка.

Письма сайтов: PHP mail() идёт через /usr/sbin/sendmail → pickup → тот же путь, включая подпись DKIM.

4. Порты

ПортЧтоКомментарий
25SMTPПриём почты снаружи. Если порт занят другим демоном, установка это видит по баннеру и выключает приём (port25=false), а не роняет postfix
587, 465Submission, SMTPSТолько с авторизацией и TLS
143, 993IMAP, IMAPSssl = required, plaintext-логин без TLS запрещён
110, 995POP3, POP3SОтключаются целиком (mp mail settings --pop3 false)
4190ManageSieveФильтры из Roundcube
2096 (любой)ВебпочтаНеобязательный: Roundcube на имени и сертификате почтового сервера

Порты открываются в firewall панели автоматически. Панель не верит systemd на слово: после применения конфигурации она проверяет, что порты действительно отвечают (юнит postfix — обёртка и рапортует «active», даже когда мастер не поднялся).

5. TLS

Сертификат берётся по имени почтового сервера из хранилища панели (тот же ACME, что и у сайтов). Если сертификата нет, панель выпускает самоподписанный, чтобы демоны стартовали, и пишет об этом в предупреждения. Когда ACME-сертификат для этого имени выпускается или продлевается, задача cert.issue сама перегенерирует конфигурацию почты и перезапустит postfix и dovecot.

6. DNS

mp mail domain dns <домен> (и кнопка «DNS» в Web UI) показывает нужные записи и то, что опубликовано сейчас — запросы идут к публичным резолверам (1.1.1.1, 8.8.8.8), а не к системному:

  • A почтового хоста → адрес сервера;
  • MX домена → почтовый хост;
  • TXT SPF: v=spf1 mx a:<хост> -all;
  • TXT <селектор>._domainkey.<домен> — открытый ключ DKIM (RSA 2048);
  • TXT _dmarc.<домен>;
  • PTR для IP — его настраивает хостер; без него письма чаще попадают в спам.

7. Команды

mp mail install --hostname mail.example.com   # postfix + dovecot + opendkim, сертификат, порты
mp mail status                                # сервисы, порты, TLS, предупреждения
mp mail settings --pop3 false --max-size 25 --rbl zen.spamhaus.org
mp mail domain add example.com --user alex    # + ключ DKIM
mp mail domain dns example.com                # что прописать в DNS и что уже опубликовано
mp mail domain dkim example.com               # новый ключ
mp mail box add ivan@example.com --quota 2048 # пароль сгенерируется и покажется один раз
mp mail box set ivan@example.com --password … # или без флагов — сгенерировать новый
mp mail alias add info@example.com ivan@example.com
mp mail alias add @example.com ivan@example.com   # catch-all
mp mail webmail webmail.example.com --user alex   # Roundcube отдельным сайтом
mp mail apply                                  # перегенерировать конфигурацию

Выключенный ящик (--active false) исчезает и из карты postfix, и из паролей dovecot: почта на него не принимается, войти нельзя, письма на диске остаются.

8. Домен-приёмник

Обычному домену панель не отдаст письмо от отправителя с несуществующим доменом или с кривым HELO — и правильно сделает. Но есть домены, для которых входящее письмо не корреспонденция, а предмет анализа: диагностический приёмник обязан увидеть именно то письмо, которое остальные отвергли, иначе он не сможет объяснить отправителю, что у него сломано.

Для таких доменов есть флаг «приёмник» (mp mail domain add … --lenient, mp mail domain set <домен> --lenient true). Технически он кладёт домен в карту check_recipient_access, а строгие проверки HELO и отправителя перенесены в общий список с получателем — OK из карты обрывает его до того, как до них дойдёт дело. Приём остаётся закрытым для чужих доменов (reject_unauth_destination) и для несуществующих ящиков.

Так на dev-хосте панели уживаются почтовый сервер и mail-tester: postfix слушает 25-й порт, домен тестера объявлен приёмником с catch-all в отдельный служебный ящик, а сам тестер забирает письма из этого ящика по IMAP ([imap] enabled = yes) и берёт IP отправителя, HELO и TLS из заголовка Received, который добавил postfix. Тестеру больше не нужен свой SMTP-демон, а панели — не нужно уступать порт.

9. Вебпочта

mp mail webmail <домен> создаёт обычный сайт панели, скачивает официальный архив Roundcube (версия и sha256 зашиты в панель), распаковывает его от root (код не принадлежит владельцу сайта и не переписывается через веб), делает базу MySQL, загружает схему и пишет config/config.inc.php: IMAP и SMTP — на почтовый хост через TLS, плагины archive, zipdownload, managesieve, newmail_notifier, каталог installer удаляется. Дальше это обычный сайт: свой сертификат, свой пул php-fpm, своя версия PHP.

Порт вместо домена. --port 2096 (или mp mail settings --webmail-port 2096) публикует ту же установку на порту почтового хоста: https://<почтовый хост>:2096/. Панель пишет отдельный серверный блок nginx в http.d/monopanel-webmail.conf с именем и сертификатом почтового сервера, открывает порт в firewall и слушает заодно на петле, чтобы проверки с самого хоста работали. Отдельная запись в DNS и отдельный сертификат для вебпочты при этом не нужны — удобно, когда почта поднимается на сервере, у которого уже есть имя. --port 0 убирает публикацию.

10. Границы

  • Debian/Ubuntu. На EL пакеты есть, но конфигурация не проверялась — установка отказывается сразу, а не ломается на полпути.
  • dovecot 2.3. В 2.4 (Debian 13) синтаксис конфигурации изменился; панель это видит по версии пакета и отказывается писать конфигурацию, которую не проверяли. Шаблон для 2.4 — следующий шаг.
  • Антиспам — только средства postfix: проверки HELO/отправителя, лимиты соединений и опциональные RBL. Полноценного контент-фильтра (rspamd) пока нет; входящие письма проходят проверку DKIM, но по её результату ничего не отклоняется.
  • Квоты считает dovecot (maildir:User quota); превышение отдаётся отправителю как 552 5.2.2 Mailbox is full.
  • Смены пароля ящика из вебпочты нет: пароли меняются в панели.
  • Ключ DKIM начинает подписывать письма сразу, а проверяется получателями по записи в DNS — до её публикации подпись будет «не сходится». Публикуйте TXT-запись сразу после добавления домена (mp mail domain dns) или добавляйте домен с --no-dkim, если ключ пока некуда прописать.
Исходник страницы на GitHub