Featured image of post 使用mailcow和docker自建私人邮箱服务器(二)——使用邮箱中继与降低被屏蔽的概率

使用mailcow和docker自建私人邮箱服务器(二)——使用邮箱中继与降低被屏蔽的概率

使用mailcow和docker在自己的电脑或服务器上搭建私人邮箱服务器,使用邮箱中继发邮件并降低被屏蔽的概率

缘起

在本系列的第一篇文章“使用mailcow和docker自建私人邮箱服务器”中,我们用mailcow和docker在自己的电脑或服务器上搭建了私人邮箱服务器。由于很多运营商都会屏蔽25端口,导致邮件无法从服务器发送出去,因此我们使用了邮箱中继作为替代方案。

最近我发现邮箱又无法向外界发送邮件了,经过一番测试,发现是AT&T邮箱的邮件中继服务不工作了,似乎是他们的邮件系统出了点问题,我甚至都没法登录到在他们那注册的邮箱att.net邮箱里。每次登录总会跳转到AT&T的页面,然后经过半天加载,弹出一个错误的页面。真是忍不住吐槽,作为一个知名的网络运营商,网站竟可以做得如此之烂,这也是一大奇观了。

总之,多次尝试之后,我还是决定放弃AT&T的邮件中继服务,转而使用SendGrid 的邮件中继服务。这里记录一下其中遇到的问题以及解决方案。

前提

SendGrid设置

注册SendGrid账户

SendGrid官网注册账户,除了注册网站通用的那些信息,SendGrid还需要填写公司信息,可以随意填一下。最后需要使用手机号设置两步验证。 套餐我选择的免费版,每天最多可以发送100封邮件,对于我来说已经足够了。

生成API Key

注册完成后,登录进SendGrid的管理界面,点击左侧菜单栏的Email API,选择Integration Guide,然后选择SMTP Relay,点击Get Started

SendGrid API Key

然后填写API Key的名字,点击Create API Key,最后勾选I've updated my settings., 并点击Next: Verify Integration

SendGrid API Key

邮箱中继(邮箱转发)

邮箱中继的设置可参见上一篇文章“使用mailcow和docker自建私人邮箱服务器”中介绍的步骤,这里不再赘述。

这里需要注意的是,如果在其他网络应用中使用SendGrid的邮件中继服务,需要将Relayhost设置为smtp.sendgrid.net:587,而不是smtp.mail.your_domain_name,用户名就是"apikey",密码就是上一步中生成的API Key。

邮件被屏蔽的问题

被屏蔽的原因

当我在自己的一个网络应用中使用SendGrid的邮件中继服务时,发现等了好久也没有收到邮件,然后我在SendGrid的管理界面查看最近的活动记录:

SendGrid Activity

点击未能送达的这条记录,可以看到邮件被屏蔽的原因是550 DMARC check failed

SendGrid Activity

在QQ邮箱中可以查看被屏蔽的邮件,只需右上角自己的头像,然后选择自助查询,然后点击收信查询这一栏,就可以看到被屏蔽的邮件:

QQ Mail Blocked

在网上查询后得知,出现这个问题的原因是,我的邮件是用SendGrid的邮件中继服务发送的,但邮件的发件人却是我的自建邮箱服务器,也就是说邮件的实际发件人和号称的发件人不一致。接收邮件的服务器查询发件人的DMARC记录时,发现不一致,觉得有“挂羊头卖狗肉”的嫌疑,因此很大概率会拒绝接收邮件。

其实这点在接收邮件时也可以看出来,点击查看发件人的详细,可以看到实际发件人的域名是sendgrid.net,而号称的发件人的域名是jinli.io

QQ Mail Blocked

解决方案

上面问题的解决方案就是在SendGrid的管理系统中认证自己的域名。点击左上角自己的用户名,选择Setup Guide,然后完成其中的第二步Authenticate your sending domain。SendGrid会要求你添加3条CNAME记录在自己域名的DNS服务器上,添加完成后点击验证就行了。

完成验证后可以再用你的邮箱发邮件测试一下,这次SendGrid会使用你的域名生成一个发件人地址,然后用这个用户来发送邮件,这样实际发件人的域名和名义发件人的域名就一致了,可以顺利通过收件服务器的DMARC检查。

comments powered by Disqus