CentOS 7 搭建 Sendmail + Dovecot 邮件服务器:SMTP、POP3、IMAP 与 TLS

# 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 邮件系统配置生效。

相关推荐
雯宝2 小时前
mnt_init 函数
linux
律宏阔8 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔8 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴8 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千8 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei378 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei378 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei378 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
GeW8 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
GeW8 小时前
工业场景中的Linux与数据库选型:高端化转型的技术底座
linux