Postfix — это MTA (Mail Transfer Agent), отвечающий за приём и отправку писем по протоколу SMTP. Мы установили его на выделенном сервере с 16 ГБ RAM и 500 ГБ SSD.
# Устанавливаем Postfix, Dovecot и вспомогательные пакеты
sudo apt update && sudo apt install -y \
postfix postfix-mysql postfix-policyd-spf-python \
dovecot-core dovecot-imapd dovecot-lmtpd dovecot-pop3d \
dovecot-sieve dovecot-managesieved dovecot-mysql \
certbot mysql-server
# При установке Postfix выбираем: Internet Site
# System mail name: pravpartner.ru
# /etc/postfix/main.cf
# === ОСНОВНЫЕ ПАРАМЕТРЫ ===
smtpd_banner = $myhostname ESMTP
myhostname = mail.pravpartner.ru
mydomain = pravpartner.ru
myorigin = $mydomain
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
# === TLS ===
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.pravpartner.ru/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.pravpartner.ru/privkey.pem
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_ciphers = medium
smtp_tls_security_level = may
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
tls_medium_cipherlist = AES128+EECDH:AES128+EDH
# === SASL-АУТЕНТИФИКАЦИЯ (через Dovecot) ===
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
# === ВИРТУАЛЬНЫЕ ДОМЕНЫ (MySQL) ===
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailboxes.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-aliases.cf
# === ОГРАНИЧЕНИЯ ===
smtpd_helo_required = yes
smtpd_helo_restrictions =
permit_mynetworks,
reject_non_fqdn_helo_hostname,
reject_invalid_helo_hostname
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
check_policy_service unix:private/policyd-spf
smtpd_sender_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_sender,
reject_unknown_sender_domain
# === MILTER (Rspamd + DKIM) ===
milter_protocol = 6
milter_default_action = accept
smtpd_milters = inet:localhost:11332
non_smtpd_milters = $smtpd_milters
milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}
# === ЛИМИТЫ ===
message_size_limit = 52428800 # 50 MB
smtpd_client_message_rate_limit = 100
smtpd_client_recipient_rate_limit = 200
# Создаём базу данных для почтового сервера
mysql -u root -p << 'SQL'
CREATE DATABASE mailserver CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'mailuser'@'localhost' IDENTIFIED BY 'M@il$erver#2026!';
GRANT SELECT ON mailserver.* TO 'mailuser'@'localhost';
FLUSH PRIVILEGES;
USE mailserver;
CREATE TABLE virtual_domains (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL UNIQUE
);
CREATE TABLE virtual_users (
id INT AUTO_INCREMENT PRIMARY KEY,
domain_id INT NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
quota BIGINT DEFAULT 2147483648, -- 2 GB
active TINYINT DEFAULT 1,
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
);
CREATE TABLE virtual_aliases (
id INT AUTO_INCREMENT PRIMARY KEY,
domain_id INT NOT NULL,
source VARCHAR(255) NOT NULL,
destination VARCHAR(255) NOT NULL,
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
);
INSERT INTO virtual_domains (name) VALUES ('pravpartner.ru');
SQL
# Конфигурация Postfix → MySQL
sudo tee /etc/postfix/mysql-virtual-domains.cf > /dev/null << 'EOF'
user = mailuser
password = M@il$erver#2026!
hosts = 127.0.0.1
dbname = mailserver
query = SELECT name FROM virtual_domains WHERE name='%s'
EOF
sudo tee /etc/postfix/mysql-virtual-mailboxes.cf > /dev/null << 'EOF'
user = mailuser
password = M@il$erver#2026!
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s' AND active=1
EOF
sudo tee /etc/postfix/mysql-virtual-aliases.cf > /dev/null << 'EOF'
user = mailuser
password = M@il$erver#2026!
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'
EOF
sudo chmod 640 /etc/postfix/mysql-*.cf
sudo chown root:postfix /etc/postfix/mysql-*.cf