# CentOS 7 搭建 Sendmail + Dovecot 邮件服务器:SMTP、POP3、IMAP 与 TLS
1. 服务介绍
Sendmail 是经典邮件传输代理 MTA,负责通过 SMTP 接收、路由和投递邮件。Dovecot 提供 POP3、IMAP 和用户认证,使客户端能够读取服务器邮箱。
本实验在 CentOS 7 搭建适合教学和内网测试的邮件系统:Sendmail 负责 SMTP 与本地投递,Dovecot 负责 POP3/IMAP,TLS 保护客户端与服务器之间的连接。

2. 准备运行环境
• 服务端:CentOS 7.x,主机名 mail.example.com,地址 10.1.100.101。
• 客户端:Linux 或 Windows,地址 10.1.100.102。
• 邮件域:example.com。
• 操作权限:root 或具备 sudo 权限的管理员账号。
• 网络要求:软件源可用,服务端和客户端互通。
• DNS 要求:实验环境至少配置 mail.example.com 的 A 记录和 example.com 的 MX 记录。
bash
hostnamectl set-hostname mail.example.com
echo '10.1.100.101 mail.example.com mail' >> /etc/hosts
hostname -f
ip addr
ip route
yum repolist
示例 DNS 记录:
dns
mail.example.com. IN A 10.1.100.101
example.com. IN MX 10 mail.example.com.
3. 相关知识
• Sendmail 是 MTA,负责 SMTP 收发和路由;Dovecot 是邮件访问服务,负责 POP3、IMAP 和认证。
• SMTP 常用 TCP 25;客户端提交常用 587;SMTPS 常用 465。IMAP 使用 143/993,POP3 使用 110/995。
• Sendmail 默认可能只监听回环地址。允许远程连接前必须检查 DAEMON_OPTIONS。
• CentOS 7 常默认安装 Postfix。Sendmail 与 Postfix 不能同时占用 TCP 25,切换前应停止并禁用 Postfix。
• /etc/mail/sendmail.mc 是主要模板;修改后用 make -C /etc/mail 生成 sendmail.cf,不要直接长期维护生成文件。
• /etc/mail/access 控制允许、拒绝和中继来源。错误配置 RELAY 会形成开放中继,被滥用发送垃圾邮件。
• 本实验只允许回环和 10.1.100.0/24 内网中继,不向任意互联网地址开放转发。
• MX 记录决定域的收信服务器;A 记录解析邮件主机;PTR 反向解析、SPF、DKIM、DMARC 影响公网投递信誉。
• Sendmail 本地投递默认使用 mbox 邮箱。本文让 Dovecot 读取 /var/spool/mail/用户名。
• TLS 只加密传输,不替代账号权限、中继限制和反垃圾策略。
4. 实验步骤
4.1 安装软件并处理 MTA 冲突
bash
yum -y install sendmail sendmail-cf dovecot mailx openssl
systemctl disable --now postfix 2>/dev/null || true
ss -lntp | grep ':25 '
alternatives --set mta /usr/sbin/sendmail.sendmail
alternatives --display mta
确认 Sendmail 组件:
bash
rpm -q sendmail sendmail-cf dovecot mailx
sendmail -d0.1 -bv root
4.2 创建邮件用户和邮箱
bash
useradd alice
useradd bob
passwd alice
passwd bob
touch /var/spool/mail/alice /var/spool/mail/bob
chown alice:mail /var/spool/mail/alice
chown bob:mail /var/spool/mail/bob
chmod 660 /var/spool/mail/alice /var/spool/mail/bob
检查账号和邮箱:
bash
id alice
id bob
ls -l /var/spool/mail/alice /var/spool/mail/bob
4.3 配置 Sendmail 基本参数
备份配置:
bash
cp -a /etc/mail/sendmail.mc /etc/mail/sendmail.mc.bak.$(date +%F-%H%M%S)
cp -a /etc/mail/access /etc/mail/access.bak.$(date +%F-%H%M%S)
编辑 /etc/mail/sendmail.mc。找到仅监听 127.0.0.1 的行:
m4
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
在行首加 dnl 注释,使 Sendmail 按系统网络配置监听 SMTP:
m4
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
在 MAILER 定义之前加入本地域和主机名:
m4
define(`confDOMAIN_NAME', `mail.example.com')dnl
LOCAL_DOMAIN(`example.com')dnl
MASQUERADE_AS(`example.com')dnl
FEATURE(`masquerade_envelope')dnl
把本地域写入 /etc/mail/local-host-names:
text
example.com
mail.example.com
4.4 配置中继范围
编辑 /etc/mail/access:
text
Connect:127.0.0.1 RELAY
Connect:10.1.100 RELAY
生成 access 数据库:
bash
makemap hash /etc/mail/access.db < /etc/mail/access
Connect:10.1.100 只适用于本实验网段。生产环境应缩小到实际客户端网段,或使用经过认证的 587 提交服务,禁止配置 Connect:0 RELAY。
4.5 生成 TLS 证书
实验环境生成自签名证书:
bash
mkdir -p /etc/pki/mail/private
openssl req -new -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/pki/mail/private/mail.key \
-out /etc/pki/mail/mail.crt \
-subj '/C=CN/ST=Lab/L=Lab/O=Example/OU=IT/CN=mail.example.com'
chmod 600 /etc/pki/mail/private/mail.key
chmod 644 /etc/pki/mail/mail.crt
在 sendmail.mc 的 MAILER 定义前加入:
m4
define(`confCACERT_PATH', `/etc/pki/tls/certs')dnl
define(`confCACERT', `/etc/pki/tls/certs/ca-bundle.crt')dnl
define(`confSERVER_CERT', `/etc/pki/mail/mail.crt')dnl
define(`confSERVER_KEY', `/etc/pki/mail/private/mail.key')dnl
生成配置并检查:
bash
make -C /etc/mail
sendmail -C /etc/mail/sendmail.cf -bt -d0.4 </dev/null
4.6 配置 Dovecot
备份配置目录:
bash
cp -a /etc/dovecot /etc/dovecot.bak.$(date +%F-%H%M%S)
编辑 /etc/dovecot/dovecot.conf:
conf
protocols = imap pop3
listen = *
编辑 /etc/dovecot/conf.d/10-mail.conf:
conf
mail_location = mbox:~/mail:INBOX=/var/spool/mail/%u
编辑 /etc/dovecot/conf.d/10-auth.conf:
conf
disable_plaintext_auth = yes
auth_mechanisms = plain login
编辑 /etc/dovecot/conf.d/10-ssl.conf:
conf
ssl = required
ssl_cert = </etc/pki/mail/mail.crt
ssl_key = </etc/pki/mail/private/mail.key
检查 Dovecot 最终配置:
bash
doveconf -n
doveconf -n | egrep 'protocols|listen|mail_location|ssl|auth_mechanisms'
4.7 配置防火墙并启动服务
bash
firewall-cmd --permanent --add-service=smtp
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
systemctl enable --now sendmail dovecot
systemctl restart sendmail dovecot
不要关闭 SELinux。Sendmail 和 Dovecot 使用系统默认路径时,发行版策略通常已包含所需权限。出现拒绝时先检查 AVC 日志。
4.8 本机发送测试邮件
bash
echo 'Sendmail local delivery test' | mail -s 'local test' alice
sleep 2
mail -u alice
也可以直接调用 Sendmail:
bash
sendmail -v alice@example.com <<'EOF'
From: root@example.com
To: alice@example.com
Subject: Sendmail SMTP test
This is a Sendmail test message.
EOF
5. 验证结果
5.1 验证服务和端口
bash
systemctl --no-pager --full status sendmail dovecot
ss -lntp | egrep ':25|:110|:143|:993|:995'
firewall-cmd --list-services
预期 Sendmail 监听 TCP 25,Dovecot 监听 110、143、993、995;若配置 ssl = required,明文端口会要求升级到 TLS。
5.2 验证 DNS
bash
dig +short A mail.example.com
dig +short MX example.com
dig +short -x 10.1.100.101
内网实验没有反向 DNS 时,PTR 可能为空;公网邮件服务器应由地址提供商配置正确 PTR。
5.3 验证 Sendmail 路由、队列和日志
bash
sendmail -bv alice@example.com
mailq
mailstats
grep -E 'sendmail|dovecot' /var/log/maillog | tail -n 100
journalctl -u sendmail -u dovecot -n 100 --no-pager
查看邮箱是否收到邮件:
bash
ls -lh /var/spool/mail/alice
tail -n 40 /var/spool/mail/alice
5.4 验证 SMTP 与 TLS
bash
openssl s_client -starttls smtp -connect mail.example.com:25 -servername mail.example.com
连接后应看到 Sendmail SMTP 欢迎信息和证书信息。输入 EHLO client.example.com 可查看服务能力。
5.5 验证 Dovecot 认证和收信协议
bash
doveadm auth test alice
openssl s_client -connect mail.example.com:993 -servername mail.example.com
openssl s_client -connect mail.example.com:995 -servername mail.example.com
Windows 或其他邮件客户端参数:
• 收件服务器:mail.example.com,IMAPS 端口 993,或 POP3S 端口 995。
• 发件服务器:mail.example.com,SMTP 端口 25,仅限实验网段。
• 用户名:alice;密码:Linux 用户密码。
• 自签名证书会触发信任提示,生产环境应更换受信任证书。
服务状态正常、端口监听正确、本地邮件进入 /var/spool/mail/alice、Dovecot 认证成功、TLS 握手正常,说明 Sendmail 与 Dovecot 邮件系统配置生效。