文章目录
1 背景
1.1 现象
先说现象,现象是用使用AWS SES发送邮件,QQ邮件收件箱和垃圾箱都没有mail。
Mail 必须要在自助查询-收件查询才能找到,发现下面有一栏被系统拦截的选项。
本文并不是因为ip地址被限或发送域名被QQ邮箱给拦而是因为某些发送设备不符合QQ的标准导致的。
1.2 环境
使用AWS SES发送账户注册mail,开发阶段是使用真实有效的三方mail,如xxx@hotmail.com 进行发送。但后面测试阶段就需要上公司域名的mail地址了。比如no-reply@company.com。而且这个邮件服务器还不是真实存在的。通过AWS SES验证了domain地址后,使用SES的lib就可以愉快地发送了邮件了。但测试发现QQ邮箱都收不到这个邮件。而gmail,163之类是正常的。随即开始排查。
在排查过程中得到了因为QQ邮箱地址是可以枚举导致了QQ邮箱垃圾邮件泛滥,所以QQ对mail发送方采取了非常严格的验证,所以这里被拦截应该是应该是SES 部分验证配置的问题。这里存在两种可能:
1 AWS SES本身存在的发送ip或者域名被QQ给限额了
2 使用AWS SES代发的邮件服务有问题
1.3 测试
1 使用hotmail 和163的邮箱在SES 后台发送,没问题可以收到邮件
2 使用 @company.com 带有域名公司服务器发送,QQ邮箱就出现了拦截。(email addresss方式 真实存在的邮箱)
3 使用 @company.com 没有真实存在邮件地址或服务器,及domian验证通过,填写地址发送。QQ邮箱也出现了拦截。
2 分析与解决
2.1 原因分析
当使用AWS SES后寄件过程应该是下面这样的:
对应测试情况即为:
测试1:hotmail 和163邮箱即为 senders email server,然后通过AWS SES发送到QQ邮箱。 测试2:@company.com 中公司邮箱,即为sender
s email,然后通过AWS SES发送到QQ邮箱。
测试3:以domain 为验证,即为第三种,直接以AWS SES为send email为地址发送到QQ邮箱。
从上述测试结果就可以看出来是sender`s email 某些配置出了问题导致QQ邮箱挡掉。
以为hotmail 和163 sender就不会被挡掉,所以查阅QQ邮箱相关文档,及AWS SES相关文档后可以得出初步结论。
QQ邮箱对来信格式要求较高,所以应该以尽可能规范的方式来发mail。
2.2 解决
通过对比发现,使用@company.com 发送邮件时,应该在SES后台设置 mail from 和 DKIM 两种email验证方式。
2.2.1 Mail From
电子邮件在发出后有两个指示其来源的地址:一个由电子邮件标头提供的 From 地址和一个 MAIL FROM 地址,发送邮件服务器向接收邮件服务器指定这些地址以指示邮件的来源。MAIL FROM 地址有时称作 envelope sender、envelope from、bounce address 或 Return Path 地址。当收件人查看其收件箱中的电子邮件时,会看到电子邮件的 From 地址。而邮件服务器用来返回退回邮件和其他错误通知的 MAIL FROM 地址,通常只有在收件人检查原始邮件源中的电子邮件标头时才可见。Amazon SES 将 MAIL FROM 域设置为默认值,除非您选择使用自己的设置。
默认情况下,您通过 Amazon SES 发送的电子邮件将使用 amazonses.com(或其子域)作为 MAIL FROM 域。发件人策略框架 (SPF) 身份验证成功验证这些电子邮件,因为默认的 MAIL FROM 域与发送邮件服务器 Amazon SES 相匹配。尽管这种级别的身份验证对于许多发件人来说已足够,但您可能还需要将 MAIL FROM 域设置为您自己的域,以便通过 SPF 对您的电子邮件进行基于域的消息身份验证、报告和合规性 (DMARC) 验证,这需要对 SPF 域一致性进行额外检查。DMARC 启用发件人的域以指示 (使用 DNS 记录) 其电子邮件受 SPF 和/或域名密钥识别邮件 (DKIM) 保护。
所以这里存在的问题即为需要将Mail From修改为公司的mail sender地址。如果是用AWS SES,直接点击验证后的邮箱地址并在下面点击DKIM 并修改公司邮件email即可。
PS:20200225 这个值最好还是不要设置,今天发现设置后,阿里云企业邮箱 接受SESmail会很慢约为10分钟,测试不设置该值,QQ 163 阿里邮箱均可收到。
2.2.2 使用 DKIM 对电子邮件进行身份验证
域名密钥识别邮件 (DKIM) 是一种允许发件人使用加密密钥为其电子邮件签名的标准。然后,电子邮件提供商使用这些签名来验证这些邮件在传输过程中是否未被第三方修改。
使用 DKIM 发送的电子邮件包括一个 DKIM-Signature 标头字段,该字段包含邮件的加密签名表示形式。接收邮件的提供商可以使用公有密钥(这在发件人的 DNS 记录中发布)对签名进行解码。然后,电子邮件提供商使用此信息来确定邮件是否是真实的。
PS:AWS SES DKIM设置方式
如果使用了AWS SES服务,可以使用SES自带的easy DKIM 服务,开启服务后只用配置相应DNS(邮件地址对应的dns)解析即可。
为身份设置 Easy DKIM 后,Amazon SES 会自动向您从该身份发送的每封电子邮件添加一个 1024 位的 DKIM 密钥。您可使用 Amazon SES 控制台或者使用 API 配置 Easy DKIM。
要设置 Easy DKIM,您必须修改域的 DNS 设置。如果您使用 Route 53 作为 DNS 提供商,Amazon SES 可以自动为您创建适当的记录。如果您使用其他 DNS 提供商,请参阅您的提供商的文档来了解有关为您的域更改 DNS 设置的更多信息。
2.2.3 遵循DMARC避免被识别为垃圾邮件
【20200519】:今天有收到反馈,验证码邮件又被QQ邮箱识别为垃圾邮件。回去看AWS 官方文档,发现更新DMARC文档中的内容。
基于域的消息身份验证、报告和合规性 (DMARC) 是一种电子邮件身份验证协议,它使用发件人策略框架 (SPF) 和域名密钥识别邮件 (DKIM) 来检测电子邮件欺骗。为了符合 DMARC 标准,邮件必须通过 SPF 和/或 DKIM 进行身份验证。
如何使用?
如果使用了2.2.2中Easy DKIM配置 DKIM签名则,在DNS服务器上添加以下解析即可实现符合DMARC标准。
名称 类型 值
_dmarc.example.com TXT "v=DMARC1;p=quarantine;pct=25;rua=mailto:dmarcreports@example.com"
把example.con更改为你的email发送域名即可。
简单地说,此策略告知电子邮件提供商执行以下操作:
- 查找“From”域为 example.com 且未通过 SPF 或 DKIM 身份验证的所有电子邮件。
- 将 25% 的未通过身份验证的电子邮件发送到垃圾邮件文件夹来进行隔离(您也可以使用 p=none 不采取任何操作;或使用 p=reject 直接拒收邮件)。
- 在摘要中发送有关未通过身份验证的所有电子邮件的报告(即,在特定时间段内汇总数据的报告,而不是为每个事件发送单独的报告)。电子邮件提供商通常每天发送一次此类汇总报告,但具体政策因提供商而异。
要了解更多有关如何为域配置 DMARC 的信息,请参阅 DMARC 网站上的概述。
测试:
nslookup -type=TXT _dmarc.example.com
在此命令的输出中,在 Non-authoritative answer 下查找以 v=DMARC1 开头的记录。如果此记录包含字符串 adkim=r,或者 adkim 字符串根本不存在,则您的域为 DKIM 使用宽松遵守。即配置没有问题
2.3 小结
如果使用公司的mail 发QQ邮箱,就需要注意mail from和 DKIM 的设置问题。还有种可能就是QQ邮箱 会对某些ip 和域名 进行限额,这也是另外一种情况。但使用了邮件代发服务后,应该是可以找邮件代发服务商解决的。