本指南将采用目前最主流、功能最强大的开源邮件服务器组合:Postfix (SMTP) + Dovecot (IMAP/POP3) + MariaDB/MySQL (存储用户和域名) + SpamAssassin (反垃圾邮件) + ClamAV (反病毒)。

这个过程会很长,请耐心跟随每一步操作。
第一部分:准备工作与系统环境
系统要求
- 操作系统: CentOS 7 / CentOS 8 / CentOS Stream 9 (本指南以 CentOS 7 为例,但步骤大同小异)
- 服务器配置: 建议至少 2GB 内存,1 核 CPU,20GB 硬盘空间,配置越高,邮件处理能力越强。
- 服务器域名: 你必须拥有一个顶级域名,
yourdomain.com,所有邮件地址都将基于此域名,如user@yourdomain.com。 - 静态公网 IP: 服务器必须有一个固定的公网 IP 地址。
基础系统配置
以 root 用户或使用 sudo 权限登录你的服务器。
更新系统
yum update -y
设置主机名 主机名必须是 FQDN (Fully Qualified Domain Name) 格式。

hostnamectl set-hostname mail.yourdomain.com
执行后,重启服务器或重新登录,确保命令提示符更新。
配置防火墙 邮件服务器需要开放特定端口。
# 开放 SMTP (25), SMTPS (465), Submission (587), IMAP (143), IMAPS (993), POP3 (110), POP3S (995) 端口 firewall-cmd --permanent --add-service=smtp firewall-cmd --permanent --add-service=smtps firewall-cmd --permanent --add-service=submission firewall-cmd --permanent --add-service=imap firewall-cmd --permanent --add-service=imaps firewall-cmd --permanent --add-service=pop3 firewall-cmd --permanent --add-service=pop3s # 重新加载防火墙使配置生效 firewall-cmd --reload
配置 SELinux
SELinux 提供了高级安全,但配置起来比较复杂,为了简化安装过程,我们暂时将其设置为 permissive 模式(只记录警告,不阻止操作)。生产环境中强烈建议学习并正确配置 SELinux 策略。
# 临时设置为 permissive 模式,重启后失效 setenforce 0 # 永久设置为 permissive 模式 sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
第二部分:DNS 配置 (至关重要)
这是邮件服务器能否正常工作的关键,你需要到你的域名注册商(如阿里云、腾讯云、GoDaddy 等)的 DNS 管理页面添加以下记录。

