本指南将采用经典的 LAMP (Linux, Apache, MySQL, PHP) 架构,并结合 Postfix (SMTP)、Dovecot (IMAP/POP3) 和 SquirrelMail (Webmail) 来构建一个功能齐全的邮件服务器。

架构概述
我们将安装以下核心组件:
- Postfix: 作为邮件传输代理,负责发送和接收邮件,它将替代传统的 Sendmail。
- Dovecot: 作为 IMAP/POP3 服务器,负责从邮件服务器上收取邮件。
- MySQL: 用于存储用户账户、域名等虚拟用户信息,而不是直接使用系统用户。
- SquirrelMail: 一个基于 Web 的邮件客户端,方便用户通过浏览器收发邮件。
- Courier-Authlib: Dovecot 的一个认证库,用于连接 MySQL 数据库进行用户认证。
- SpamAssassin & ClamAV: 用于垃圾邮件过滤和病毒扫描(可选,但强烈推荐)。
第一步:系统准备与基础安装
-
设置主机名 邮件服务器需要一个规范的主机名,
mail.yourdomain.com。hostname mail.yourdomain.com # 永久修改,编辑 /etc/sysconfig/network vi /etc/sysconfig/network
-
更新系统 确保所有软件包都是最新的。
yum update -y
-
配置防火墙和 SELinux 这是搭建邮件服务器最关键也最容易出错的一步。
(图片来源网络,侵删)-
关闭 SELinux (为了简化,生产环境建议配置策略而非直接关闭)
# 临时关闭 setenforce 0 # 永久关闭,编辑 /etc/selinux/config vi /etc/selinux/config # 将 SELINUX=enforcing 改为 SELINUX=disabled
-
配置防火墙 (iptables) 邮件服务器需要开放多个端口:
- 25: SMTP (发送邮件)
- 587: SMTPS (带TLS的邮件提交,用于客户端发送)
- 465: SMTPS (旧版,但仍有使用)
- 110: POP3
- 995: POP3S (带SSL的POP3)
- 143: IMAP
- 993: IMAPS (带SSL的IMAP)
- 80: (可选,如果使用Webmail)
# 清空现有规则 iptables -F # 设置默认策略为DROP iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 开放必要端口 iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH iptables -A INPUT -p tcp --dport 25 -j ACCEPT # SMTP iptables -A INPUT -p tcp --dport 587 -j ACCEPT # Submission iptables -A INPUT -p tcp --dport 465 -j ACCEPT # SMTPS iptables -A INPUT -p tcp --dport 110 -j ACCEPT # POP3 iptables -A INPUT -p tcp --dport 995 -j ACCEPT # POP3S iptables -A INPUT -p tcp --dport 143 -j ACCEPT # IMAP iptables -A INPUT -p tcp --dport 993 -j ACCEPT # IMAPS iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP (Webmail) # 保存规则 service iptables save # 重启iptables服务 service iptables restart
-
-
安装基础依赖
yum install -y wget gcc make
第二步:安装和配置数据库
-
安装 MySQL
(图片来源网络,侵删)yum install -y mysql-server mysql-devel
-
启动并设置 MySQL
service mysqld start chkconfig mysqld on
-
安全初始化 运行
mysql_secure_installation脚本,设置 root 密码,并移除匿名用户、测试数据库等。 -
创建邮件服务器数据库和用户
mysql -u root -p
在 MySQL 命令行中执行:
CREATE DATABASE mailserver; GRANT ALL PRIVILEGES ON mailserver.* TO 'mailuser'@'localhost' IDENTIFIED BY 'your_strong_password'; FLUSH PRIVILEGES; EXIT;
-
创建数据库表结构 创建一个 SQL 文件
mailserver.sql如下:-- mailserver.sql USE mailserver; -- 存储虚拟域 CREATE TABLE domains ( id INT NOT NULL AUTO_INCREMENT, domain VARCHAR(50) NOT NULL, PRIMARY KEY (id), UNIQUE KEY (domain) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 存储虚拟用户 CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, domain_id INT NOT NULL, user VARCHAR(50) NOT NULL, password VARCHAR(120) NOT NULL, PRIMARY KEY (id), UNIQUE KEY (user), FOREIGN KEY (domain_id) REFERENCES domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 存储别名 CREATE TABLE aliases ( id INT NOT NULL AUTO_INCREMENT, domain_id INT NOT NULL, source VARCHAR(100) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (id), FOREIGN KEY (domain_id) REFERENCES domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
导入 SQL 文件:
mysql -u mailuser -p mailserver < mailserver.sql
第三步:安装和配置 Postfix
-
安装 Postfix 和相关库
yum install -y postfix dovecot mysql-devel
-
配置 Postfix 备份原始主配置文件:
cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
编辑
/etc/postfix/main.cf,修改或添加以下内容:# myhostname 和 mydomain 必须与你的服务器主机名匹配 myhostname = mail.yourdomain.com mydomain = yourdomain.com myorigin = $mydomain # 网络接口设置 inet_interfaces = all inet_protocols = all # 设置我的网络 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain # 虚拟域和虚拟用户设置 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_non_fqdn_helo_hostname, reject_unknown_recipient_domain, reject_rbl_client sbl-xbl.spamhaus.org smtpd_tls_security_level = may smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem smtpd_tls_key_file = /etc/pki/tls/private/postfix.key smtpd_use_tls = yes
-
创建 Postfix 的 MySQL 查询文件 创建
/etc/postfix/mysql-virtual-mailbox-domains.cf:user = mailuser password = your_strong_password hosts = localhost dbname = mailserver query = SELECT 1 FROM domains WHERE domain='%s'
创建
/etc/postfix/mysql-virtual-mailbox-maps.cf:user = mailuser password = your_strong_password hosts = localhost dbname = mailserver query = SELECT CONCAT('/var/vmail/', domain, '/', user, '/') FROM users WHERE user='%s' AND domain='%d'注意:确保这些文件的权限只有 Postfix 用户可读。
chown postfix:postfix /etc/postfix/mysql-virtual-*.cf chmod 640 /etc/postfix/mysql-virtual-*.cf
-
创建虚拟邮件用户和目录
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /var/vmail -s /sbin/nologin mkdir -p /var/vmail chown -R vmail:vmail /var/vmail
-
生成 SSL 证书
cd /etc/pki/tls/certs make mail.pem # 按照提示填写信息,可以全部使用默认值 mv mail.pem postfix.pem cd /etc/pki/tls/private mv ../certs/postfix.pem .
-
启动并启用 Postfix
service postfix start chkconfig postfix on
第四步:安装和配置 Dovecot
-
安装 Dovecot
yum install -y dovecot dovecot-mysql
-
配置 Dovecot 备份并编辑主配置文件
/etc/dovecot/dovecot.conf:# 确保以下值被设置 disable_plaintext_auth = yes mail_location = maildir:/var/vmail/%d/%n mail_privileged_group = vmail
编辑认证配置文件
/etc/dovecot/conf.d/10-auth.conf:!include auth-sql.conf.ext # 禁用系统用户登录 !include auth-passwdfile.conf.ext
编辑 SQL 认证配置文件
/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 }创建 Dovecot 的 SQL 查询文件
/etc/dovecot/dovecot-sql.conf.ext:driver = mysql connect = host=localhost dbname=mailserver user=mailuser password=your_strong_password default_pass_scheme = SHA512-CRYPT user_query = SELECT CONCAT('/var/vmail/', domain, '/', user, '/') AS home, 'maildir:/var/vmail/' || domain || '/' || user AS mail, 5000 AS uid, 5000 AS gid FROM users WHERE user = '%u' AND domain = '%d' password_query = SELECT user, domain, password FROM users WHERE user = '%u' AND domain = '%d'注意:设置文件权限。
chown root:dovecot /etc/dovecot/dovecot-sql.conf.ext chmod 640 /etc/dovecot/dovecot-sql.conf.ext
编辑 LMTP 配置文件
/etc/dovecot/conf.d/10-master.conf:service lmtp { inet_listener lmtp { address = 127.0.0.1 port = 24 } # Postfix 的 virtual_transport 配置指向这里 unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } } service auth { unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } } -
启动并启用 Dovecot
service dovecot start chkconfig dovecot on
第五步:添加邮件用户
通过 MySQL 来添加用户:
mysql -u mailuser -p mailserver
在 MySQL 命令行中执行:
-- 添加一个虚拟域
INSERT INTO domains (domain) VALUES ('yourdomain.com');
-- 添加一个用户,密码需要用 doveadm 命令生成
-- 密码为 "P@ssw0rd"
-- 在服务器终端执行: doveadm pw -s SHA512-CRYPT -p 'P@ssw0rd'
-- 会生成一串类似 {SHA512-CRYPT}$6$...
INSERT INTO users (domain_id, user, password) VALUES (1, 'testuser', '{SHA512-CRYPT}$6$rounds=5000$L9t6k...'); -- 将这里替换为生成的密码
-- 添加一个别名,将 info@ 指向 testuser@
INSERT INTO aliases (domain_id, source, destination) VALUES (1, 'info@yourdomain.com', 'testuser@yourdomain.com');
第六步:安装 Webmail (SquirrelMail)
-
安装 Apache 和 PHP
yum install -y httpd php php-mysql php-imap
-
配置 Apache
service httpd start chkconfig httpd on
-
安装和配置 SquirrelMail
yum install -y squirrelmail # 配置 SquirrelMail /usr/share/squirrelmail/config/conf.pl
在交互式配置中,进行如下设置:
Server Settings->Domain:yourdomain.comOrganization Preferences->Organization Name:Your Company NameGeneral Options->Data Directory:/var/lib/squirrelmail/data/General Options->Attachment Directory:/var/lib/squirrelmail/attach/Database Settings->Type:IMAPServer Settings->IMAP Server:localhostServer Settings->IMAP Port:143Server Settings->Sendmail Path:/usr/sbin/sendmail- 保存并退出 (
S->Q)
-
配置 Apache 访问 SquirrelMail 编辑
/etc/httpd/conf.d/squirrelmail.conf,确保Alias配置正确。Alias /squirrelmail /usr/share/squirrelmail <Directory "/usr/share/squirrelmail"> Options None AllowOverride None Order allow,deny Allow from all </Directory>
重启 Apache:
service httpd restart
你可以通过 http://your_server_ip/squirrelmail 访问你的 Webmail 了,用户名是 testuser@yourdomain.com,密码是你设置的 P@ssw0rd。
第七步:测试与后续优化
-
测试发送和接收
- 使用
telnet测试 SMTP 连接:telnet localhost 25 EHLO localhost MAIL FROM:<testuser@yourdomain.com> RCPT TO:<another_user@yourdomain.com> DATA Subject: Test Email This is a test. . QUIT
- 使用 SquirrelMail 或邮件客户端 (如 Outlook, Thunderbird) 配置 IMAP/SMTP 服务器进行收发测试。
- 使用
-
PTR 记录 (反向解析) 这是邮件服务器能否成功发送邮件的关键,你需要联系你的 VPS 提供商或 IDC,将你的服务器 IP 地址的 PTR 记录指向你的邮件服务器主机名
mail.yourdomain.com。 -
DNS 记录 确保你的域名解析中设置了正确的 MX 记录:
MX记录:yourdomain.com. IN MX 10 mail.yourdomain.com.A记录:mail.yourdomain.com. IN A <你的服务器IP>
-
安全加固
- SpamAssassin & ClamAV: 安装并配置它们与 Postfix 集成,可以有效拦截垃圾邮件和病毒。
- Fail2ban: 监控日志,自动封禁暴力破解 IP。
- 定期更新: 虽然 CentOS 6.5 已停止维护,但如果你有第三方源,请尽量更新。
重要提醒
- 防火墙和 DNS: 这是邮件服务器能否被外部世界接受的关键,务必确保防火墙规则正确,PTR 和 MX 记录配置无误。
- IP 黑名单: 新建的邮件服务器 IP 很容易被列入黑名单,需要耐心测试和申诉。
- 操作系统: 再次强调,CentOS 6.5 已过时,存在安全漏洞,请尽快计划升级到更新的操作系统(如 CentOS Stream, Rocky Linux, AlmaLinux 等)。
