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

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

Ответ 1

В качестве альтернативы MailDefinition просмотрите RazorEngine https://github.com/Antaris/RazorEngine.

RazorEngine - это упрощенная структура шаблонов, построенная вокруг Microsoft новый механизм разбора Razor, используемый как в 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);

Ответ 2

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

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

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

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

Ответ 3

Механизм бритвы не работает с запросом @media