A 记录
确保你的域名 yourdomain.com 的 mail 子域名指向你的服务器公网 IP。
类型: A
名称: mail
值: <你的服务器公网IP>
TTL: 默认
MX 记录
指定接收该域名邮件的服务器,通常指向 mail.yourdomain.com。
类型: MX
优先级: 10 (可以是 1-100,数字越小优先级越高)
名称: @ (代表 yourdomain.com)
值: mail.yourdomain.com
TTL: 默认
PTR 记录 (反向解析)
这个记录通常由你的服务器提供商(如VPS服务商或IDC)在后台配置,它将你的 IP 地址反向解析到你的域名 mail.yourdomain.com。PTR 记录必须与你的主机名一致,否则很多邮件服务器会拒绝你的邮件,如果无法自行配置,请联系你的服务商。
SPF 记录 (防止伪造发件人)
这是一个 TXT 记录,告诉其他邮件服务器哪些 IP 地址有权代表你的域名发送邮件。
类型: TXT
名称: @ (代表 yourdomain.com)
值: v=spf1 ip4:<你的服务器公网IP> ~all
v=spf1: SPF 版本 1。ip4:<你的服务器公网IP>: 指定允许发信的 IP。~all: “软失败”策略,如果收到来自非授权 IP 的邮件,可以接收但会标记为可疑,也可以用-all(硬失败,直接拒绝)。
DKIM 记录 (邮件签名)
用于验证邮件在传输过程中是否被篡改,我们将在安装 OpenDKIM 后生成此记录。
DMARC 记录 (策略发布)
基于 SPF 和 DKIM 的结果,告诉接收方如何处理不符合策略的邮件。
类型: TXT
名称: _dmarc
值: v=DMARC1; p=quarantine; rua=mailto:postmaster@yourdomain.com
p=quarantine: 表示策略是“隔离”(放入垃圾邮件箱),也可以是none(无策略) 或reject(拒绝)。
第三部分:安装核心组件
安装数据库和 Web 界面管理工具
我们将使用 MariaDB (MySQL 的一个分支) 来存储虚拟用户信息,并使用 PostfixAdmin 进行 Web 管理。
# 安装 MariaDB 和 PHP yum install -y mariadb-server mariadb php php-mysql php-imap php-mbstring php-json # 启动并设置开机自启 systemctl start mariadb systemctl enable mariadb
安装 Postfix (SMTP 服务器)
Postfix 负责发送和接收邮件。
# 安装 Postfix 和相关的数据库支持 yum install -y postfix postfix-mysql # 备份默认配置 cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
安装 Dovecot (IMAP/POP3 服务器)
Dovecot 负责用户从邮件客户端(如 Outlook, Foxmail, 手机邮件 App)收取邮件。
# 安装 Dovecot 及其 MySQL 支持 yum install -y dovecot dovecot-mysql
安装反垃圾邮件和反病毒工具
# 安装 SpamAssassin 和 ClamAV yum install -y spamassassin clamav clamav-update # 更新 ClamAV 病毒库 freshclam
第四部分:数据库配置
初始化数据库并创建用户
# 进入 MariaDB 命令行 mysql_secure_installation # 运行安全脚本,设置 root 密码,其他选项直接回车即可 # 登录数据库 mysql -u root -p
在 MariaDB 命令行中执行以下 SQL 语句:
-- 创建数据库 CREATE DATABASE mailserver CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建数据库用户,并设置密码(请替换为强密码) CREATE USER 'mailuser'@'localhost' IDENTIFIED BY 'your_strong_password'; -- 授予用户对数据库的所有权限 GRANT ALL PRIVILEGES ON mailserver.* TO 'mailuser'@'localhost'; -- 刷新权限使生效 FLUSH PRIVILEGES; -- 退出 EXIT;
创建数据表结构
创建一个 SQL 文件 mailserver.sql 并填入以下内容:
-- 创建虚拟域表 CREATE TABLE `virtual_domains` ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 创建虚拟用户表 CREATE TABLE `virtual_users` ( `id` INT NOT NULL AUTO_INCREMENT, `domain_id` INT NOT NULL, `password` VARCHAR(255) NOT NULL, -- 存储加密后的密码 `email` VARCHAR(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 创建虚拟别名表(可选,用于转发邮件) CREATE TABLE `virtual_aliases` ( `id` INT NOT NULL AUTO_INCREMENT, `domain_id` INT NOT NULL, `source` VARCHAR(255) NOT NULL, `destination` VARCHAR(255) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
保存为 mailserver.sql,然后导入数据库:
mysql -u mailuser -p mailserver < mailserver.sql
系统会提示你输入之前为 mailuser 设置的密码。
添加一个示例域名和用户
再次登录 MariaDB:
mysql -u mailuser -p mailserver
执行以下 SQL 添加你的域名和第一个邮箱用户:
-- 添加你的域名
INSERT INTO virtual_domains (name) VALUES ('yourdomain.com');
-- 添加邮箱用户 (密码使用 doveadm 生成,见下一步)
-- 假设你用 doveadm 生成密码 'test123' 的哈希值为 {SHA512-CRYPT}$6$rounds=5000$...
INSERT INTO virtual_users (domain_id, password, email) VALUES (1, '{SHA512-CRYPT}$6$rounds=5000$L1hYl5Kf7eU0v6fKq7w4eA$J5g7k8y9l0m2n3b4v5c6x7z8a9b0c1d2e3f4g5h6j7k8l9m0n', 'admin@yourdomain.com');
-- 查看用户ID
SELECT id FROM virtual_users WHERE email = 'admin@yourdomain.com';
-- 假设返回的 id 是 1
第五部分:配置 Postfix
生成用户密码哈希
Dovecot 使用自己的格式加密密码,我们需要使用 doveadm 生成。
# 替换 'your_password' 为你想要的邮箱密码 doveadm pw -s SHA512-CRYPT -p 'your_password'
它会输出一串类似 {SHA512-CRYPT}$6$... 的哈希值。将这个值复制到上面 SQL 插入语句的 password 字段中。
配置 Postfix 主配置文件 /etc/postfix/main.cf
# 备份原文件 cp /etc/postfix/main.cf /etc/postfix/main.cf.bak # 使用文本编辑器打开,vim vim /etc/postfix/main.cf ```然后添加以下配置: ```ini # 修改主机名 myhostname = mail.yourdomain.com mydomain = yourdomain.com myorigin = $mydomain # 信任本地网络和 localhost mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 # 邮件存放目录 home_mailbox = Maildir/ # 虚拟邮件配置 virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_base = /var/vmail virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_minimum_uid = 1000 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 virtual_transport = lmtp:unix:private/dovecot-lmtp # SASL 认证 smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_unauth_pipelining, reject_invalid_helo_hostname, reject_rbl_client zen.spamhaus.org, permit # TLS 加密 smtpd_tls_cert_file = /etc/letsencrypt/live/mail.yourdomain.com/fullchain.pem smtpd_tls_key_file = /etc/letsencrypt/live/mail.yourdomain.com/privkey.pem smtpd_use_tls = yes smtpd_tls_security_level = may smtp_tls_security_level = encrypt
创建 Postfix 的 MySQL 查询文件
创建 /etc/postfix/mysql-virtual-mailbox-domains.cf:
user = mailuser password = your_strong_password hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name = '%s'
设置文件权限:
chmod o= /etc/postfix/mysql-virtual-mailbox-domains.cf chgrp postfix /etc/postfix/mysql-virtual-mailbox-domains.cf
创建 /etc/postfix/mysql-virtual-mailbox-maps.cf:
user = mailuser password = your_strong_password hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_users WHERE email = '%s'
设置文件权限:
chmod o= /etc/postfix/mysql-virtual-mailbox-maps.cf chgrp postfix /etc/postfix/mysql-virtual-mailbox-maps.cf
创建邮件用户和目录
# 创建 vmail 用户和组,用于管理邮件文件 groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /var/vmail -s /sbin/nologin # 创建邮件根目录 mkdir -p /var/vmail/yourdomain.com chown -R vmail:vmail /var/vmail
第六部分:配置 Dovecot
配置 Dovecot 主配置文件 /etc/dovecot/dovecot.conf
# 备份原文件 cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.bak # 打开主配置文件 vim /etc/dovecot/dovecot.conf
确保以下配置项被取消注释或正确设置:
!include conf.d/*.conf
配置 Dovecot 的 MySQL 认证
编辑 /etc/dovecot/conf.d/10-mail.conf:
mail_location = maildir:/var/vmail/%d/%n mail_privileged_group = vmail
编辑 /etc/dovecot/conf.d/10-auth.conf:
!include auth-sql.conf.ext disable_plaintext_auth = yes # 强制使用加密认证
编辑 /etc/dovecot/conf.d/auth-sql.conf.ext:
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
创建 /etc/dovecot/dovecot-sql.conf.ext:
driver = mysql connect = host=127.0.0.1 dbname=mailserver user=mailuser password=your_strong_password default_pass_scheme = SHA512-CRYPT user_query = SELECT email AS user, 5000 AS uid, 5000 AS gid, '/var/vmail/%d/%n' AS home FROM virtual_users WHERE email = '%u' password_query = SELECT email AS user, password FROM virtual_users WHERE email = '%u'
设置文件权限!
chmod o= /etc/dovecot/dovecot-sql.conf.ext
配置 LMTP 服务
编辑 /etc/dovecot/conf.d/10-master.conf:
service lmtp {
inet lmtp <=> {
address = 127.0.0.1
port = 24
}
# ... 其他配置 ...
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
}
# ... 其他配置 ...
}
第七部分:启用并启动服务
启动核心服务并设置开机自启
# Postfix systemctl enable postfix systemctl start postfix # Dovecot systemctl enable dovecot systemctl start dovecot
检查服务状态:
systemctl status postfix systemctl status dovecot
确保它们都处于 active (running) 状态。
配置 SpamAssassin 和 ClamAV
# 启用并启动 ClamAV
systemctl enable clamav-freshclam
systemctl enable clamav-daemon
systemctl start clamav-freshclam
systemctl start clamav-daemon
# 配置 SpamAssassin 随 Dovecot 启动
# 编辑 /etc/dovecot/conf.d/10-mail.conf,添加:
# mail_plugins = $mail_plugins spamassassin
# 编辑 /etc/dovecot/conf.d/10-master.conf,添加 service anvil:
service anvil {
unix_listener /var/spool/postfix/private/spamassassin {
mode = 0660
user = postfix
group = postfix
}
}
SpamAssassin 的集成比较复杂,通常需要通过 spamd 守护进程和 dovecot-sieve 插件来实现,为了简化,我们先跳过,后续可以再研究。
第八部分:测试邮件服务器
测试发送和接收
使用你刚刚创建的邮箱 admin@yourdomain.com 和密码。
-
使用 Telnet 测试 SMTP (端口 25 或 587)
# 测试 25 端口 telnet mail.yourdomain.com 25 # 在 telnet 提示符下输入: ehlo yourdomain.com mail from: <admin@yourdomain.com> rcpt to: <another_email@gmail.com> # 发送到一个外部邮箱 data Subject: Test Email This is a test email from my new mail server. . (输入一个点然后回车) quit
-
使用邮件客户端测试 在 Outlook, Thunderbird 或手机邮件 App 中配置账户:
- 类型: IMAP
- 收件人服务器:
mail.yourdomain.com - 端口:
993(IMAPS) - 加密: SSL/TLS
- 发件人服务器:
mail.yourdomain.com - 端口:
587(Submission) - 加密: STARTTLS
- 用户名:
admin@yourdomain.com - 密码:
your_password
检查邮件日志
如果发送失败,查看日志是关键。
- Postfix 日志:
tail -f /var/log/maillog - Dovecot 日志:
tail -f /var/log/dovecot.log
第九部分:安装 Web 界面 (PostfixAdmin)
PostfixAdmin 是一个基于 Web 的工具,让你可以轻松管理域名和邮箱。
下载并解压
cd /var/www/html wget https://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-3.3/postfixadmin-3.3.tar.gz tar -xzf postfixadmin-3.3.tar.gz mv postfixadmin-3.3 mailadmin rm postfixadmin-3.3.tar.gz
设置权限
chown -R apache:apache /var/www/html/mailadmin chmod -R 755 /var/www/html/mailadmin
配置数据库
cd /var/www/html/mailadmin cp DATABASE_MYSQL.TXT /var/lib/mysql/postfixadmin.sql mysql -u mailuser -p mailserver < /var/lib/mysql/postfixadmin.sql
修改配置文件
-
复制
config.inc.php为config.local.inc.phpcp config.inc.php config.local.inc.php
-
编辑
config.local.inc.php,修改以下关键项:$CONF['configured'] = true; // 必须设置为 true // 数据库配置 $CONF['database_type'] = 'mysql'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'mailuser'; $CONF['database_password'] = 'your_strong_password'; $CONF['database_name'] = 'mailserver'; // 管理员邮箱 $CONF['admin_email'] = 'postmaster@yourdomain.com'; $CONF['admin_default_pass'] = 'your_admin_password'; // 设置管理员初始密码 // 域名 $CONF['default_domain'] = 'yourdomain.com';
访问 Web 界面
在浏览器中访问 http://<你的服务器IP>/mailadmin。
- 登录: 使用用户名
postmaster@yourdomain.com和你在config.local.inc.php中设置的admin_default_pass。 - 添加域名: 登录后,可以添加你的域名
yourdomain.com。 - 添加邮箱: 在域名下,可以添加新的邮箱用户。
后续重要步骤
至此,一个基础的邮件服务器已经搭建完成,但要让它稳定、安全地运行,你还需要:
-
配置 SSL/TLS 证书: 使用 Let's Encrypt 免费证书。
yum install -y certbot certbot certonly --standalone -d mail.yourdomain.com
然后将证书路径(
/etc/letsencrypt/live/mail.yourdomain.com/...)填入 Postfix 和 Dovecot 的配置文件中,并重启服务。 -
配置 OpenDKIM: 为你的邮件添加数字签名,大幅提高邮件送达率,这需要生成密钥对,配置 Postfix 发送,配置 DNS 添加 TXT 记录。
-
配置 SPF, DKIM, DMARC: 确保你的 DNS 记录完全正确,这是防止邮件被当成垃圾邮件的核心。
-
监控与维护: 定期检查日志、磁盘空间、更新系统和软件包。
搭建邮件服务器是一个深度和广度都很广的话题,这份指南为你提供了一个坚实的基础,祝你成功!
