Postfix и MySQL · 6 min read · Oct 07, 2025

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

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

По умолчанию MySQL устанавливается без пароля для root, который мы сразу изменим (замените yourrootsqlpassword на желаемый пароль):

mysqladmin -u root password yourrootsqlpassword

Теперь создадим базу данных с именем 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), то квадратные скобки не используются.).

Кстати, (предполагаю, что IP-адрес вашей почтовой системы 192.168.0.100) вы можете получить доступ к phpMyAdmin через http://192.168.0.100/phpmyadmin/ в браузере и войти как mail_admin. Затем вы сможете просмотреть базу данных. Позже вы сможете использовать phpMyAdmin для администрирования вашего почтового сервера.

5 Настройка 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-окружение, что вызывает некоторые другие проблемы).

Пожалуйста, убедитесь, что /etc/mysql/my.cnf содержит следующую строку:

vi /etc/mysql/my.cnf

| [...] bind-address = 127.0.0.1 [...] |

Если вам пришлось изменить /etc/mysql/my.cnf, пожалуйста, перезапустите MySQL сейчас:

/etc/init.d/mysql restart

Запустите

netstat -tap

чтобы убедиться, что MySQL слушает на 127.0.0.1 (localhost.localdomain):

server1:/usr/src# netstat -tap  
 Активные интернет-соединения (серверы и установленные)  
 Протокол  Recv-Q  Send-Q  Локальный адрес           Удаленный адрес         Состояние       PID/Имя программы  
 tcp        0      0 localhost.localdo:mysql *:*                     LISTEN     3003/mysqld  
 tcp        0      0 *:sunrpc                *:*                     LISTEN     1684/portmap  
 tcp        0      0 *:auth                  *:*                     LISTEN     2036/inetd  
 tcp        0      0 *:1522                  *:*                     LISTEN     2077/rpc.statd  
 tcp        0      0 *:smtp                  *:*                     LISTEN     12053/master  
 tcp6       0      0 *:imaps                 *:*                     LISTEN     3839/couriertcpd  
 tcp6       0      0 *:pop3s                 *:*                     LISTEN     3629/couriertcpd  
 tcp6       0      0 *:pop3                  *:*                     LISTEN     3572/couriertcpd  
 tcp6       0      0 *:imap2                 *:*                     LISTEN     3792/couriertcpd  
 tcp6       0      0 *:www                   *:*                     LISTEN     3712/apache2  
 tcp6       0      0 *:ssh                   *:*                     LISTEN     2058/sshd  
 tcp6       0    148 server1.example.com:ssh ::ffff:192.168.0.2:4515 ESTABLISHED2139/0

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

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_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'

После этого мы создаем 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
<-- Введите название вашей страны (например, "DE").  
 <-- Введите название вашего штата или провинции.  
 <-- Введите название вашего города.  
 <-- Введите название вашей организации (например, название вашей компании).  
 <-- Введите название вашего подразделения (например, "IT-отдел").  
 <-- Введите полностью квалифицированное доменное имя системы (например, "server1.example.com").  
 <-- Введите ваш адрес электронной почты.

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

chmod o= /etc/postfix/smtpd.key
Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.