Как ни странно, данный топик будет не вопросом и криком о помощи, а сразу ответом.

К сожалению, многочисленные HOWTO на просторах сети на тему
как настроить связку Postfix+Dovecot с аутентификацией через MySQL базу написаны не всегда хорошо и понятно, некоторые даже не учитывают текущие особенности используемого софта.
Расскажу, пожалуй, как я реализовал вышеупомянутое прочтения всевозможных доков и некоторых мытарств.
Есть система под Debian GNU/Linux squeeze. Необходимо поднять ни от чего не зависящий почтовый сервер на базе Postfix в качестве MTA и Dovecot в качестве POP3/IMAP сервера с виртуальными (не системными) пользователями почты. Для удобства хотелось бы иметь единую базу пользователей, хранимую в MySQL базе, точнее единственной её таблице.
Под названиями большинства конфигурационных параметров приведены ссылки на соответствующие упоминания их в документации для более глубокого понимания их назначения.
Шаг 1- Устанавливаем Postfix (пакеты postfix и postfix-mysql). В моём случае это версия 2.7.1.
- Устанавливаем Dovecot (пакеты dovecot-common, dovecot-imapd, dovecot-pop3d). Версия 1.2.13.
Шаг 2Конфигурируем Postfix. Редактируем файл
/etc/postfix/main.cf.
Кроме уже имеющихся там настроек по умолчанию (вполне годных за небольшими исключениям) добавляем следующие:
# директория для хранения почты
virtual_mailbox_base = /var/mail
# источник списка обслуживаемых доменов (отдельный конфиг с описанием SQL запроса)
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_mailbox_domains.cf
# источник списка обслуживаемых почтовых ящиков (отдельный конфиг с описанием SQL запроса)
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailbox_maps.cf
# меняем минимально возможный UID владельца (по умолчанию = 100)
virtual_minimum_uid = 8
# задаём цифровой UID владельца (mail) файлов почтовых ящиков (можно уточнить в /etc/passwd), теоретически можно использовать любого пользователя
virtual_uid_maps = static:8
# задаём цифровой GID группы владельца (mail) файлов почтовых ящиков (можно уточнить в /etc/group), теоретически можно использовать любую группу
virtual_gid_maps = static:8
Если необходима аутентификация пользователей при отправке почты (обычно в случае если отправка почты происходит с иных, кроме определённых в mynetworks, хостов), то добавляем также следующее:
smtpd_sasl_auth_enable = yes
# отправлять почту могут только разрешённые хосты и аутентифицированные пользователи
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
smtpd_sasl_security_options = noanonymous
# тип аутентификации, выполните команду postconf -a, чтобы определить, поддерживает ли его ваш Postfix
smtpd_sasl_type=dovecot
# относительный (относительно директории очереди Postfix, по умолчанию - /var/spool/postfix) путь к служебным данным для аутентификации через Dovecot
# также см. секцию "auth default" → "socket listen" → "client" в /etc/dovecot/dovecot.conf, значения должны соответстовать
smtpd_sasl_path=private/auth
Шаг 3На MySQL сервере создаём базу данных (если необходима отдельная) и таблицу для хранения данных о пользователях почты. Пример запроса, создающего структуры таблицы:
CREATE TABLE `users` (
`username` varchar(64) NOT NULL,
`domain` varchar(255) NOT NULL,
`password` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`maildir` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`username`,`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Колонка
username будет содержать имя пользователя (т.е. someuser из someuser@mydomain.com),
domain — имя домена (на случай если ваш почтовый сервер будет обслуживать несколько различных доменов),
password — пароль открытым текстом,
maildir — относительный (внутри /var/mail) путь к файлу почтового ящика, где будет храниться приходящая почта, т.е. например mydomain.com/someuser или же someuser@mydomain.com.
При необходимости данную таблицу можно создавать в любой удобной вам базе, но не забудьте о разграничении доступа!
Затем выдаём права на выборку и создаём пользователя для подключения:
GRANT SELECT ON имя_БД.users TO 'имя_пользователя_БД'@'localhost' IDENTIFIED BY 'пароль_пользователя_БД'
Шаг 4Далее создадим необходимые подконфиги Postfix с запросами к MySQL.
файл
/etc/postfix/mysql-virtual_mailbox_domains.cfhosts = 127.0.0.1
user = имя пользователя БД
password = пароль пользователя БД
dbname = имя базы данных
query = SELECT `domain` FROM `users` WHERE `domain`='%s' LIMIT 1
Запрос получает имя домена в случае, если оно существует (есть хотя бы один пользователь на нём).
файл
/etc/postfix/mysql-virtual_mailbox_maps.cfhosts = 127.0.0.1
user = имя пользователя БД
password = пароль пользователя БД
dbname = имя базы данных
query = SELECT `maildir` FROM `users` WHERE CONCAT(`username`,'@',`domain`)='%s'
Запрос получает путь к почтовому ящику по заданном e-mail адресу.
Не забудьте установить на данные конфигурационные файлы безопасные права, чтобы избежать кражи реквизитов к БД и данных о пользователях почты.
chmod 0640 mysql-virtual_mailbox_domains.cf mysql-virtual_mailbox_maps.cf
chown root:postfix mysql-virtual_mailbox_domains.cf mysql-virtual_mailbox_maps.cf
Задаём файлам доступ на чтение и запись для владельца файла и доступ только на чтение для группы. Задаём владельца root и группу postfix. Любые другие пользователи не смогут получить доступ к содержимому данных конфигов.
Шаг 5Конфигурируем Dovecot. Редактируем файл
/etc/dovecot/dovecot.conf.
Несмотря на длину конфига по умолчанию, учитывающего всевозможные варианты конфигурации, действительно необходимого для данного примера там совсем немного. Можно оставить лишь следующее:
base_dir = /var/run/dovecot
# обслуживаемые протоколы
protocols = imap imaps pop3 pop3s
# аутентификация открытым текстом НЕ запрещена
disable_plaintext_auth = no
log_timestamp = "%Y-%m-%d %H:%M:%S "
login_user = dovecot
login_processes_count = 1
login_max_connections = 20
# задаём путь к файлам почтовых ящиков для входящей почты (обратите внимание, его же должен использовать и Postfix! согласуйте значение mbox с параметром virtual_mailbox_base в /etc/postfix/main.cf и значениями колонки maildir в таблице пользователей) и путь к директории для её хранения (тот, откуда будет отдаваться почта по POP3/IMAP протоколам, и где будут храниться данные IMAP папок)
mail_location = mbox:/var/mail/%d/%u:INBOX=/var/mail/%d/%n
# UID владельца файлов и папок
mail_uid = mail
# GID владельца файлов и папок
mail_gid = mail
mail_privileged_group = mail
first_valid_uid = 8
last_valid_uid = 8
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
auth default {
mechanisms = plain login
# ссылки на подконфиг с запросами к БД
userdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
# следующая секция необходима только при использования аунтентификации в Postfix
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
#
}
файл
/etc/dovecot/dovecot-sql.confdriver = mysql
connect = host=127.0.0.1 user=имя_пользователя_БД password=пароль_пользователя_БД dbname=имя_БД
# указываем, что в таблице хранятся пароли открытым текстом
default_pass_scheme = PLAIN
# запрос получения имени пользователя
user_query = SELECT `username` FROM `users` WHERE `username`='%n' AND `domain`='%d'
# запрос получения пароля
password_query = SELECT `password` FROM `users` WHERE `username`='%n' AND `domain`='%d'
Не забываем обезопасить реквизиты БД путём задания 0600 прав на dovecot-sql.conf.
Шаг 6Остаётся добавить необходимые данные в таблицу с пользователями. При внесении в неё изменений перезапуск Postfix или Dovecot не требуется. Недостающие файлы и директории для хранения почты будут создаваться автоматически.
Хотелось бы услышать комментарии и поправки, если вдруг чего-то упустил.
