缘起
在本系列的第一篇文章“使用mailcow和docker自建私人邮箱服务器”中,我们用mailcow和docker在自己的电脑或服务器上搭建了私人邮箱服务器。由于很多运营商都会屏蔽25端口,导致邮件无法从服务器发送出去,因此我们使用了邮箱中继作为替代方案。
最近我发现邮箱又无法向外界发送邮件了,经过一番测试,发现是AT&T邮箱的邮件中继服务不工作了,似乎是他们的邮件系统出了点问题,我甚至都没法登录到在他们那注册的邮箱att.net邮箱里。每次登录总会跳转到AT&T的页面,然后经过半天加载,弹出一个错误的页面。真是忍不住吐槽,作为一个知名的网络运营商,网站竟可以做得如此之烂,这也是一大奇观了。
总之,多次尝试之后,我还是决定放弃AT&T的邮件中继服务,转而使用SendGrid 的邮件中继服务。这里记录一下其中遇到的问题以及解决方案。
前提
- 已使用mailcow和docker搭建好私人邮箱服务器(如果还没有,可参见“使用mailcow和docker自建私人邮箱服务器”)
SendGrid设置
注册SendGrid账户
在SendGrid官网注册账户,除了注册网站通用的那些信息,SendGrid还需要填写公司信息,可以随意填一下。最后需要使用手机号设置两步验证。 套餐我选择的免费版,每天最多可以发送100封邮件,对于我来说已经足够了。
生成API Key
注册完成后,登录进SendGrid的管理界面,点击左侧菜单栏的Email API
,选择Integration Guide
,然后选择SMTP Relay
,点击Get Started
,
然后填写API Key的名字,点击Create API Key
,最后勾选I've updated my settings.
, 并点击Next: Verify Integration
。
邮箱中继(邮箱转发)
邮箱中继的设置可参见上一篇文章“使用mailcow和docker自建私人邮箱服务器”中介绍的步骤,这里不再赘述。
这里需要注意的是,如果在其他网络应用中使用SendGrid的邮件中继服务,需要将Relayhost
设置为smtp.sendgrid.net:587
,而不是smtp.mail.your_domain_name
,用户名就是"apikey",密码就是上一步中生成的API Key。
邮件被屏蔽的问题
被屏蔽的原因
当我在自己的一个网络应用中使用SendGrid的邮件中继服务时,发现等了好久也没有收到邮件,然后我在SendGrid的管理界面查看最近的活动记录:
点击未能送达的这条记录,可以看到邮件被屏蔽的原因是550 DMARC check failed
:
在QQ邮箱中可以查看被屏蔽的邮件,只需右上角自己的头像,然后选择自助查询
,然后点击收信查询
这一栏,就可以看到被屏蔽的邮件:
在网上查询后得知,出现这个问题的原因是,我的邮件是用SendGrid的邮件中继服务发送的,但邮件的发件人却是我的自建邮箱服务器,也就是说邮件的实际发件人和号称的发件人不一致。接收邮件的服务器查询发件人的DMARC记录时,发现不一致,觉得有“挂羊头卖狗肉”的嫌疑,因此很大概率会拒绝接收邮件。
其实这点在接收邮件时也可以看出来,点击查看发件人的详细,可以看到实际发件人的域名是sendgrid.net
,而号称的发件人的域名是jinli.io
:
解决方案
上面问题的解决方案就是在SendGrid的管理系统中认证自己的域名。点击左上角自己的用户名,选择Setup Guide
,然后完成其中的第二步Authenticate your sending domain
。SendGrid会要求你添加3条CNAME记录在自己域名的DNS服务器上,添加完成后点击验证就行了。
完成验证后可以再用你的邮箱发邮件测试一下,这次SendGrid会使用你的域名生成一个发件人地址,然后用这个用户来发送邮件,这样实际发件人的域名和名义发件人的域名就一致了,可以顺利通过收件服务器的DMARC检查。