在 Debian 上搭建支持多域名的邮件服务器,常见做法是使用 Postfix + Dovecot + MySQL(或 PostgreSQL),通过虚拟域名/虚拟用户来实现。下面给你一个实战型思路 + 关键配置示例,适用于 Debian 11/12。
✅ Postfix:SMTP(发信 / 收信)
✅ Dovecot:IMAP / POP3
✅ MySQL:存储多域名、用户、别名
✅ PostfixAdmin(可选):Web 管理多域名
✅ Let’s Encrypt:SSL 证书(每个域名)
支持:
example.com、test.comuser@example.com、user@test.comapt update
apt install postfix postfix-mysql dovecot-core dovecot-imapd \
dovecot-lmtpd dovecot-mysql mariadb-server
CREATE DATABASE mailserver;
GRANT ALL ON mailserver.* TO 'mailuser'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
CREATE TABLE domains (
id INT AUTO_INCREMENT PRIMARY KEY,
domain VARCHAR(50) NOT NULL UNIQUE
);
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
domain_id INT NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
FOREIGN KEY (domain_id) REFERENCES domains(id)
);
CREATE TABLE aliases (
id INT AUTO_INCREMENT PRIMARY KEY,
source VARCHAR(100),
destination VARCHAR(100)
);
/etc/postfix/main.cfmyhostname = mail.example.com
mydestination = localhost
virtual_mailbox_domains = mysql:/etc/postfix/mysql-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-users.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-aliases.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp
⚠️ 不要把多域名写进 mydestination,否则会变成系统用户。
/etc/postfix/mysql-domains.cfuser = mailuser
password = password
hosts = 127.0.0.1
dbname = mailserver
query = SELECT domain FROM domains WHERE domain='%s'
/etc/postfix/mysql-users.cfuser = mailuser
password = password
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM users WHERE email='%s'
/etc/dovecot/conf.d/10-mail.confmail_location = maildir:/var/mail/vhosts/%d/%n
目录结构:
/var/mail/vhosts/
├── example.com/
│ └── user/
├── test.com/
│ └── user/
/etc/dovecot/conf.d/auth-sql.conf.extpassdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
/etc/dovecot/dovecot-sql.conf.extdriver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=password
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email AS user, password FROM users WHERE email='%u';
virtual_transport = lmtp:unix:private/dovecot-lmtp
protocols = imap lmtp
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
user = postfix
group = postfix
mode = 0600
}
}
certbot certonly --standalone -d mail.example.com
certbot certonly --standalone -d mail.test.com
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
✅ SNI 支持(Postfix 3.4+)
smtpd_tls_chain_files =
/etc/letsencrypt/live/mail.example.com/privkey.pem,
/etc/letsencrypt/live/mail.example.com/fullchain.pem
/etc/letsencrypt/live/mail.test.com/privkey.pem,
/etc/letsencrypt/live/mail.test.com/fullchain.pem
MX example.com → mail.example.com
A mail.example.com → 服务器IP
TXT v=spf1 mx ~all
✅ 不会,通过 domain_id + email 区分
✅ 可以,标准做法
✅ PostfixAdmin(支持多域名、多用户、别名)
Debian 邮件服务器多域名 = Postfix 虚拟域名 + MySQL + Dovecot 虚拟用户 + 正确 DNS/SSL
如果你愿意,我可以:
你现在用的是 Debian 几?已经装了 Postfix 吗?