凌峰创科服务平台

centos搭建mail服务器

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

centos搭建mail服务器-图1
(图片来源网络,侵删)

这个过程会很长,请耐心跟随每一步操作。


第一部分:准备工作与系统环境

系统要求

  • 操作系统: 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) 格式。

centos搭建mail服务器-图2
(图片来源网络,侵删)
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 管理页面添加以下记录。

centos搭建mail服务器-图3
(图片来源网络,侵删)

A 记录

确保你的域名 yourdomain.commail 子域名指向你的服务器公网 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.comPTR 记录必须与你的主机名一致,否则很多邮件服务器会拒绝你的邮件,如果无法自行配置,请联系你的服务商。

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.phpconfig.local.inc.php

    cp 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
  • 添加邮箱: 在域名下,可以添加新的邮箱用户。

后续重要步骤

至此,一个基础的邮件服务器已经搭建完成,但要让它稳定、安全地运行,你还需要:

  1. 配置 SSL/TLS 证书: 使用 Let's Encrypt 免费证书。

    yum install -y certbot
    certbot certonly --standalone -d mail.yourdomain.com

    然后将证书路径(/etc/letsencrypt/live/mail.yourdomain.com/...)填入 Postfix 和 Dovecot 的配置文件中,并重启服务。

  2. 配置 OpenDKIM: 为你的邮件添加数字签名,大幅提高邮件送达率,这需要生成密钥对,配置 Postfix 发送,配置 DNS 添加 TXT 记录。

  3. 配置 SPF, DKIM, DMARC: 确保你的 DNS 记录完全正确,这是防止邮件被当成垃圾邮件的核心。

  4. 监控与维护: 定期检查日志、磁盘空间、更新系统和软件包。

搭建邮件服务器是一个深度和广度都很广的话题,这份指南为你提供了一个坚实的基础,祝你成功!

分享:
扫描分享到社交APP
上一篇
下一篇