parsing - Sendgrid 入站 Webhook - 未送达的通知
问题描述
根据 sendgrid 文档,入站解析器 webhook 响应失败的方式是,它将重试将电子邮件发布到配置的端点 3 天,如果未送达,将丢弃电子邮件。
Parse API 会将已解析的电子邮件发布到您指定的 URL。如果 POST 不成功,SendGrid 会自动排队并重试任何以 5XX 状态响应的 POST。这可以防止错误配置其网站或 POST URL 的客户丢失数据。
以 2xx 状态响应 POST 请求以阻止电子邮件重试。
为避免返回错误,您的链接必须在收到电子邮件时返回 2xx HTTP 代码。此回复让我们的系统知道您的链接已收到电子邮件。然后将其从我们的发送队列中删除。如果我们没有收到有效的 2xx HTTP 响应,我们的服务器将认为他们未能传递您的消息。3 天后无法送达的邮件将被丢弃。
我想知道在删除未送达的电子邮件之前,sendgrid 是否会通知发件人他们的电子邮件无法送达?
解决方案
根据我运行的一些测试,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小时后,添加一个适当的记录到子域以将其指向脚本。检查服务器日志并确认没有尝试发布电子邮件。随后的电子邮件尝试成功发布。)
案例 3. 解析服务器返回 500 错误
SendGrid 尝试以以下时间间隔 POST 到钩子 URL:
+0 +5m +10m +15m +20m
+25m +35m +50m +1h20m +2h20m
...然后每 3 小时
最后一次尝试发生 +71h20m
20 分钟的偏移量有点不寻常,但它落在整点上,所以可能是因为消息在整点排队尝试 POST。
72 小时后不再尝试 POST 电子邮件。
不会向发件人或 SendGrid 帐户发送通知。
统计文档
提到了统计
的可用性,但是,我发现这些数字是不准确的。
例如,在我的测试期间,我有许多电子邮件通过 API,包括一些打算成功的邮件(并且确实 POST 到我的服务器)和一些打算失败的邮件(作为上述测试的一部分),但是,返回的数字没有对齐。
在以下情况下应小心谨慎:
- 服务器停机时间:这最终取决于服务器的配置方式。如果服务器返回 5xx 响应代码,SendGrid 将继续尝试 POST 电子邮件。我还尝试测试超时场景,但是,SendGrid 似乎非常耐心(例如,我让脚本暂停 10 分钟,SendGrid 保持连接 10 分钟,但有趣的是,由于 5 分钟后发生第二次尝试,电子邮件发布两次)。
- 返回 4xx 错误代码的服务器配置错误。SendGrid 将删除电子邮件。
还应注意,如果电子邮件被丢弃,似乎没有任何可靠的方法可以找到它。
推荐阅读
- c# - 到达对话流程中的某个步骤时,自动从聊天机器人视图切换到 ionic 移动应用程序页面
- jquery - 如何在 jquery 回调函数中发送 Typescript 变量?
- java - 如何在每天的特定时间使用 java 发送邮件
- r - 如何在 R-Shiny 中实现未来功能
- game-engine - gdscript 全局变量值在 get_tree().reload_current_scene() 之后没有改变
- apache-spark - 默认情况下,Spark sql 模式中的可空性是建议性的。严格执行它的最佳方法是什么?
- swift - 如何初始加载 UITableView 然后观察 Firebase 节点以更改在 Swift 中刷新 tableview?
- azure-devops - 防止用户在 Azure Devops (VSTS) 中创建没有父级的工作项
- tensorflow - 从 tensorflow 中的 .tfrecords 文件获取路径
- css - 如何自动调整引导导航栏中的下拉框不超过页面宽度?