Postfix принимает письма и кладёт их в ящики, но сам отдавать почту пользователю он не умеет. За это отвечает отдельный сервер - в мире Linux это почти всегда Dovecot. Его задача - пустить почтовый клиент (Thunderbird, мобильную почту, Outlook) по протоколу IMAP или POP3, проверить, кто это и можно ли ему, найти его ящик на диске и отдать письма. В этом уроке разбираем, как Dovecot устроен изнутри, чем Maildir отличается от mbox, как работает связка passdb/userdb, зачем нужен TLS и как Dovecot становится для Postfix сервером аутентификации при отправке через SASL.

Как это работает
Сначала про протоколы. POP3 - простая модель скачать и забыть: клиент стягивает письма на устройство и обычно удаляет их с сервера. Состояние ящика живёт на клиенте, синхронизации между устройствами нет. IMAP - наоборот: письма и папки остаются на сервере, клиент видит их состояние (прочитано, отвечено, флаги), а несколько устройств работают с одним ящиком. В 2026 рабочий стандарт - IMAP, POP3 остаётся для редких сценариев и совместимости. Открытые порты: IMAP - 143 (STARTTLS) и 993 (сразу TLS, implicit), POP3 - 110 и 995.
Dovecot построен из мелких процессов, каждый со своей ролью. Процесс login принимает соединение, поднимает TLS и разбирает протокол, но почти ничего не знает о ящике. Он передаёт логин и пароль процессу аутентификации (dovecot-auth), а тот обращается к двум базам. passdb отвечает на вопрос ГДЕ взять и как проверить пароль (PAM, файл passwd-file, SQL, LDAP). userdb отвечает на вопрос КТО этот пользователь: какой uid/gid, где его домашний каталог и где лежит почта. Это разделение - ключевая идея Dovecot: одного и того же человека можно аутентифицировать одним способом, а параметры ящика брать другим.
Хранилище. mbox - это один текстовый файл на папку: все письма склеены подряд. Прост, но при каждой записи требует блокировку всего файла, плохо переживает обрыв и параллельный доступ. Maildir - каталог из трёх подкаталогов: tmp (письмо пишется сюда), new (доставленное, ещё не прочитанное) и cur (просмотренное, с флагами в имени файла). Одно письмо - один файл, блокировки целого ящика не нужно, повреждается максимум один файл. Для IMAP-сервера под нагрузкой Maildir - правильный выбор по умолчанию.
Команды и примеры
Установка. В Debian/Ubuntu пакеты разнесены по протоколам, в RHEL/Fedora обычно ставят общий пакет.
Код: Выделить всё
# Debian 13 / Ubuntu 24.04
apt install dovecot-imapd dovecot-pop3d dovecot-lmtpd
# RHEL 10 / Fedora 41+
dnf install dovecot
Код: Выделить всё
doveconf -n # только то, что отличается от значений по умолчанию
doveconf -a | less # вообще всё
dovecot -n # эквивалент, старый способ
Код: Выделить всё
# 10-master.conf или dovecot.conf
protocols = imap pop3 lmtp
# 10-mail.conf - где и в каком формате лежит почта
mail_location = maildir:~/Maildir
# для mbox было бы: mbox:~/mail:INBOX=/var/mail/%u
Код: Выделить всё
# 10-auth.conf
disable_plaintext_auth = yes # пароли только поверх TLS
auth_mechanisms = plain login
passdb {
driver = pam
}
userdb {
driver = passwd # uid/home/mail из /etc/passwd
}
Код: Выделить всё
# 10-ssl.conf
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.org/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.org/privkey.pem
ssl_min_protocol = TLSv1.2
Код: Выделить всё
# Dovecot, 10-master.conf
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
# Postfix, main.cf
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
Код: Выделить всё
systemctl restart dovecot
systemctl status dovecot
ss -ltnp | grep -E '993|995|143|110'
Код: Выделить всё
openssl s_client -connect mail.example.org:993 -quiet
a login user@example.org пароль
a list "" "*"
a select INBOX
a logout
Код: Выделить всё
doveadm auth test user@example.org # проверить, проходит ли аутентификация
doveadm mailbox list -u user@example.org
journalctl -u dovecot -f # смотрим ошибки в реальном времени
- Путаница passdb и userdb. passdb проверяет пароль, userdb выдаёт uid и путь к ящику. Логин не проходит - смотри passdb, логин прошёл но ящик пустой или не тот - смотри userdb и mail_location.
- Несовпадение формата с Postfix. Если Postfix доставляет в mbox (/var/mail), а Dovecot настроен на maildir:~/Maildir - письма приходят, но клиент их не видит. Формат и путь должны совпадать на обоих концах. Чище всего отдать доставку самому Dovecot через LMTP.
- disable_plaintext_auth = yes без TLS. Получишь Plaintext authentication disallowed - клиент не залогинится, пока не поднят STARTTLS или порт 993/995.
- Права на сокет SASL. Если Postfix в chroot (/var/spool/postfix), сокет auth должен лежать внутри этого дерева, иначе SMTP-аутентификация молча не работает.
- Maildir не создан. При первом входе ящик может не появиться сам - проверь автосоздание или сделай каталог заранее с правильным владельцем.
- Самоподписанный сертификат. Мобильные клиенты молча отказываются подключаться. Для рабочего сервера нужен доверенный сертификат с именем, совпадающим с хостом из настроек клиента.
- Установи Dovecot и включи протоколы imap и lmtp, формат хранения maildir в домашнем каталоге.
- Настрой passdb на PAM и userdb на passwd, запрети plaintext auth.
- Выпусти или подложи тестовый сертификат, укажи ssl_cert и ssl_key, поставь ssl = required.
- Перезапусти dovecot, проверь doveconf -n и открытые порты через ss.
- Подключись openssl s_client к 993, выполни login, list и select INBOX вручную.
- Прокинь сокет SASL в Postfix, включи smtpd_sasl и отправь письмо с аутентификацией.
- Через doveadm auth test и journalctl убедись, что и чтение, и отправка идут через один auth.
- Чем принципиально отличается модель работы POP3 от IMAP и почему IMAP предпочтителен при нескольких устройствах?
- За что отвечает passdb и за что userdb, и как по симптому понять, в какой из них проблема?
- Какие подкаталоги есть у Maildir и какую роль играет каждый по сравнению с одним файлом mbox?
- Какие порты слушает Dovecot для IMAP и POP3 и чем implicit TLS (993/995) отличается от STARTTLS (143/110)?
- Как Dovecot становится сервером аутентификации для Postfix и зачем выносить сокет auth в каталог Postfix?
- Что делает параметр disable_plaintext_auth и к какой ошибке клиента он приведёт без включённого TLS?