2012-05-09 659 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