upload successful

# 邮箱服务描述

  • 邮件角色:

    • 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

sendmail

安装完后用 rpm -qa | grep sendmail && rpm -ql sendmail | more 查看 sendmail 是否成功安装和其安装目录

upload successful

安装完后,启动 sendmail 服务

  • systemctl start sendmail

upload successful

启动过程发现卡了很久,查看一下 sendmail 运行状态

upload successful

原来是计算机名不符合域名标准导致服务异常,修改一下计算名,重启服务再查看运行状态

  • hostname 0xhex.cn

upload successful

总算是正常了,并且 25 端口也处在一个监听状态

upload successful

# 安装 Dovecot 服务

Dovecot 是一个开源的 IMAP 和 POP3 邮件服务器,支持 Linux/Unix 系统,安装后我们就可以通过邮箱客户端连接 Dovecot 服务读取邮件

首先用 yum 命令安装 Dovecot 服务

  • yum install -y dovecot

upload successful

查看 dovecot 相关目录并进入其主配置目录

upload successful

这里需要修改 dovecot.conf 配置文件,去掉 Protocol 和 listen 前面的 #号

upload successful

保存后启动 dovecot 服务

upload successful

查看 POP 和 IMAP 端口是否处在监听状态

upload successful

可以看到 993、995、587、110、143 端口都已经处在一个监听状态,说明服务运行正常

# 域名解析

我们的 sendmail 和 dovecot 服务安装好后,接下来就需要把我们的域名解析到我们的服务器,我这里以阿里云的域名解析为例

登录阿里云,在控制台选择产品和服务中的云解析 DNS,选择域名解析,在对应的域名后面点击解析设置

upload successful

在这里我们需要添加 3 条解析记录,两条 A 记录和一条 MX 记录

DNS

第一条 A 记录是将我们的域名 0xhex.cn 解析到我们的云服务器地址,第二条 A 记录是添加一个二级域名 mail.0xhex.cn 并解析到我们的云服务器地址,最后一条 MX 就是就是将我们的二级域名 mail.0xhex.cn 作为邮箱服务器的地址

添加完后在用命令查看 MX 记录是否生效

  • dig 0xhex.cn mx

upload successful

# Sendmail 邮件测试

上面的步骤完成后,就可以开始测试我们的邮箱服务是否能够正常使用

# 登录邮箱测试

为了测试,我们需要新添加一个用户 bob,添加完后重启相关服务

upload successful

我们先找一台 Windows 电脑,安装一个 Foxmail 邮件客户端,然后用 Foxmail 连接我们的 Dovecot 服务器

upload successful

从报错信息可以看出是因为我们使用了非加密端口登录,而非加密端口不允许明文登录,这里选择勾上 SSL 再登录试试

upload successful

如果需要使用非加密端口通讯,需要取消 ssl 认证,这个还需自行百度,我一般是能用加密端口就用加密端口,毕竟非加密端口都是在以明文方式传输数据,所以使用非加密端口我是不推荐的

现在错误提示变成了认证失败,我们在服务器查看一下 sendmail 日志

  • tail -f /var/log/maillog

upload successful

从日志可以发现是检测用户邮箱存储目录失败,用户邮箱目录在 Dovecot 配置,把 mail_location = mbox:~/mail:INBOX=/var/mail/%u 前面的 # 符合去掉保存

  • vi /etc/dovecot/conf.d/10-mail.conf

upload successful

保存后重启 dovecot 服务,再登录邮箱试试

  • systemctl restart dovecot

upload successful

还是报错,但是这次报错信息是权限拒绝,依然是查看 sendmail 日志开始排错

upload successful

从报错信息可以发现是 dovecot 执行 fchown 命令失败,并给出了该错误文档的链接 http://wiki2.dovecot.org/Errors/ChgrpNoPerm

upload successful

