2012-05-09 585 views
20

假设我需要发送邮件给客户与客户的细节和他的订单细节。 我有一个html文件中的模板html数据。客户数据在那里,以及订单的细节也在同一个html模板文件中。我的HTML看起来像如何发送电子邮件与电子邮件模板c#

<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 = "[email protected]"; 
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("[email protected]", replacements, body, new System.Web.UI.Control()); 

,但我不知道如何在订单详细迭代和填充订单数据。

所以如果有可能使用MailDefinition类,那么请用代码指导我如何迭代循环并生成订单细节的正文。

+0

如果第三方库是一个选项,看看[dotLiquid](http://dotliquidmarkup.org/)。你也可能想看到我的答案类似的问题:http://stackoverflow.com/a/28558160/79485 – Marcel

+0

我如何下载*** MailDefinition ***? – Kiquenet

+0

MailDefinition是.NET中System.Web名称空间的一部分。你不需要下载它。 –

回答

41

作为MailDefinition的替代方法,看看RazorEngine https://github.com/Antaris/RazorEngine

RazorEngine是围绕 微软的新剃刀解析引擎建立了一个简单的模板框架,在这两个ASP.NET MVC3和 网页使用。 RazorEngine提供了一个围绕解析引擎构建的包装和附加服务 ,允许在其他项目类型中使用解析技术 。

它可以让你使用剃刀模板ASP.NET MVC的外面,然后写这样的事情(未测试):

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

感谢您的帮助,但我使用的是asp.net webform不是mvc。代码以这种方式在c#中也能在Windows应用程序中工作。 – Thomas

+0

真的不错,简单的解决方案这是我回顾的10个左右最好的。我扩展了这一点来创建实际的csthml模板文件。最棒的是即使他们在一个简单的类库中,Visual Studio仍将它们视为cshtml,并获得完整的Razor语法支持! – Tim

+0

我喜欢这一点。但我的模板作者习惯了KnockOut模板。有模板的Knockout服务器端API吗? – Ravi

1

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

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

如果你不想或不需要这样的事情,那会更微不足道。例如。使用正则表达式\{foreach (.*?)\}(.*?)\{end\}来查找这样的循环,然后按照需要的方式解析内容/匹配的组。一旦完成该部分,您可以替换其他值或使用默认替换功能。

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

+0

我只是不明白如何处理循环。你说:“如果你不想要或不需要这些东西,那就更加微不足道了,例如使用正则表达式\ {foreach(。*?)\}(。*?)\ {end \}来查找这样的循环,然后按照需要的方式解析内容/匹配的组。一旦完成了这部分,您可以替换其他值或使用默认的替换功能。“can u plzz show me what want you to use with small sample code。谢谢 – Thomas

+0

正则表达式的简短介绍以及如何使用它们来查找模式可以在这里找到:http://support.microsoft.com/kb/308252/en-us如果正则表达式匹配,你会知道有一个循环。捕获组将包含要迭代的对象/组作为一个字符串(在你的例子中,“Orders”)以及每个订单使用的格式字符串('“Order ID {OrderId} ...”')。如果你不熟悉正则表达式,使用完整/预先制定的解决方案(如David提供的解决方案)可能是更好的解决方案。如果想要,可以尝试稍后写一个简短示例。 – Mario