如何在 C# 中获取 SendGrid 批量电子邮件状态

How to get SendGrid bulk-email statuses in C#

我需要发送邮件(批量发送),我有两种情况:

  1. 同一封电子邮件发送给多个收件人
  2. 不同的邮件发送到不同的收件人

在这两种情况下,我如何控制状态?

第一种情况会return单x-message-id,但如何将其翻译成每个收件人的单独状态? (送货、开封等?)

第二种情况,我觉得需要一个一个发送,对吗?或者在这种情况下还有发送批量电子邮件的方法吗?

我正在使用 C# 和官方 .NET 库。

  1. 要将同一封电子邮件发送给多个收件人:

    • 您可以使用 MailHelper.CreateSingleEmailToMultipleRecipients 并且您需要在代码中指定文本和 HTML 内容。 (Sample)
    • 您还可以使用 MailHelper.CreateSingleTemplateEmailToMultipleRecipients 方法,该方法将使用 SendGrid 动态电子邮件模板。在这种情况下,电子邮件模板已存储在 SendGrid 中,您只需提供模板的 ID。
    • 有一个 showAllRecipients 命名参数,默认为 false。当 false 位收件人无法看到其他收件人时,当 true 位收件人可以看到其他收件人时。
    • 稍后我将讨论检索各个电子邮件的状态。
  2. 向不同的人发送不同的电子邮件:

    • 您可以使用 MailHelper.CreateMultipleEmailsToMultipleRecipients,它将使用单个文本和 HTML body 模板,但您可以添加 substitution tags and pass in substitution data so the email will be personalized for every recipient. (Sample)
    • 您可以构建一个 MailMessage,但使用多个 Personalization objects 来覆盖特定收件人的任何 MailMessage 属性。 (Sample)
    • 你也可以构造多个MailMessageobjects并单独提交给API,虽然上面的选项是针对这种情况做出的。

要发送任何这些电子邮件,您的 API 密钥必须具有 mail.send 权限。


如您所述,当您批量发送电子邮件时,只有一个邮件 ID 是通过 x-message-id header 编辑的 return。 当您稍后尝试使用该消息 ID 检索详细信息时,您将找不到任何消息。 这是因为 x-message-id header 中的消息 ID 用作基本 ID,真正的消息 ID 将附加另一个 ID。 例如,x-message-id 将 return "W86EgYT6SQKk0lRflfLRsA",但是当您检索其中一条消息时,它看起来像这样:"W86EgYT6SQKk0lRflfLRsA.filterdrecv-5645d9c87f-78xgx-1-62841247-82.1".

您可以像这样通过 E-Mail Activity API 检索这些消息:

var queryParams = JsonSerializer.Serialize(new
{
  query = $"msg_id LIKE '{messageId}%'",
  limit = 10
});

var response = await client.RequestAsync(
  method: SendGridClient.Method.GET,
  urlPath: "messages",
  queryParams: queryParams
);

Console.WriteLine(await response.Body.ReadAsStringAsync());

记下 query 属性 的值 $"msg_id LIKE '{messageId}%'"。 此查询将筛选出以从群发电子邮件 (messageId) 中以消息 ID return 开头的消息,并因此检索所有单独的消息。 在将批量电子邮件提交到 SendGrid 的 queue 后,您不能立即查询这些消息,因为它们需要一些时间才能通过 API 可用。 在我的代码中,我每 30 秒查询一次这些消息,直到群发电子邮件中的收件人数量与消息匹配 returned.

生成的 JSON 数据如下所示:

{
  "messages": [
    {
      "from_email": "some@email.address",
      "msg_id": "5QSczogTRHqFtiIkLxMtWA.filterdrecv-5645d9c87f-6r2ch-1-62847C63-2D.0",
      "subject": "Sending with Twilio SendGrid is Fun",
      "to_email": "some@email.address",
      "status": "delivered",
      "opens_count": 0,
      "clicks_count": 0,
      "last_event_time": "2022-05-18T05: 01: 05Z"
    },
    {
      "from_email": "some@email.address",
      "msg_id": "5QSczogTRHqFtiIkLxMtWA.filterdrecv-5645d9c87f-6r2ch-1-62847C63-2D.1",
      "subject": "Sending with Twilio SendGrid is Fun",
      "to_email": "some@email.address",
      "status": "delivered",
      "opens_count": 0,
      "clicks_count": 0,
      "last_event_time": "2022-05-18T05: 01: 05Z"
    },
        ...
  ]
}

如您所见,这包括 status 属性.

注意:您必须购买 additional email activity history 才能访问电子邮件 Activity 供稿 API。
注意:要通过电子邮件 Activity 供稿 API 检索消息,您的 API 密钥必须具有 email_activity.read 权限。

这是一种检索电子邮件状态的方法。 另一种跟踪电子邮件状态的方法是创建一个 public ASP.NET 端点,将 URL 配置为 SendGrid Event Webhook。 SendGrid 将针对每个事件向您的 ASP.NET 端点发送一个 HTTP 请求,您可以使用它来更新电子邮件的状态。


PS:您可能已经这样做了,但是无论您是向多个收件人发送一封电子邮件还是向多个收件人发送多封电子邮件,Twilio 建议设置 SendAt 属性 在发送批量电子邮件时 SendGridMessage

引自SendGrid docs

This technique allows for a more efficient way to distribute large email requests and can improve overall mail delivery time performance. This functionality:

  • Improves efficiency of processing and distributing large volumes of email.
  • Reduces email pre-processing time.
  • Enables you to time email arrival to increase open rates.
  • Is available for free to all SendGrid customers.

我希望我回答了你所有的问题,如果没有让我知道。我迫不及待地想看看你建造了什么!