如何使用电子邮件模板c#发送电子邮件

Posted

技术标签:

【中文标题】如何使用电子邮件模板c#发送电子邮件【英文标题】:how to send email wth email template c# 【发布时间】:2012-05-17 18:38:37 【问题描述】:

假设我需要向客户发送包含客户详细信息和订单详细信息的邮件。 我在 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 类,那么请指导我如何在循环中迭代并为订单详细信息生成正文。

【问题讨论】:

如果第三方库是一个选项,请查看dotLiquid。您可能还想看看我对类似问题的回答:***.com/a/28558160/79485 如何下载MailDefinition MailDefinition 是 .NET 的一部分,位于 System.Web 命名空间中。你不需要下载它。 【参考方案1】:

你不能用默认替换的东西来做这种“复杂”的逻辑(占位符处理只用于简单的变量,例如名称或值)。

您必须自己进行解析。根据复杂性(例如带有循环的循环),这可能会有点棘手。

如果您不想要或不需要这些东西,那就更简单了。例如。使用正则表达式\foreach (.*?)\(.*?)\end\ 查找此类循环,然后按照您需要的方式解析内容/匹配的组。完成该部分后,您可以替换其他值或使用默认替换功能。

这种方法的唯一缺点是您必须为每个收件人重新创建邮件(即您不能使用MailDefinition 批量发送邮件)。

【讨论】:

我只是不明白如何处理循环。你说“如果你不想要或不需要这样的东西,那就更简单了。例如,使用正则表达式 \foreach (.*?)\(.*?)\end\ 找到这样的循环,然后解析内容/匹配的组您需要的方式。完成该部分后,您可以替换其他值或使用默认替换功能。你能告诉我你想让我用小示例代码做什么吗?谢谢 正则表达式的简短介绍以及如何使用它们来查找模式可以在这里找到:support.microsoft.com/kb/308252/en-us 如果正则表达式匹配,你就会知道有一个循环。捕获组将包含作为字符串迭代的对象/组(在您的示例中为 "Orders")以及用于每个订单的格式字符串("Order ID OrderId...")。如果您不熟悉正则表达式,则使用完整/预制的解决方案(例如 David 建议的解决方案)可能是更好的解决方案。如果需要,可以稍后尝试编写一个简短的示例。【参考方案2】:

作为 MailDefinition 的替代方案,请查看 RazorEngine https://github.com/Antaris/RazorEngine。

RazorEngine 是一个简化的模板框架,围绕 Microsoft 新的 Razor 解析引擎,用于 ASP.NET MVC3 和 网页。 RazorEngine 提供包装器和附加服务 围绕解析引擎构建以允许解析技术 用于其他项目类型

它允许您在 ASP.NET MVC 之外使用 razor 模板,然后编写类似这样的内容(未测试):

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);

【讨论】:

感谢您的帮助,但我使用的是 asp.net webform 而不是 mvc。我想要这样的代码,它也可以在 c# 的 windows 应用程序中工作。 非常好,简单的解决方案!这是我评论的 10 个左右中最好的。我对此进行了扩展以创建实际的 csthml 模板文件。很棒的是,即使它们在一个简单的类库中,Visual Studio 仍然将它们作为 cshtml 获取,并且我获得了完整的 Razor 语法支持! 我喜欢这个。但是我的模板作者已经习惯了 KnockOut 模板。是否有任何用于模板的 Knockout 服务器端 API? 我发现了一个异常,因为在 foreach 循环中剃刀语法不好。为了解决这个问题,您需要在循环内我们有文本(显然)的地方添加 块。所以这个例子应该是这样的:@foreach(var order in Model.Orders) &lt;text&gt;Order ID &lt;/text&gt;@order.Id &lt;text&gt;Quantity: &lt;/text&gt;@order.Qty &lt;strong&gt;@order.Price&lt;/strong&gt;&lt;text&gt;.&lt;/text&gt;

以上是关于如何使用电子邮件模板c#发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 发送 html 电子邮件

C#之发送邮件模板+封装ZJ版

如何通过 Gmail 使用 C# 发送电子邮件

如何在 Spring Boot 应用程序中使用 Freemarker 模板发送电子邮件?

如何解析 Thymeleaf 模板以通过电子邮件发送?

使用模板发送电子邮件 (Mandrill PHP)