SendGrid C# v3 API动态模板如何获取to收件人名称实现个性化
问题根本原因
SendGrid动态模板的渲染上下文仅会读取personalizations节点下的dynamic_template_data字段内容,收件人to数组的信息不会自动注入到模板渲染上下文中,所以{{to.name}}写法无法读取到对应值是正常的设计。
1. 动态展示收件人姓名实现方式
- 第一步修改动态模板,新增单独的收件人姓名字段占位符,将
{{to.name}}替换为{{RecipientName}}即可,修改后模板代码:
<p> {{MailGreeting}} {{RecipientName}},</p> <p> {{{MailBody}}} </p> <p> {{MailSalutation}} </p>
- 第二步修改数据模型,在
EmailMergeSendDetails类中新增收件人姓名字段:
public class EmailMergeSendDetails { public List<EmailAddress> MailToList { get; set; } public string MailFrom { get; set; } public string MailFromName { get; set; } public string MailSubject { get; set; } public string MailBody { get; set; } // 新增收件人姓名属性 public string RecipientName { get; set; } public string MailGreeting { get; set; } public string MailSalutation { get; set; } }
2. 2.5万级收件人批量发送实现方案
你之前使用的CreateSingleTemplateEmailToMultipleRecipients方法仅适合所有收件人模板内容完全一致的群发场景,无法为每个收件人注入独立的姓名参数,需要自己构造带个性化配置的发送请求,同时遵守SendGrid的接口限流规则:
- 单次API调用最多支持1000个个性化配置,即单批最多发1000个收件人
- 按批次拆分收件人列表,循环调用发送接口即可
改造后发送代码示例
var from = new EmailAddress(d.MailFrom, d.MailFromName); // 拆分收件人为每批1000个,适配SendGrid单调用上限 var recipientBatches = d.MailToList.Chunk(1000); foreach (var batch in recipientBatches) { var msg = new SendGridMessage(); msg.SetFrom(from); msg.SetTemplateId("d-xxxx替换为你的模板ID"); foreach (var recipient in batch) { // 每个收件人构造独立的模板数据,合并公共内容和独立姓名 var dynamicTemplateData = new EmailMergeSendDetails { MailSubject = d.MailSubject, MailSalutation = d.MailSalutation, MailGreeting = d.MailGreeting, MailBody = d.MailBody, RecipientName = recipient.Name }; // 为当前收件人添加独立个性化配置 var personalization = new Personalization(); personalization.AddTo(recipient); personalization.TemplateData = dynamicTemplateData; msg.AddPersonalization(personalization); } // 发送当前批次 var response = await client.SendEmailAsync(msg); // 可根据账号配额添加适当延迟,避免触发速率限制 await Task.Delay(100); }
内容的提问来源于stack exchange,提问作者brianc
相关产品推荐
相关产品推荐

