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

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

Работает с 2026-09-07. Проверено на Ubuntu 24.04 (postfix 3.8.6, dovecot 2.3.21, opendkim 2.11, Roundcube 1.7.4) и на Ubuntu 26.04 (postfix 3.10.6, dovecot 2.4.2). С 2026-09-30 — и на EL: AlmaLinux, Rocky и Oracle Linux 9 (postfix 3.5, dovecot 2.3.16) и 10 (postfix 3.8, dovecot 2.3.21), SELinux в enforcing.

Панель поднимает полноценный почтовый сервер для доменов, которые она обслуживает: приём и отправка (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 дистрибутива намеренно не подключается. Шаблон выбирается по установленной версии dovecot: 2.3 (Debian 12, Ubuntu 22.04/24.04) или 2.4 (Debian 13, Ubuntu 26.04)
/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 add shop.example.com --user alex --send-only   # почту принимает провайдер, здесь только 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. Домен «только отправка»

Бывает, что почту домена принимает другой сервер — MX у почтового провайдера, — а здесь живёт только сайт, которому нужно отправлять письма от имени домена с подписью DKIM. Такой домен добавляется с флагом --send-only (в Web UI — галочка «только отправка» при добавлении домена и переключатель в списке): панель заводит ключ DKIM и разрешает отправку, а в карты приёма postfix домен не попадает. Поэтому письмо сайта на адрес этого же домена уходит на настоящий MX, а не в несуществующий локальный ящик. Ящиков и алиасов у такого домена нет; подсказка DNS не требует MX на этот сервер и советует дописать его в SPF провайдера, а не заменять запись.

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

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

10. Вебпочта

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 убирает публикацию.

11. Границы

  • EL устроен чуть иначе. Пакеты — postfix, dovecot, dovecot-pigeonhole и opendkim из EPEL; на EL 10 его библиотеки тоже в EPEL, а на EL 9 они есть только в CodeReady Builder (crb, на Oracle Linux — ol9_codeready_builder). Репозиторий панель не включает: если пакеты не ставятся без него, он подключается на одну эту транзакцию (dnf install --enablerepo=…). Включённый насовсем, он подмешивал бы свои пакеты в обычный dnf upgrade. Обратная сторона: sendmail-milter и libmemcached-awesome на EL 9 не обновляются, пока репозиторий выключен. Версия 0.8.15 включала его насовсем; если он так и остался включённым, mp doctor об этом скажет и покажет команду. Остальное панель подстраивает сама:
    • postfix 3.5 в EL 9 не знает compatibility_level = 3.6 и записи >=TLSv1.2 — туда пишутся 2 и список исключений;
    • postfix в EL 10 собран без Berkeley DB — карты и кэш TLS-сессий там lmdb: вместо hash: и btree: (панель спрашивает postconf -m);
    • opendkim слушает не unix-сокет, а 127.0.0.1:8891: в политике EL 10 для него нет домена, и smtpd к его сокету не пускают, а к порту — пускают;
    • каталог сертификатов панели получает метку cert_t, иначе smtpd не читает сертификат и STARTTLS отвечает «TLS not available»;
    • порт вебпочты (--port) получает метку http_port_t и открывается в firewalld.
  • Антиспам — только средства 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