先检查沙盒状态,因为这决定了邮件能否发送。新的 SES 账户在每个 Region 中默认都处于沙盒内。在沙盒中,SES 只能向已验证的地址、已验证的域名和它自己的邮箱模拟器投递邮件。此外,每 24 小时最多发送 200 封邮件,每秒最多发送 1 封。
验证 Email Spam Tester 地址无法绕过此限制。SES 会向收件人发送一封包含链接的邮件来验证地址,而我们的地址只接收一封邮件,随后就会关闭,因此这封验证邮件会直接耗尽该地址。实际使用时,你需要在发件所用的 Region 中申请生产访问权限。AWS 承诺在 96 小时内对该申请作出初步回复。
由于沙盒状态按 Region 分别设置,即使账户在 eu-west-1 中已进入生产环境,在 us-east-1 中仍可能处于沙盒内。身份验证也按 Region 分别设置,每个 Region 都有各自的 DKIM 记录。
获取地址并发送一封邮件
打开 email-spam-tester.com,复制页面显示的地址。无需账户或 API 密钥,地址格式为 test- 加二十个字符,域名为 t.email-spam-tester.com。该地址有效期为一小时,并且只能接收一封邮件,因此请先准备好发送命令,再获取地址。
最简单的发送方式是使用 CLI。以下命令改编自 AWS 在 SES 租户页面提供的示例,移除了租户和配置集参数:
aws sesv2 send-email \
--from-email-address "sender@yourdomain.com" \
--destination "ToAddresses=test-xxxxxxxxxxxxxxxxxxxx@t.email-spam-tester.com" \
--content "Simple={Subject={Data='Test Subject',Charset=utf-8},Body={Text={Data='Test email body',Charset=utf-8}}}"
即使在生产环境中,From 也必须是已验证的身份。像这样的纯文本正文足以测试身份验证和 IP,但几乎无法测试邮件内容。要获得实际判断结果,请发送你的应用实际发送的邮件,包括 HTML 部分和邮件头。还要使用相同的代码路径,无论是 boto3 的 send_email、SMTP 库还是其他方式。如果生产环境发送邮件时使用配置集,也请在这里添加 --configuration-set-name,让测试使用相同的设置。
收件箱测试可以接入同一条命令。将其各提供商的收件箱地址与测试地址一起放入 ToAddresses,并将其标记放入 Subject 数据。一次调用即可生成两份报告,第二份报告会列出邮件在 Gmail、Outlook、Yahoo 和其他提供商中进入的文件夹。这些收件箱同样未经验证,因此也需要生产环境访问权限。
也可以通过控制台发送。打开 Configuration > Identities,点击对应身份并选择 Send test email。如果要粘贴包含自定义邮件头的完整 MIME 邮件,请选择 Raw。AWS 将控制台描述为通常仅用于发送测试邮件的工具,并且文档中没有说明会为邮件添加测试前缀或进行其他更改。在沙盒中,Custom recipient 字段必须填写已验证的地址,这又回到了上面的问题。
报告中的新 SES 身份是什么样的
来自报告 · 身份验证
- SPF通过未对齐MAIL FROM 是 amazonses.com 的子域名,而不是你的域名的子域名。
- DKIM通过已对齐Easy DKIM 使用你域名上的 2048 位密钥为每封邮件签名。
- DMARC通过发布 DMARC 记录后,通过对齐的 DKIM 签名验证。
默认的 SES 身份:SPF 验证通过,但验证的是 amazonses.com。自定义 MAIL FROM 可以让它与你的域名对齐。
DKIM。 Easy DKIM 是域名身份的默认设置,它使用 2048 位密钥为每封邮件签名。设置时需要创建三条名为 token._domainkey.yourdomain.com 的 CNAME 记录,并让它们指向 token.dkim.<region>.amazonses.com。如果 DKIM 检查失败,先检查两点:DNS 是否已完成传播(AWS 最多允许 72 小时),以及你的 DNS 托管服务商是否在记录名称后又附加了域名,创建出了 token._domainkey.yourdomain.com.yourdomain.com。使用 BYODKIM 时,你改为在自己的选择器上发布一条 TXT 记录。在两者之间切换时,SES 可能发送完全没有签名的邮件,报告会将其标记为缺少 DKIM。DKIM 检查工具使用该令牌作为选择器。
SPF 和 Return-Path。 默认情况下,SES 使用 amazonses.com 的子域名作为 MAIL FROM。SPF 验证通过,但验证的是 amazonses.com,因此报告会显示 SPF 未与你的 From 对齐。DKIM 已对齐时,这只会扣少量分数(满分 100 分时扣 2 分,而不是 5 分),DMARC 仍然会通过 DKIM 验证。要同时对齐 SPF,请设置自定义 MAIL FROM 子域名,并只添加一条 MX 记录 10 feedback-smtp.<region>.amazonses.com 和一条 TXT 记录 v=spf1 include:amazonses.com ~all。不要选择用于接收邮件的子域名,也不要在 DMARC 记录中加入 aspf=s,因为 AWS 表示,在严格的 SPF 策略下,SES 无法实现 SPF 对齐。
DMARC。 SES 不会替你发布 DMARC 记录。AWS 提供的示例是 v=DMARC1;p=quarantine;rua=mailto:my_dmarc_report@example.com。如果目前没有人阅读你的 DMARC 报告,建议从 p=none 开始,之后再收紧策略。DMARC 检查工具会显示你当前的配置,DMARC fail介绍了常见的配置问题。
这些是示例值。请从你的账户中复制实际值。
| 名称 | 类型 | 值 | 用途 | 复制 |
|---|---|---|---|---|
| token. | CNAME | token. | Easy DKIM。共需三条,每个令牌对应一条。 | |
| mail. | MX | 10 feedback-smtp. | 自定义 MAIL FROM。只需一条 MX 记录,放在不接收邮件的子域名上。 | |
| mail. | TXT | v= | 自定义 MAIL FROM 的 SPF 记录,使 SPF 与你的 From 对齐。 | |
| _dmarc. | TXT | v= | DMARC,这是 AWS 提供的示例。如果目前没有人阅读报告,请从 p=none 开始,并且不要加入 aspf=s。 |
List-Unsubscribe。 只有在发送邮件时,将 ListManagementOptions 指向联系人列表和主题,SES 才会添加 List-Unsubscribe 和 List-Unsubscribe-Post。即使如此,这也仅适用于单个收件人的邮件,并且只能使用 Easy DKIM,SES 还会覆盖你自行设置的所有退订邮件头。其他所有邮件在发送时都不会包含退订邮件头。对于新闻简报,这意味着 List-Unsubscribe 检查和一键退订检查都会失败,除非你自行添加这些邮件头。自 2024 年 3 月起,v2 API 支持在不使用原始 MIME 的情况下添加自定义邮件头。以下两个邮件头改编自 AWS 的一键退订博客文章:
"Headers": [
{ "Name": "List-Unsubscribe",
"Value": "<https://yourdomain.com/unsub?address=x&topic=x>, <mailto:unsubscribe@yourdomain.com>" },
{ "Name": "List-Unsubscribe-Post",
"Value": "List-Unsubscribe=One-Click" }
]
随后,你的端点必须处理该 POST 请求。没有列表邮件头的密码重置邮件和收据属于另一种情况,对于这类邮件,报告会将群发发件人检查组标记为已跳过。有关该邮件头的更多信息,请参阅我们的 List-Unsubscribe 页面。
IP 和黑名单
新账户使用与其他 SES 用户共享的 IP 发送邮件。AWS 建议继续使用共享 IP,除非你的发送量大且稳定。报告会查询发送 IP 是否被列入 21 个黑名单。对于共享地址,命中记录属于整个 IP 池。专用 IP 分为 Standard 和 Managed 两种。Standard 需要你手动预热,Managed 则由 SES 负责预热,此时黑名单记录与你自己的发送行为相关。你可以将在 Headers 选项卡中找到的任何 IP 直接放入黑名单检查工具中查询。
AWS 也会监控你的账户。其执行常见问题说明,你应使用确实能接收邮件的真实地址或模拟器进行测试,以免虚构的收件人导致退信率升高。当退信率达到 5% 或投诉率达到 0.1% 时,AWS 会将账户置于审核状态。
底部的修复方案最多列出八项更改。适用时,每项更改都会提供可复制的 DNS 记录。每项修复旁的分数是其所涉及检查项当前扣除的分数。模型会选择并说明修复方法,但不会估算价格。如果你不理解某个检查项的名称,可以查看文档,其中解释了全部 42 个检查项。
AWS 参考资料
沙盒和生产访问权限docs.aws.amazon.com ↗Easy DKIMdocs.aws.amazon.com ↗自定义 MAIL FROMdocs.aws.amazon.com ↗将 DMARC 与 SES 配合使用docs.aws.amazon.com ↗订阅管理docs.aws.amazon.com ↗sesv2 send-emaildocs.aws.amazon.com ↗常见问题
可以从 SES sandbox 发送测试吗?
不能使用我们的地址进行测试。在 sandbox 中,SES 只向已验证的收件人投递邮件,而验证我们的地址会用掉该地址仅能接收的一封邮件。请为该 Region 申请生产访问权限,同时使用免费的 DKIM、SPF 和 DMARC 检查工具检查你的记录。
SES mailbox simulator 会提供相同的信息吗?
不会。它只会告诉你 SES 如何处理退信、投诉或投递,并且按正常发送计费。它不会分析你的邮件标头、身份验证或内容。
应该在根域名的 SPF 记录中加入 SES 吗?
接收方会根据 MAIL FROM 域名检查 SPF。默认情况下,该域名是 amazonses.com 的子域名,也可以是你的自定义 MAIL FROM 子域名。SES 的 SPF 记录应该配置在该子域名上。根据 MAIL FROM 页面,根域名不需要进行任何配置。