как отправить электронное письмо с шаблоном электронной почты С #

Предположим, мне нужно отправить письмо клиенту с подробностями о клиенте и его заказе. У меня есть данные шаблона 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>

теперь я хочу заполнить все образцы ключевых слов, окруженных {}, фактическим значением, а также выполнить итерацию и заполнить заказы.

Я поискал в Google и обнаружил, что Microsoft предоставляет класс под названием 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, пожалуйста, расскажите мне, как я могу выполнить итерацию в цикле и сгенерировать тело для деталей заказов.


person Thomas    schedule 09.05.2012    source источник
comment
Если можно использовать стороннюю библиотеку, обратите внимание на dotLiquid. Вы также можете увидеть мой ответ на аналогичный вопрос: stackoverflow.com/a/28558160/79485   -  person Marcel    schedule 25.02.2015
comment
Как я могу загрузить MailDefinition?   -  person Kiquenet    schedule 07.10.2015
comment
MailDefinition является частью .NET в пространстве имен System.Web. Вам не нужно его скачивать.   -  person Alan B    schedule 29.10.2015


Ответы (2)


В качестве альтернативы MailDefinition взгляните на RazorEngine https://github.com/Antaris/RazorEngine.

RazorEngine - это упрощенная структура шаблонов, созданная на основе нового механизма синтаксического анализа Microsoft Razor, используемого как в ASP.NET MVC3, так и в веб-страницах. RazorEngine предоставляет оболочку и дополнительные службы, построенные на основе механизма синтаксического анализа, что позволяет использовать технологию синтаксического анализа в других типах проектов.

Он позволяет использовать шаблоны razor за пределами 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);
person David Tischler    schedule 09.05.2012
comment
Спасибо за помощь, но я использую веб-форму asp.net, а не mvc. Я хочу, чтобы код был таким, чтобы он работал и в приложении Windows на С #. - person Thomas; 09.05.2012
comment
Действительно красивое, простое решение! Это было лучшее из 10 или около того, которые я просмотрел. Я немного расширил это, чтобы создать фактические файлы шаблонов csthml. Что замечательно, даже несмотря на то, что они находятся в простой библиотеке классов, Visual Studio по-прежнему воспринимает их как cshtml, и я получаю полную поддержку синтаксиса Razor! - person Tim; 30.07.2013
comment
Мне это нравится. Но мои авторы-шаблоны привыкли к шаблонам KnockOut. Есть ли API на стороне сервера Knockout для создания шаблонов? - person Ravi; 06.11.2014
comment
Я обнаружил исключение из-за плохого синтаксиса бритвы в цикле foreach. Чтобы решить эту проблему, вам нужно добавить блоки ‹text›, где у нас есть текст (очевидно) внутри цикла. Итак, этот пример должен выглядеть так: @foreach(var order in Model.Orders) { <text>Order ID </text>@order.Id <text>Quantity: </text>@order.Qty <strong>@order.Price</strong><text>.</text> } - person Pnctovski; 26.12.2014

Вы не можете выполнить такую ​​«сложную» логику с заменой по умолчанию (обработка заполнителя предназначена для использования только для простых переменных, например, имен или значений).

Вам нужно будет выполнить синтаксический анализ самостоятельно. В зависимости от сложности (например, петли внутри петель) это может быть немного сложно.

Если вы не хотите или не нуждаетесь в таких вещах, это более тривиально. Например. используйте регулярное выражение \{foreach (.*?)\}(.*?)\{end\} для поиска таких циклов, а затем проанализируйте содержимое / сопоставленные группы нужным вам способом. Как только эта часть будет завершена, вы можете заменить другие значения или использовать функцию замены по умолчанию.

Единственным недостатком этого подхода является тот факт, что вам придется воссоздавать почту для каждого получателя (т.е. вы не можете использовать массовую рассылку с помощью MailDefinition).

person Mario    schedule 09.05.2012
comment
Я просто не понимаю, как обращаться с петлей. Ты сказал, что если ты не хочешь или не нуждаешься в таких вещах, это более тривиально. Например. используйте регулярное выражение \ {foreach (. *?) \} (. *?) \ {end \}, чтобы найти такие циклы, а затем проанализируйте содержимое / сопоставленные группы нужным вам способом. Как только эта часть будет завершена, вы можете заменить другие значения или использовать функцию замены по умолчанию. Можете ли вы, пожалуйста, показать мне, что вы хотите, чтобы я сделал с небольшим образцом кода. Благодарность - person Thomas; 10.05.2012
comment
Краткое введение в регулярные выражения и их использование для поиска шаблонов можно найти здесь: support .microsoft.com / kb / 308252 / en-us Если регулярное выражение совпадает, вы узнаете, что существует цикл. Группы захвата будут содержать объект / группу для перебора в виде строки (в вашем примере "Orders"), а также строку формата, которая будет использоваться для каждого заказа ("Order ID {OrderId}..."). Если вы не знакомы с регулярными выражениями, использование готового / готового решения (например, предложенного Дэвидом) может быть лучшим решением. Если хотите, можете попробовать написать небольшой пример позже. - person Mario; 10.05.2012