根据我运行的一些测试,SendGrid 似乎不会向发件人发送通知,也没有任何简单的方法可以确定 SendGrid 是否丢弃了任何入站电子邮件。
虽然文档措辞有些含糊,但我基于测试(与文档措辞一致)的理解是这样的:
-
服务器返回 2xx: 电子邮件被视为已接受,不再进行尝试。
-
服务器返回 5xx: 服务器有错误,在返回 2xx 之前进行了尝试(请参阅下文了解后续尝试的时间),或 72 小时过去了
-
服务器返回任何其他响应,或 DNS 记录不存在: 电子邮件被视为失败,不再进行尝试。
我的结论基于我在一周内进行的多项测试,从中我确定了以下几点:
案例 1. 解析服务器返回 400 或 403 错误
电子邮件在一次尝试后被丢弃。
不再尝试 POST 电子邮件。
不会向发件人或 SendGrid 帐户发送任何通知。
(测试方法:将 SendGrid 配置为返回上述错误代码之一的 URL。检查了 1 周以上的服务器日志,并注意到仅进行了一次尝试。)
案例 2. 解析挂钩 URL 没有 DNS 记录
电子邮件被丢弃,大概是在一次尝试之后。
不会向发件人或 SendGrid 帐户发送任何通知。
(测试方法:将hook URL配置到没有任何DNS记录的子域。运行DNS搜索并尝试打开hook URL以确认DNS记录不指向任何地方。发送电子邮件。然后,12小时后,将适当的记录添加到子域以将其指向脚本。检查服务器日志并确认未尝试 POST 电子邮件。随后的电子邮件尝试成功 POST。)
案例3.解析服务器返回500错误
SendGrid 尝试按以下时间间隔 POST 到挂钩 URL:
+0 +5m +10m +15m +20m
+25m +35m +50m +1h20m +2h20m
...然后每 3 小时一次
最后一次尝试发生在 +71h20m
20 分钟的偏移有点不寻常,但它落在整点上,所以可能是因为消息排队尝试在整点上 POST。
72 小时后不再尝试 POST 电子邮件。
不会向发件人或 SendGrid 帐户发送通知。
统计
documentation 指的是统计数据的可用性,但是,我发现这些数字不准确。
例如,在我的测试期间,我有许多电子邮件通过 API,包括一些打算成功的电子邮件(确实 POST 到我的服务器)和一些打算失败的电子邮件(作为上面的测试),但是返回的数字并不一致。
要点
在以下情况下应小心:
- 服务器停机时间:这最终取决于服务器的配置方式。如果服务器返回 5xx 响应代码,SendGrid 将继续尝试 POST 电子邮件。我还尝试测试超时场景,但是,SendGrid 似乎非常耐心(例如,我让脚本暂停 10 分钟,SendGrid 保持连接 10 分钟,但有趣的是,由于 5 分钟后发生第二次尝试,电子邮件 POST 两次)。
- 返回 4xx 错误代码的服务器配置错误。 SendGrid 将删除电子邮件。
还应注意,如果电子邮件被丢弃,似乎没有任何可靠的方法可以找出这一点。