Postfix и MySQL · 6 min read · Jan 11, 2026

Виртуальные пользователи и домены с Postfix, Courier, MySQL и SquirrelMail (Mandriva 2010.0 x86_64) - Страница 2

5 Создание базы данных MySQL для Postfix/Courier

Мы создаем базу данных с именем mail:

mysqladmin -u root -p create mail

Далее мы переходим в оболочку MySQL:

mysql -u root -p

В оболочке MySQL мы создаем пользователя mail_admin с паролем mail_admin_password (замените его на пароль по вашему выбору), который имеет привилегии SELECT, INSERT, UPDATE, DELETE на базе данных mail. Этот пользователь будет использоваться Postfix и Courier для подключения к базе данных mail:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';  
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';  
FLUSH PRIVILEGES;

Все еще в оболочке MySQL мы создаем таблицы, которые нужны Postfix и Courier:

USE mail;
CREATE TABLE domains (  
domain varchar(50) NOT NULL,  
PRIMARY KEY (domain) )  
TYPE=MyISAM;
CREATE TABLE forwardings (  
source varchar(80) NOT NULL,  
destination TEXT NOT NULL,  
PRIMARY KEY (source) )  
TYPE=MyISAM;
CREATE TABLE users (  
email varchar(80) NOT NULL,  
password varchar(20) NOT NULL,  
quota INT(10) DEFAULT '10485760',  
PRIMARY KEY (email)  
) TYPE=MyISAM;
CREATE TABLE transport (  
domain varchar(128) NOT NULL default '',  
transport varchar(128) NOT NULL default '',  
UNIQUE KEY domain (domain)  
) TYPE=MyISAM;
quit;

Как вы могли заметить, с помощью команды quit; мы вышли из оболочки MySQL и вернулись в оболочку Linux.

Таблица domains будет хранить каждый виртуальный домен, для которого Postfix должен получать электронные письма (например, example.com).

domain
example.com

Таблица forwardings предназначена для алиасов одного адреса электронной почты на другой, например, пересылки писем для [email protected] на [email protected].

sourcedestination
[email protected][email protected]

Таблица users хранит всех виртуальных пользователей (т.е. адреса электронной почты, поскольку адрес электронной почты и имя пользователя совпадают) и пароли (в зашифрованной форме!) и значение квоты для каждого почтового ящика (в этом примере значение по умолчанию составляет 10485760 байт, что означает 10 МБ).

emailpasswordquota
[email protected]No9.E4skNvGa. (“секрет” в зашифрованной форме)10485760

Таблица transport является необязательной, она предназначена для опытных пользователей. Она позволяет пересылать письма для отдельных пользователей, целых доменов или всех писем на другой сервер. Например,

domaintransport
example.comsmtp:[1.2.3.4]

будет пересылать все электронные письма для example.com через протокол smtp на сервер с IP-адресом 1.2.3.4 (квадратные скобки [] означают “не выполнять поиск MX DNS-записи” (что имеет смысл для IP-адресов…). Если вы используете полное доменное имя (FQDN), то квадратные скобки не используются.).

6 Настройка Postfix

Теперь мы должны сказать Postfix, где он может найти всю информацию в базе данных. Для этого нам нужно создать шесть текстовых файлов. Вы заметите, что я говорю Postfix подключаться к MySQL по IP-адресу 127.0.0.1 вместо localhost. Это связано с тем, что Postfix работает в chroot-окружении и не имеет доступа к сокету MySQL, к которому он пытался бы подключиться, если бы я сказал Postfix использовать localhost. Если я использую 127.0.0.1, Postfix использует TCP-сетевое соединение для подключения к MySQL, что не является проблемой даже в chroot-окружении (альтернативой было бы перемещение сокета MySQL в chroot-окружение, что вызывает некоторые другие проблемы).

Теперь давайте создадим наши шесть текстовых файлов.

vi /etc/postfix/mysql-virtual_domains.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_forwardings.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailboxes.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_email2email.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |

chmod o= /etc/postfix/mysql-virtual_*.cf  
chgrp postfix /etc/postfix/mysql-virtual_*.cf

Теперь мы создаем пользователя и группу с именем vmail с домашним каталогом /home/vmail. Здесь будут храниться все почтовые ящики.

groupadd -g 5000 vmail  
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Далее мы выполняем некоторую настройку Postfix. Убедитесь, что вы заменили server1.example.com на действительное FQDN, в противном случае ваш Postfix может работать неправильно!

