如何替换 Sendgrid 模板变量? (在 C# 中)
How to substitute Sendgrid template variables? (in C#)
我在我的 SendGrid 模板中定义了一个变量 <%datetime%>
。根据这个命名约定,我决定遵循主题行中已经放置的 <%subject%>
。我在示例中看到了不同的变量命名约定:https://github.com/sendgrid/sendgrid-csharp/blob/master/SendGrid/Example/Example.cs#L41 uses -name-
and -city-
, while 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());
请求已被接受并处理,但我收到的电子邮件仍有主题行
"Supposed to be replaced. Can I get rid of this somehow then?"
正文被原始模板内容替换,但变量也没有被替换。我做错了什么?
阅读 How to Add Custom variables to SendGrid email via API C# and Template 问答后,我意识到使用 <%foobar%>
类型表示法是错误的决定。
基本上它是 SendGrid 自己的表示法,<%subject%>
意味着它们将替换您分配给 Mail
subject
的内容,在我的例子中是 "Supposed to be replaced. Can I get rid of this somehow then?"
。现在我 assemble 那里有一个合适的主题。
在模板主体中,我将变量的表示法切换为 {{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%>
表示法,而是从多种其他样式中选择一种。 None 我阅读的示例或文档提到了这一点。
我在我的 SendGrid 模板中定义了一个变量 <%datetime%>
。根据这个命名约定,我决定遵循主题行中已经放置的 <%subject%>
。我在示例中看到了不同的变量命名约定:https://github.com/sendgrid/sendgrid-csharp/blob/master/SendGrid/Example/Example.cs#L41 uses -name-
and -city-
, while 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());
请求已被接受并处理,但我收到的电子邮件仍有主题行
"Supposed to be replaced. Can I get rid of this somehow then?"
正文被原始模板内容替换,但变量也没有被替换。我做错了什么?
阅读 How to Add Custom variables to SendGrid email via API C# and Template 问答后,我意识到使用 <%foobar%>
类型表示法是错误的决定。
基本上它是 SendGrid 自己的表示法,<%subject%>
意味着它们将替换您分配给 Mail
subject
的内容,在我的例子中是 "Supposed to be replaced. Can I get rid of this somehow then?"
。现在我 assemble 那里有一个合适的主题。
在模板主体中,我将变量的表示法切换为 {{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%>
表示法,而是从多种其他样式中选择一种。 None 我阅读的示例或文档提到了这一点。