Почтовый сервер · 3 min read · Oct 06, 2025
Полное решение почтового сервера с виртуальными доменами и пользователями (Debian Etch, Postfix, Mysql, Dovecot, DSpam, ClamAV, Postgrey, RBL) - Страница 4
B. Настройка Postfix для виртуальных пользователей и доменов
Хотя почтовые обменники не будут доставлять почту виртуальным пользователям и доменам, они будут отклонять на основе действительных/недействительных адресов. Поэтому нам нужно, чтобы mx-серверы могли подключаться к SQL-серверу для проверки адресов. Введите информацию в postconf:
# postconf -e 'virtual_alias_domains ='
# postconf -e 'virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf'
# postconf -e 'virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf'
# postconf -e 'virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf'
# postconf -e 'virtual_mailbox_base = /vmail'
# postconf -e 'virtual_minimum_uid = 150'
# postconf -e 'virtual_uid_maps = static:150'
# postconf -e 'virtual_gid_maps = static:8'
# postconf -e 'virtual_create_maildirsize = yes'
# postconf -e 'virtual_mailbox_extended = yes'
# postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf'
# postconf -e 'virtual_mailbox_limit_override = yes'
# postconf -e 'virtual_maildir_limit_message = "Пользователь, к которому вы пытаетесь обратиться, превысил свою квоту."
# postconf -e 'virtual_overquota_bounce = yes'
# postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql_virtual_transports.cf'Здесь есть несколько “подводных камней”. Эта конфигурация будет хранить почтовые ящики виртуальных пользователей в /vmail. Если вам нужно хранить ваши почтовые ящики в другом месте, измените строку virtual_mailbox_base соответственно.
Параметры virtual_minimum_uid и virtual_uid_maps указывают на идентификатор пользователя 150. Этот идентификатор пользователя предназначен для специально созданного пользователя “Виртуальная почта”. Он использует стандартную группу “mail” с идентификатором группы по умолчанию (Debian) 8. Вы можете создать пользователя и директорию следующим образом:
# useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "Виртуальный почтовый ящик" vmail
# mkdir /var/vmail
# chmod 770 /var/vmail/
# chown vmail:mail /var/vmail/Теперь нам нужно установить инструменты клиента NFS:
# apt-get install nfs-common portmapДиректория затем должна быть смонтирована на NFS-общий ресурс. Для простого теста выполните следующее:
# mount files-1.internal.example.com:/vmail /vmailТеперь у вас должен быть доступ к общему ресурсу /vmail с files-1. Попробуйте создать файл (это не должно сработать!):
# cd /vmail
# touch tmpПРИМЕЧАНИЕ: Вы должны получить ошибку только для чтения!
Предполагая, что все работает, выполните размонтирование NFS:
# cd /
umount /vmailА затем сделайте монтирование постоянным, добавив следующее в ваш /etc/fstab:
[...]
files-1.internal.example.com:/vmail /vmail nfs ro,rsize=4096,hard,intr,tcp,noatime,nodev,async 0 0Теперь смонтируйте файловую систему в последний раз:
# mount /vmail… и вы готовы к работе!
C. Конфигурация Postfix MySQL
Postfix был установлен с поддержкой MySQL, но это не означает, что он уже знает, как использовать нашу базу данных. Ему необходимо предоставить различную информацию о SQL-запросах для каждого типа таблицы в нашей базе данных. Эта информация хранится в файлах MySQL, определенных в файле main.cf. Обратите внимание, что в следующих файлах последняя строка содержит один комментарий (предшествующий #) с полным запросом. Последние версии Postfix могут использовать это вместо других операторов. Если вы используете более новую версию, просто закомментируйте все остальные строки и раскомментируйте оператор запроса.
/etc/postfix/mysql_virtual_alias_maps.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'/etc/postfix/mysql_virtual_domains_maps.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'/etc/postfix/mysql_virtual_mailbox_limit_maps.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = mailbox
select_field = quota
where_field = username
additional_conditions = and active = '1'
#query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'/etc/postfix/mysql_virtual_mailbox_maps.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = mailbox
select_field = CONCAT(domain,'/',maildir)
where_field = username
additional_conditions = and active = '1'
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'/etc/postfix/mysql_virtual_transports.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = domain
select_field = transport
where_field = domain
additional_conditions = and active = '1'
#query = SELECT transport FROM domain WHERE domain='%s' AND active = '1'Get new posts in your inbox
No spam. Unsubscribe anytime.