postconf -e 'myhostname = server1.example.com'  
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'  
postconf -e 'mynetworks = 127.0.0.0/8'  
postconf -e 'virtual_alias_domains ='  
postconf -e ' virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'  
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'  
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'  
postconf -e 'virtual_mailbox_base = /home/vmail'  
postconf -e 'virtual_uid_maps = static:5000'  
postconf -e 'virtual_gid_maps = static:5000'  
postconf -e 'smtpd_sasl_auth_enable = yes'  
postconf -e 'broken_sasl_auth_clients = yes'  
postconf -e 'smtpd_sasl_authenticated_header = yes'  
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'  
postconf -e 'smtpd_use_tls = yes'  
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'  
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'  
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'  
postconf -e 'virtual_create_maildirsize = yes'  
postconf -e 'virtual_maildir_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 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'  
postconf -e 'inet_interfaces = all'  
postconf -e 'alias_database = hash:/etc/postfix/aliases'  
postconf -e 'alias_maps = hash:/etc/postfix/aliases'

После этого мы создаем SSL-сертификат, который необходим для TLS:

cd /etc/postfix  
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Country Name (2 letter code) [GB]: <– Введите название вашей страны (например, “DE”).
State or Province Name (full name) [Berkshire]: <– Введите название вашего штата или провинции.
Locality Name (eg, city) [Newbury]: <– Введите ваш город.
Organization Name (eg, company) [My Company Ltd]: <– Введите название вашей организации (например, название вашей компании).
Organizational Unit Name (eg, section) []: <– Введите название вашего подразделения (например, “IT Department”).
Common Name (eg, your name or your server’s hostname) []: <– Введите полное доменное имя системы (например, “server1.example.com”).
Email Address []: <– Введите ваш адрес электронной почты.

Затем измените разрешения для smtpd.key:

chmod o= /etc/postfix/smtpd.key

7 Настройка Saslauthd

Отредактируйте /etc/sasl2/smtpd.conf. Он должен выглядеть так:

vi /etc/sasl2/smtpd.conf

| # Конфигурационный файл библиотеки SASL для postfix # все параметры задокументированы в: # /usr/share/doc/cyrus-sasl/options.html # Параметры mech_list перечисляют механизмы sasl, которые следует использовать, # по умолчанию все механизмы, найденные. #mech_list: plain login # Для аутентификации с использованием отдельного демона saslauthd, (например, для # системных или ldap пользователей). Также см. /etc/sysconfig/saslauthd. #pwcheck_method: saslauthd #saslauthd_path: /var/lib/sasl2/mux # Для аутентификации против пользователей, хранящихся в sasldb. #pwcheck_method: auxprop #auxprop_plugin: sasldb #sasldb_path: /var/lib/sasl2/sasl.db pwcheck_method: authdaemond log_level: 3 mech_list: PLAIN LOGIN authdaemond_path:/var/lib/authdaemon/socket |

Затем создайте системные ссылки для автозагрузки Postfix и запустите Postfix, saslauthd и courier-authdaemon:

chmod 755 /var/lib/authdaemon  
chkconfig postfix on  
/etc/init.d/courier-authdaemon start  
/etc/init.d/postfix restart  
/etc/init.d/saslauthd start

8 Настройка Courier

Теперь мы должны сказать Courier, что он должен аутентифицироваться против нашей базы данных MySQL. Сначала отредактируйте /etc/courier/authdaemonrc и измените значение authmodulelist так, чтобы оно выглядело следующим образом:

vi /etc/courier/authdaemonrc

| [...] authmodulelist="authmysql" #authmodulelist="authpam authpwd authshadow" [...] |

Затем отредактируйте /etc/courier/authmysqlrc. Он должен выглядеть точно так же (опять же, убедитесь, что вы заполнили правильные данные базы данных):

cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig  
cat /dev/null > /etc/courier/authmysqlrc  
vi /etc/courier/authmysqlrc

| MYSQL_SERVER localhost MYSQL_USERNAME mail_admin MYSQL_PASSWORD mail_admin_password MYSQL_PORT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE users MYSQL_CRYPT_PWFIELD password #MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/home/vmail" MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') #MYSQL_NAME_FIELD MYSQL_QUOTA_FIELD quota |

Затем перезапустите Courier:

/etc/init.d/courier-authdaemon restart  
/etc/init.d/courier-imapd restart  
/etc/init.d/courier-pop3d restart

Запустив

telnet localhost pop3

вы можете проверить, работает ли ваш POP3-сервер правильно. Он должен вернуть +OK Hello there . (введите quit, чтобы вернуться в оболочку Linux):

[root@server1 postfix]# telnet localhost pop3  
Trying 127.0.0.1...  
Connected to localhost.localdomain (127.0.0.1).  
Escape character is '^]'.  
+OK Hello there.  
quit  
+OK Better luck next time.  
Connection closed by foreign host.  
[root@server1 postfix]#
Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.