使用SendGrid v3批量发送电子邮件

3

我有一个使用案例,其中我有1000封电子邮件的正文已经准备好(它们可以直接发送),一个发件人邮箱地址和1000个收件人。我正在使用C#中的SendGrid API v3。我正在努力弄清如何批量将它们发送到SendGrid API。这是我的代码:

 private async Task SendBatchEmails(DataRowCollection emailDataRows)
        {
            var WriteToDatabaseCollection = new Dictionary<Guid, string>();
            var emailObjectCollection = new List<SendGridMessage>();

            foreach (DataRow emailDataRow in emailDataRows)
            {
                var emailObject = new SendGridMessage();

                var to = (new EmailAddress(emailDataRow["RecipientEmailAddress"] + "", emailDataRow["RecipientName"] + ""));
                var from = new EmailAddress(emailDataRow["SenderEmailAddress"] + "", emailDataRow["SenderName"] + "");
                var subject = emailDataRow["Subject"] + "";
                var text = emailDataRow["MessageBody"] + "";
                var html = $"<strong>{emailDataRow["MessageBody"] + "" }</strong>";

                var msg = MailHelper.CreateSingleEmail(from, to, subject, text, html);
                emailObjectCollection.Add(msg);

            }

            await emailClient.SendBatchEmailsEmailAsync(emailObjectCollection);


            dataContext.UpdateEmailResult(WriteToDatabaseCollection);
        } 


    public async Task SendBatchEmailsEmailAsync(List<SendGridMessage> messages)
    {
        return await client.????(messages);
    }

客户端是SendGridClient,我唯一的选项是:SendEmailAsync(msg)

如何发送批量的SendGrid消息?


1
我已经删除了你的批处理文件标签。在将它们分配给你的问题之前,请查看标签的描述。批处理文件是Windows、MS-DOS或OS/2脚本,通常具有.bat扩展名,但最近也有.cmd扩展名。如果您在使用批处理文件代码时遇到困难,请随时恢复该标签,但在这样做时,请包括一个[mcve]批处理文件内容,以便我们提供针对特定编程问题的帮助。 - Compo
这个回答解决了你的问题吗?sendgrid多个收件人c# - Jonathan
2个回答

4

我是 Twilio SendGrid 的开发者传道者。

如果一封邮件的正文内容不同,就没有批量发送电子邮件的功能。但是您可以将相同的内容发送到多个地址。

要发送您的 1000 封电子邮件,您需要遍历您的消息列表,并为每个消息调用一次 API。


1
嗨Phil,如果我有数百或数千封电子邮件要发送(例如,在我的每个网络研讨会之前,我想向所有学生发送提醒电子邮件),并且它们具有个性化(即唯一)的主题和正文,那么我是否仍然不能在一个请求中将所有数据的数组发布到Sendgrid API端点?我需要在服务器上处理循环并为每个请求发送请求似乎很奇怪。感谢更新。 - Ryan
我想知道https://docs.sendgrid.com/for-developers/sending-email/substitution-tags是否是我需要的,来源于https://dev59.com/mpPfa4cB1Zd3GeqPDXWi#35040850。 - Ryan
@philnash 既然你是专家,能不能帮我快速看一下我的问题? https://stackoverflow.com/questions/76707901/sendgrid-sending-bulk-email-results-in-badrequest-error - Joe

-1
如果您要发送的电子邮件中有任何一个与其他电子邮件具有相同的正文(如其他答案中所述,您无法批量发送具有不同内容的电子邮件),则可以按正文对它们进行分组,然后分块发送。 SendGridClient每次最多可发送1000封邮件,因此您还需要检查这一点。可以使用以下类似代码实现:
public class Email
{
    string Content { get; }
    string Address { get; }
}

将你的电子邮件分组、分块并按批次发送的代码(其中电子邮件是一组电子邮件对象)大致如下:

var client = new SendGridClient("123456APIKEY");
var senderEmail = "someEmail";
var groupedByContent = emails.GroupBy(x => x.Content, x => x.Address);

foreach(var group in groupedByContent)
foreach(var recipientsBatch in group.Chunk(1000))
{
    var message = new SendGridMessage();
    // This extra index is needed to create separate personalizations, if you don't want recipients to see each others email
    for (var i = 0; i < recipientsBatch.Length; i++)
        message.AddTo(new EmailAddress { Email = recipientsBatch[i] }, i);
    message.PlainTextContent = group.Key;
    message.SetFrom(senderEmail);
    var response = await client.SendEmailAsync(message);
    // response processing code ...     
}

这仍然为每个发送的电子邮件进行单个API调用,而不是批处理。 - Jason Bert
它会为多个电子邮件地址发送单个API调用,当电子邮件正文相同时(没有每封电子邮件的自定义参数等)。另一种选择是为每个电子邮件发送1个API调用,具有相同的正文。我认为这是一种改进,希望其他人也能发现它有用。 - Simon Katanski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接