Sendgrid v3 mail/send:是否可以发送幂等请求?

lf2*_*215 6 twilio sendgrid sendgrid-api-v3

使用SendGrid 的 v3 API是否可以发送幂等请求?我正在开发一个系统,该系统可能会导致多次尝试发送同一封电子邮件,因此如果我们能够以某种方式(例如,在请求中传递唯一的 ID)并使用“如果您忽略此请求”的逻辑,将会很有帮助。已经处理了具有相同唯一 ID 的请求”?

Sku*_*lly 2

SendGrid 的 API 不是幂等安全的,并且会随意将所有 POST 请求分派到邮件发送端点,而不对重复请求进行任何验证。

避免这种行为的另一种方法是按照您的请求跟踪哪些电子邮件是通过唯一标识符发送的。SendGrid 不提供任何方式来跟踪已发送的标识符,因此您必须自己将它们存储在数据库中。

为了确保只跟踪成功且非无效的邮件发送的唯一标识符,您可以采取以下措施:使用每封电子邮件的唯一参数将它们附加到电子邮件中这些标识符随电子邮件一起发送,稍后可以通过事件 Webhooks接收。

使用自定义参数

要将唯一参数附加到邮件发送,您可以将它们附加到X-SMTPAPI标头。customArgs如果您使用的是 Node.js 库,则可以通过向邮件对象中的字段添加一对键值条目来实现:

const SendGrid = require("@sendgrid/mail");
SendGrid.setApiKey(SENDGRID_API_KEY);

const Mail = {
    to: "johndoe@email.com",
    from: "company@email.com",
    cc: [],
    subject: "My Email",
    customArgs: {
        unique_id: "YOUR_UNIQUE_IDENTIIFER_HERE"
    }
}

SendGrid.send(Mail);
Run Code Online (Sandbox Code Playgroud)

现在,每封发送的电子邮件都将包含您的唯一标识符,您可以稍后通过为端点设置事件 Webhook 来跟踪该标识符,请参阅事件 Webhook 安全功能入门,所有库中都提供了Webhook 帮助程序,使这一切变得更容易。

事件 Webhook 负载

尽管我们有兴趣存储我们的唯一标识符,但您将开始捕获包含传递和参与数据的邮件事件。

以下是邮件事件的示例 Webhook 负载"delivered"

[
  {
    "email": "johndoe@email.com",
    "timestamp": 1513299569,
    "smtp-id": "<14c5d75ce93.dfd.64b469@ismtpd-555>",
    "event": "delivered",
    "ip": "168.1.1.1",
    "category": "cat facts",
    "sg_event_id": "sg_event_id",
    "sg_message_id": "sg_message_id",
    "unique_id": "YOUR_UNIQUE_IDENTIIFER_HERE",
    "response": "250 OK"
  }
]
Run Code Online (Sandbox Code Playgroud)

(对于其他事件类型,您可以在此处查看示例。)

您将看到我们的unique_id邮件被附加在与邮件相关的事件中,然后可以将其存储在数据库中,并且您将获得带有唯一标识符的已发送确认邮件的集合。

剩下要做的就是在发送电子邮件之前使用您的唯一标识符查询该数据库,以确保电子邮件之前未被发送过。