如何替换Sendgrid模板变量? (在C#中)

时间:2017-01-02 21:46:03

标签: c# sendgrid sendgrid-api-v3 sendgrid-templates

我在SendGrid模板中定义了一个变量<%datetime%>。我通过这个命名约定决定遵循已经放置的主题行<%subject%>。我在示例中看到了不同的变量命名约定:https://github.com/sendgrid/sendgrid-csharp/blob/master/SendGrid/Example/Example.cs#L41使用-name--city-,而https://github.com/sendgrid/sendgrid-csharp/blob/master/SendGrid/Example/Example.cs#L157使用%name%%city%

我只是假设,变量替换基于简单模式匹配,因此这些示例的对应模板包含相同的完全字符串。到目前为止,这对我来说无论如何都不起作用。

string sendGridApiKey = ConfigurationManager.AppSettings["SendGridApiKey"].ToString();
var sendGrid = new SendGridAPIClient(sendGridApiKey);

string emailFrom = ConfigurationManager.AppSettings["EmailFrom"].ToString();
Email from = new Email(emailFrom);
string subject = "Supposed to be replaced. Can I get rid of this somehow then?";
string emaiTo = ConfigurationManager.AppSettings["EmailTo"].ToString();
Email to = new Email(emaiTo);
Content content = new Content("text/html", "Supposed to be replaced by the template. Can I get rid of this somehow then?");
Mail mail = new Mail(from, subject, to, content);
mail.TemplateId = "AC6A01BB-CFDF-45A7-BA53-8ECC54FD89DD";
mail.Personalization[0].AddSubstitution("<%subject%>", $"Your Report on {shortDateTimeStr}");
mail.Personalization[0].AddSubstitution("<%datetime%>", longDateTimeStr);
// Some code adds several attachments here

var response = await sendGrid.client.mail.send.post(requestBody: mail.Get());

请求被接受并处理,但是我收到的电子邮件仍然有主题

  

&#34;应该被替换。我可以以某种方式摆脱这种情况吗?&#34;

正文替换为原始模板内容,但变量也未替换。我做错了什么?

1 个答案:

答案 0 :(得分:4)

在阅读How to Add Custom variables to SendGrid email via API C# and Template个问题和答案后,我意识到使用<%foobar%>类型表示法是错误的决定。

基本上它是SendGrid自己的符号,<%subject%>表示他们会替换你分配给Mail subject的内容,在我的情况下是{ {1}}。现在我在那里组装了一个合适的主题。

在模板正文中,我为变量切换为"Supposed to be replaced. Can I get rid of this somehow then?"表示法。虽然上面链接的问题的最后一个答案表明您必须将{{foobar}}插入模板正文中,但这不是必需的。没有它对我有效。我假设我可以在主题行中使用我自己的<%body%>变量,并使用正确的替换而不是{{foobar}}

基本上,模板的默认状态为<%subject%>,主体为<%subject%>,身体为<%body%>,如果您不想要替换并提供,则可以实现无缝的电子邮件传送主题和身体通过API。

如果我错了,请纠正我。

string subject = $"Report on ${shortDateTimeStr}";
string emaiTo = ConfigurationManager.AppSettings["EmailTo"].ToString();
Email to = new Email(emaiTo);
Content content = new Content("text/html", "Placeholder");
Mail mail = new Mail(from, subject, to, content);
mail.TemplateId = "AC6A01BB-CFDF-45A7-BA53-8ECC54FD89DD";
mail.Personalization[0].AddSubstitution("{{datetime}}", longDateTimeStr);

TL; DR:不要为自己的变量使用<%foobar%>表示法,而是从其他十几种样式中选择一种。我读过的所有例子或文档都没有提到这一点。