# 邮箱服务描述
-
邮件角色:
-
MTA(Mail Transport Agent)
邮件传输代理,安装在邮件服务器上,MTA 负责将 MUA 的邮件转发给指定的用户 -
MDA(Mail Delivery Agent)
邮件投递代理,一般安装在邮件服务器上,是 MUA 和 MTA 中间件,负责把 MTA 接收到的邮件转发到对应的用户邮箱目录 (收件箱) 和过滤垃圾邮件 -
MUA(Mail User Agent)
邮件用户代理,用于收发邮件服务,一般指安装在客户机的邮箱客户端,便于用户写信和收信,常见的邮箱客户端有 Foxmail、outlook 等
-
-
邮箱通信协议:
-
SMTP(Simple Mail Transfer Protocol)
简单邮件传输协议,MTA 发送邮件使用该协议,服务器通信使用 25 端口,加密通信使用 465 端口,Exchange 加密通信使用 597 端口 -
POP(Post Office Protocol)
邮局协议,该协议用于 MUA 连接 MTA 收取邮件,POP 会从服务器下载所有新的邮件到本地,下载后邮件会从服务器删除,速度相对比较慢,并且不能在多台设备收取同一条邮件,通信端口为 110,加密端口为 995 -
IMAP(Internet Message Access Protocol)
互联网信息访问协议,功能比 POP 要多,并且 IMAP 收取邮件只是在服务器读取,并不下载到本地,收件速度比 POP 要快,支持多台设备同时收取同一条邮件,通信端口为 143,加密端口为 993
-
下面以 SendMail
邮件服务作为演示,需要准备一台云服务器和域名,我这边的服务器系统是 CentOS 8
, 域名地址是 0xhex.cn
# SendMail
# 安装并启动 Sendmail
登录云服务器,用 yum 命令安装 sendmail 服务
yum install -y sendmail
安装完后用 rpm -qa | grep sendmail && rpm -ql sendmail | more
查看 sendmail
是否成功安装和其安装目录
安装完后,启动 sendmail
服务
systemctl start sendmail
启动过程发现卡了很久,查看一下 sendmail
运行状态
原来是计算机名不符合域名标准导致服务异常,修改一下计算名,重启服务再查看运行状态
hostname 0xhex.cn
总算是正常了,并且 25 端口也处在一个监听状态
# 安装 Dovecot 服务
Dovecot 是一个开源的 IMAP 和 POP3 邮件服务器,支持 Linux/Unix 系统,安装后我们就可以通过邮箱客户端连接 Dovecot 服务读取邮件
首先用 yum 命令安装 Dovecot 服务
yum install -y dovecot
查看 dovecot 相关目录并进入其主配置目录
这里需要修改 dovecot.conf 配置文件,去掉 Protocol 和 listen 前面的 #号
保存后启动 dovecot 服务
查看 POP 和 IMAP 端口是否处在监听状态
可以看到 993、995、587、110、143 端口都已经处在一个监听状态,说明服务运行正常
# 域名解析
我们的 sendmail 和 dovecot 服务安装好后,接下来就需要把我们的域名解析到我们的服务器,我这里以阿里云的域名解析为例
登录阿里云,在控制台选择产品和服务中的云解析 DNS,选择域名解析,在对应的域名后面点击解析设置
在这里我们需要添加 3 条解析记录,两条 A 记录和一条 MX 记录
第一条 A 记录是将我们的域名 0xhex.cn 解析到我们的云服务器地址,第二条 A 记录是添加一个二级域名 mail.0xhex.cn 并解析到我们的云服务器地址,最后一条 MX 就是就是将我们的二级域名 mail.0xhex.cn 作为邮箱服务器的地址
添加完后在用命令查看 MX 记录是否生效
dig 0xhex.cn mx
# Sendmail 邮件测试
上面的步骤完成后,就可以开始测试我们的邮箱服务是否能够正常使用
# 登录邮箱测试
为了测试,我们需要新添加一个用户 bob,添加完后重启相关服务
我们先找一台 Windows 电脑,安装一个 Foxmail 邮件客户端,然后用 Foxmail 连接我们的 Dovecot 服务器
从报错信息可以看出是因为我们使用了非加密端口登录,而非加密端口不允许明文登录,这里选择勾上 SSL 再登录试试
如果需要使用非加密端口通讯,需要取消 ssl 认证,这个还需自行百度,我一般是能用加密端口就用加密端口,毕竟非加密端口都是在以明文方式传输数据,所以使用非加密端口我是不推荐的
现在错误提示变成了认证失败,我们在服务器查看一下 sendmail 日志
tail -f /var/log/maillog
从日志可以发现是检测用户邮箱存储目录失败,用户邮箱目录在 Dovecot 配置,把 mail_location = mbox:~/mail:INBOX=/var/mail/%u
前面的 #
符合去掉保存
vi /etc/dovecot/conf.d/10-mail.conf
保存后重启 dovecot 服务,再登录邮箱试试
systemctl restart dovecot
还是报错,但是这次报错信息是权限拒绝,依然是查看 sendmail 日志开始排错
从报错信息可以发现是 dovecot 执行 fchown 命令失败,并给出了该错误文档的链接 http://wiki2.dovecot.org/Errors/ChgrpNoPerm
根据错误文档的信息描述,我们可以通过修改 mail 目录的权限再尝试
chmod 0600 /var/mail/*
修改权限后再尝试登录邮箱就发现可以正常登录了,非常 nice🤞
# 收发邮件测试
现在我们发送邮件测试看看能够正常发送
发送邮件报错,提示连接失败,还是查看日志进行排错
没有发信信息,检查了一下发现是 SMTPS 端口 465 没有开启,尴尬了😂
# Sendmail 配置
要使用 465 端口,我们需要修改一下 Sendmail 的配置文件
切换到 /etc/mail
目录查看相关的配置文件
先简单说一下 sendmail.cf
和 sendmail.mc
这里两个配置文件,首先 sendmail.cf
是主配置文件,但是它是由特定的宏语言编写,不便于我们这些小白修改,所以 sendmail
为我们提供了一个 sendmail.mc
的模板文件,我们可以通过修改 sendmail.mc
模板再用 m4
命令生成新的 sendmail.cf
配置文件,先把这两个配置文件备份,避免将来修改错误导致服务无法启动
cp sendmail.cf sendmail.cf.bak && cp sendmail.mc sendmail.mc.bak
用 vi 打开 sendmail.mc
,将 smtp 地址修改成 0.0.0.0,并启用 smtps
保存后用 m4 命令重新生成新的配置文件
我这里用 m4 命令报错了,用 rpm 命令查看发现是没有安装 sendmail-cf
yum install -y sendmail-cf
安装 sendmail-cf 再用 m4 名重新生成新的配置文件,并重启 sendmail 服务器
m4 sendmail.mc >sendmail.cf
systemctl restart sendmail
用 ss 命令查看端口 465 已经处在一个监听状态了,重新发送邮件测试
新的错误提示,非常好,这里提示 RCPT 550 5.7.1 Error, 百度了一下发现这个是发送方或者是接收方安全设置的问题,这个 IP 是我自己的,所以肯定是我的 sendmail 安全配置问题
先编辑 access 文件,添加一条 RELAY 记录,允许我的 IP 段地址可以通过这个邮件服务器发送邮件到任何地方
vi /etc/mail/access
保存后生成新的 access 数据库文件,并重启 sendmail 服务
makemap hash /etc/mail/access < /etc/mail/access
systemctl restart sendmail
重新发送邮件成功,非常鸡冻有木有 ٩(๑>◡<๑)۶
但是我登录 QQ 邮箱发现并没有收到这个邮件,在服务器查看一下日志和用 mailq 查看邮件队列
从日志可以看到列队原因是因为连接 mx1.qq.com 超时,用 telnet 命令测试 mx1.qq.com
25 端口是否正常
原来是云服务器禁用了 25 端口连接外部地址,这样就意味着我们无法通过自身的云服务器 25 端口向外部发送邮件,这个除了提交工单申请开通 25 端口解封外别无他法
虽然我们不能使用邮箱服务器往外部发送邮件,但是我们收取外部邮件和本地邮件收发应该是没有问题的,我先用自己的 QQ 邮箱给自己发了一封测试邮件,测试可以正常收取
然后试一下给本地的 root 发送邮件看看能不能正常收取邮件
发送后在服务器用 mail 命令查看邮件是否已经收到
可以看到已经成功收到 bob 的来信,说明我们的 sendmail 服务配置是正常的
# 配置 mailx 发送邮件
虽然我们不能用自身的邮箱服务器给外部邮箱发送邮件,但是我们可以通过配置 mailx 登录第三方邮箱服务器的账号来发送邮件
开始前先把 sendmail 服务停止掉,避免冲突端口
systemctl stop sendmail
首先确认服务器是否已经安装 mailx 服务,如果没有则需要先安装 mailx 服务
先登录我们的外部邮箱,开启 POP3/SMTP 服务并生成授权码,记住这个授权码,后面需要用到
然后编辑 mail.rc 文件,在尾部添加邮箱登录信息
vi /etc/mail.rc
set smtp=smtps://smtp.xxx.com:465 | |
set smtp-auth=login | |
set smtp-auth-user=user@xxx.com | |
set smtp-auth-password=password | |
set ssl-verify=ignore | |
set nss-config-dir=/root/.certs/ | |
set from=user@xxx.com |
安装 nss-tools 服务,用于检测配置文件正确性和完整性
yum install nss-tools -y
申请证书
mkdir -p /root/.certs/ | |
echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt | |
certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt | |
certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt | |
cd /root/.certs/ | |
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs/./ -i qq.crt | |
certutil -L -d /root/.certs |
现在可以用 mail 命令来测试能不能发送邮件了
echo '邮件内容' | mail -s '标题' 收件地址
测试发送邮件成功,本来还打算 sendmail 收发正常再搞个 postfix 对比一下这两个邮件服务器的区别,既然不能往外发邮件就不搞了,就酱吧
# 总结
最后做一下总结吧,在这次的配置 sendmail 服务中,我搞清楚了 smtp 和 smtps 的区别,以前我一直以为 smtps 和 smtp 的作用是一样的,smtps 只是通过证书加密数据而已,但是通过本次发送外部邮件的结果来看,本地邮箱服务器与外部邮箱服务器之间的通信始终都是使用 25 端口,465 端口只是用于本地邮箱客户端和本地邮箱服务端之间的加密通信,所以如果你的邮箱服务器无法与外部服务器的 25 端口建立连接,那么你的邮箱服务器就无法发送邮件给对方
如果文中有任何错误的地方还请大佬们指正,我会及时更正的