下面给你一个在 Debian 上部署邮件服务器(SMTP + IMAP/POP3)的完整实战流程,适合生产环境,基于 Postfix + Dovecot + MariaDB + Let’s Encrypt。
cat /etc/debian_version
推荐:
mail.example.com)假设你的域名是:
example.com
| 类型 | 名称 | 值 |
|---|---|---|
| A | mail.example.com | 服务器公网 IP |
| MX | example.com | mail.example.com(优先级 10) |
| TXT | example.com | v=spf1 mx ~all |
| TXT | _dmarc.example.com | v=DMARC1; p=quarantine; rua=mailto:admin@example.com |
✅ PTR 反向解析(必须)
mail.example.comapt update
apt install -y \
postfix \
dovecot-core dovecot-imapd dovecot-pop3d \
dovecot-mysql \
mariadb-server \
postfix-mysql \
certbot python3-certbot-nginx
mysql_secure_installation
CREATE DATABASE mailserver;
GRANT ALL ON mailserver.* TO 'mailuser'@'localhost' IDENTIFIED BY 'StrongPassword';
FLUSH PRIVILEGES;
USE mailserver;
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(255) 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
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
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_mailbox_base = /var/mail/vhosts
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination
/etc/postfix/mysql-domains.cfuser = mailuser
password = StrongPassword
dbname = mailserver
query = SELECT domain FROM domains WHERE domain='%s'
/etc/postfix/mysql-users.cfuser = mailuser
password = StrongPassword
dbname = mailserver
query = SELECT email FROM users WHERE email='%s'
/etc/postfix/mysql-aliases.cfuser = mailuser
password = StrongPassword
dbname = mailserver
query = SELECT destination FROM aliases WHERE source='%s'
/etc/dovecot/dovecot.confprotocols = imap pop3
listen = *
/etc/dovecot/conf.d/10-mail.confmail_location = maildir:/var/mail/vhosts/%d/%n
/etc/dovecot/conf.d/10-auth.confdisable_plaintext_auth = no
auth_mechanisms = plain login
!include auth-sql.conf.ext
/etc/dovecot/conf.d/auth-sql.conf.extpassdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=5000 gid=5000 home=/var/mail/vhosts/%d/%n
}
/etc/dovecot/dovecot-sql.conf.extdriver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=StrongPassword
default_pass_scheme = SHA256-CRYPT
password_query = SELECT email AS user, password FROM users WHERE email='%u'
certbot certonly --standalone -d mail.example.com
自动续期:
systemctl enable certbot.timer
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail/vhosts -m
mkdir -p /var/mail/vhosts
chown -R vmail:vmail /var/mail/vhosts
systemctl restart postfix dovecot
systemctl enable postfix dovecot
telnet mail.example.com 25
mail.example.com 993(SSL)mail.example.com 587(STARTTLS)user@example.com✅ 安装:
apt install spamassassin clamav
✅ 配置:
❌ 25 端口被封
❌ 能发不能收
❌ 被当垃圾邮件
Postfix (SMTP)
↓
Dovecot (IMAP/POP3)
↓
MariaDB (用户)
↓
Let's Encrypt (SSL)
如果你愿意,我可以:
✅ 给你 一键部署脚本
✅ 帮你 排查具体报错
✅ 配置 DKIM / 反垃圾
✅ 用 Docker 方式部署
只要告诉我你目前的 Debian 版本和网络环境即可。