如何使用SendGrid API v3在C#中批量发送1000封预制邮件?
解决SendGrid API v3在C#中批量发送邮件的问题
你现在的思路是创建1000个独立的SendGridMessage然后批量发送,但其实SendGrid的C# SDK有更高效的批量实现方式,这里提供两种适配你场景的方案:
方案1:使用单个SendGridMessage + 多Personalizations(推荐,单API请求)
SendGrid API允许在单个请求中通过Personalizations字段添加最多1000个收件人(刚好匹配你的需求),每个收件人可以配置独立的内容、主题等。这种方式比发送1000次单请求高效得多,还能避免触发API限流。
修改你的代码如下:
private async Task SendBatchEmails(DataRowCollection emailDataRows) { var WriteToDatabaseCollection = new Dictionary<Guid, string>(); // 创建单个批量邮件实例 var bulkMsg = new SendGridMessage(); // 统一设置发件人(所有邮件发件人一致时) var from = new EmailAddress(emailDataRows[0]["SenderEmailAddress"] + "", emailDataRows[0]["SenderName"] + ""); bulkMsg.From = from; foreach (DataRow emailDataRow in emailDataRows) { // 为每个收件人创建专属的个性化配置 var personalization = new Personalization(); var to = new EmailAddress(emailDataRow["RecipientEmailAddress"] + "", emailDataRow["RecipientName"] + ""); personalization.Tos.Add(to); // 设置该收件人的邮件主题 personalization.Subject = emailDataRow["Subject"] + ""; // 添加该收件人的文本和HTML内容 personalization.Content.Add(new Content("text/plain", emailDataRow["MessageBody"] + "")); personalization.Content.Add(new Content("text/html", $"<strong>{emailDataRow["MessageBody"] + "" }</strong>")); // 将个性化配置加入批量邮件 bulkMsg.Personalizations.Add(personalization); } // 仅需调用一次发送接口,即可完成1000封邮件的批量投递 await emailClient.SendEmailAsync(bulkMsg); dataContext.UpdateEmailResult(WriteToDatabaseCollection); }
如果你的邮件存在发件人不同的场景,也可以在每个Personalization实例中单独设置From(注意发件人邮箱必须在SendGrid控制台完成验证)。
方案2:使用SendEmailsAsync发送多个SendGridMessage(多请求批量)
如果你坚持要创建1000个独立的SendGridMessage,SendGrid C# SDK(v9及以上版本)提供了SendEmailsAsync方法,可接收IEnumerable<SendGridMessage>参数批量处理请求(本质是拆分多个API请求,效率略低于方案1)。
修改你的批量发送方法:
public async Task SendBatchEmailsEmailAsync(List<SendGridMessage> messages) { // 调用批量发送接口 await client.SendEmailsAsync(messages); }
⚠️ 注意:SendGrid对API请求频率有限制,一次性发送1000个独立消息可能触发限流,建议拆分批次(比如每次发100个,间隔数秒)后再发送。
额外注意事项
- 收件人上限:方案1的单个请求最多支持1000个
Personalizations,刚好适配你的需求;若后续需求超过1000,需拆分多个请求。 - 发件人验证:确保发件人邮箱已在SendGrid控制台完成验证,否则邮件易被退回或进入垃圾邮件。
- 状态跟踪:若需追踪每封邮件的发送状态,可在
SendGridMessage中设置BatchId,后续通过SendGrid的Webhook或API查询批次状态。
内容的提问来源于stack exchange,提问作者Ronald Herhuth