根据错误文档的信息描述,我们可以通过修改 mail 目录的权限再尝试

  • chmod 0600 /var/mail/*

upload successful

修改权限后再尝试登录邮箱就发现可以正常登录了,非常 nice🤞

# 收发邮件测试

现在我们发送邮件测试看看能够正常发送

upload successful

发送邮件报错,提示连接失败,还是查看日志进行排错

upload successful

没有发信信息,检查了一下发现是 SMTPS 端口 465 没有开启,尴尬了😂

upload successful

# Sendmail 配置

要使用 465 端口,我们需要修改一下 Sendmail 的配置文件

切换到 /etc/mail 目录查看相关的配置文件

upload successful

先简单说一下 sendmail.cfsendmail.mc 这里两个配置文件,首先 sendmail.cf 是主配置文件,但是它是由特定的宏语言编写,不便于我们这些小白修改,所以 sendmail 为我们提供了一个 sendmail.mc 的模板文件,我们可以通过修改 sendmail.mc 模板再用 m4 命令生成新的 sendmail.cf 配置文件,先把这两个配置文件备份,避免将来修改错误导致服务无法启动

  • cp sendmail.cf sendmail.cf.bak && cp sendmail.mc sendmail.mc.bak

upload successful

用 vi 打开 sendmail.mc ,将 smtp 地址修改成 0.0.0.0,并启用 smtps

upload successful

保存后用 m4 命令重新生成新的配置文件

upload successful

我这里用 m4 命令报错了,用 rpm 命令查看发现是没有安装 sendmail-cf

  • yum install -y sendmail-cf

upload successful

安装 sendmail-cf 再用 m4 名重新生成新的配置文件,并重启 sendmail 服务器

  • m4 sendmail.mc >sendmail.cf
  • systemctl restart sendmail

upload successful

用 ss 命令查看端口 465 已经处在一个监听状态了,重新发送邮件测试

upload successful

新的错误提示,非常好,这里提示 RCPT 550 5.7.1 Error, 百度了一下发现这个是发送方或者是接收方安全设置的问题,这个 IP 是我自己的,所以肯定是我的 sendmail 安全配置问题

upload successful

先编辑 access 文件,添加一条 RELAY 记录,允许我的 IP 段地址可以通过这个邮件服务器发送邮件到任何地方

  • vi /etc/mail/access

upload successful

保存后生成新的 access 数据库文件,并重启 sendmail 服务

  • makemap hash /etc/mail/access < /etc/mail/access
  • systemctl restart sendmail

upload successful

重新发送邮件成功,非常鸡冻有木有 ٩(๑>◡<๑)۶

upload successful

但是我登录 QQ 邮箱发现并没有收到这个邮件,在服务器查看一下日志和用 mailq 查看邮件队列

upload successful

upload successful

从日志可以看到列队原因是因为连接 mx1.qq.com 超时,用 telnet 命令测试 mx1.qq.com 25 端口是否正常

upload successful

upload successful

原来是云服务器禁用了 25 端口连接外部地址,这样就意味着我们无法通过自身的云服务器 25 端口向外部发送邮件,这个除了提交工单申请开通 25 端口解封外别无他法

虽然我们不能使用邮箱服务器往外部发送邮件,但是我们收取外部邮件和本地邮件收发应该是没有问题的,我先用自己的 QQ 邮箱给自己发了一封测试邮件,测试可以正常收取

upload successful

然后试一下给本地的 root 发送邮件看看能不能正常收取邮件

upload successful

发送后在服务器用 mail 命令查看邮件是否已经收到

upload successful

可以看到已经成功收到 bob 的来信,说明我们的 sendmail 服务配置是正常的

# 配置 mailx 发送邮件

虽然我们不能用自身的邮箱服务器给外部邮箱发送邮件,但是我们可以通过配置 mailx 登录第三方邮箱服务器的账号来发送邮件

开始前先把 sendmail 服务停止掉,避免冲突端口

  • systemctl stop sendmail

upload successful

首先确认服务器是否已经安装 mailx 服务,如果没有则需要先安装 mailx 服务

upload successful

先登录我们的外部邮箱,开启 POP3/SMTP 服务并生成授权码,记住这个授权码,后面需要用到

upload successful

然后编辑 mail.rc 文件,在尾部添加邮箱登录信息

  • vi /etc/mail.rc
l
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

upload successful

安装 nss-tools 服务,用于检测配置文件正确性和完整性

  • yum install nss-tools -y

upload successful

申请证书

l
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 '标题' 收件地址

upload successful

测试发送邮件成功,本来还打算 sendmail 收发正常再搞个 postfix 对比一下这两个邮件服务器的区别,既然不能往外发邮件就不搞了,就酱吧

# 总结

最后做一下总结吧,在这次的配置 sendmail 服务中,我搞清楚了 smtp 和 smtps 的区别,以前我一直以为 smtps 和 smtp 的作用是一样的,smtps 只是通过证书加密数据而已,但是通过本次发送外部邮件的结果来看,本地邮箱服务器与外部邮箱服务器之间的通信始终都是使用 25 端口,465 端口只是用于本地邮箱客户端和本地邮箱服务端之间的加密通信,所以如果你的邮箱服务器无法与外部服务器的 25 端口建立连接,那么你的邮箱服务器就无法发送邮件给对方

如果文中有任何错误的地方还请大佬们指正,我会及时更正的

此文章已被阅读次数:正在加载...Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

Bob WeChat Pay

WeChat Pay

Bob PayPal

PayPal

Bob Alipay

Alipay