如何使用电子邮件模板 C# 发送电子邮件
本文关键字:电子邮件 何使用 | 更新日期: 2023-09-27 18:33:31
假设我需要向客户发送包含客户详细信息及其订单详细信息的邮件。我在 HTML 文件中有模板 HTML 数据。客户数据在那里,订单详细信息也在同一 HTML 模板文件中。我的 HTML 看起来像
<html>
<body>
Hi {FirstName} {LastName},
Here are your orders:
{foreach Orders}
Order ID {OrderID} Quantity : {Qty} <strong>{Price}</strong>.
{end}
</body>
</html>
现在我想用实际值填充所有用 {} 括起来的示例关键字,并迭代和填充订单。
我搜索谷歌,发现微软提供了一个名为MailDefinition的类。通过它可以动态生成邮件正文。我得到了一个示例代码也喜欢
MailDefinition md = new MailDefinition();
md.From = "test@domain.com";
md.IsBodyHtml = true;
md.Subject = "Test of MailDefinition";
ListDictionary replacements = new ListDictionary();
replacements.Add("<%Name%>", "Martin");
replacements.Add("<%Country%>", "Denmark");
string body = "
Hello <%Name%> You're from <%Country%>.";
MailMessage msg = md.CreateMailMessage("you@anywhere.com", replacements, body, new System.Web.UI.Control());
通过上面的代码,我们可以用实际值替换伪值,但我不知道如何在订单详细信息中迭代并填充订单数据。
因此,如果可以使用 MailDefinition 类,那么请指导我如何使用循环迭代并为订单详细信息生成正文的代码。
作为 MailDefinition 的替代方案,请查看 RazorEngine https://github.com/Antaris/RazorEngine。
RazorEngine 是一个简化的模板框架,围绕 Microsoft的新型 Razor 解析引擎,用于 ASP.NET MVC3 和 网页。RazorEngine 提供包装器和附加服务 围绕解析引擎构建,允许解析技术 用于其他项目类型。
它允许您在 MVC 之外使用剃须刀片模板 ASP.NET 然后编写类似以下内容(未经测试):
string template =
@"<html>
<body>
Hi @Model.FirstName @Model.LastName,
Here are your orders:
@foreach(var order in Model.Orders) {
Order ID @order.Id Quantity : @order.Qty <strong>@order.Price</strong>.
}
</body>
</html>";
var model = new OrderModel {
FirstName = "Martin",
LastName = "Whatever",
Orders = new [] {
new Order { Id = 1, Qty = 5, Price = 29.99 },
new Order { Id = 2, Qty = 1, Price = 9.99 }
}
};
string mailBody = Razor.Parse(template, model);
用默认的替换东西做这种"复杂"的逻辑(占位符处理仅用于简单的变量,例如名称或值)。
您必须自己进行解析。根据复杂性(例如循环中的循环),这可能会变得有点棘手。
如果你不想要或不需要这些东西,那就更微不足道了。 例如,使用正则表达式'{foreach (.*?)'}(.*?)'{end'}
来查找此类循环,然后根据需要解析内容/匹配组。完成该部分后,您可以替换其他值或使用默认替换功能。
这种方法的唯一缺点是您必须为每个收件人重新创建邮件(即您不能使用 MailDefinition
群发邮件)。