varios - cómo enviar correo electrónico con plantilla de correo electrónico c#
mailmessage c# body html (2)
Supongamos que necesito enviar un correo al cliente con los detalles del cliente y el detalle de su pedido. Tengo los datos de la plantilla html en un archivo html. Los datos del cliente están allí y, al igual que los detalles de la orden, también se encuentran en el mismo archivo de la plantilla html. mi html parece
<html>
<body>
Hi {FirstName} {LastName},
Here are your orders:
{foreach Orders}
Order ID {OrderID} Quantity : {Qty} <strong>{Price}</strong>.
{end}
</body>
</html>
ahora quiero rellenar todas las palabras clave de muestra rodeadas con {} con valor real y también iterar y completar pedidos.
Busco en Google y descubrí que Microsoft proporciona una clase llamada Definición de correo mediante la cual podemos generar dinámicamente el cuerpo del correo. Tengo un código de muestra también como
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());
Por el código anterior podemos reemplazar el pseudo valor con el valor real, pero no sé cómo iterar en los detalles de los pedidos y rellenar los datos de los pedidos.
así que si es posible usar la clase MailDefinition, por favor guíeme con un código que me permita iterar el ciclo y generar el cuerpo para el detalle de los pedidos.
Como alternativa a MailDefinition, eche un vistazo a RazorEngine https://github.com/Antaris/RazorEngine .
RazorEngine es un marco de plantillas simplificado construido alrededor del nuevo motor de análisis de Razor de Microsoft, utilizado tanto en ASP.NET MVC3 como en las páginas web. RazorEngine proporciona una envoltura y servicios adicionales construidos alrededor del motor de análisis para permitir que la tecnología de análisis se utilice en otros tipos de proyectos .
Te permite usar plantillas de maquinilla de afeitar fuera de ASP.NET MVC y luego escribir algo como esto ( no probado ):
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);
No se puede hacer una lógica tan "complicada" con las cosas de reemplazo predeterminadas (el manejo del marcador de posición está diseñado para ser usado solo para variables simples, por ejemplo, nombres o valores).
Tendrás que hacer el análisis tú mismo. Dependiendo de la complejidad (por ejemplo, los bucles dentro de los bucles), esto puede ser un poco complicado.
Si no quieres o necesitas tales cosas, es más trivial. Por ejemplo, use la expresión regular /{foreach (.*?)/}(.*?)/{end/}
para encontrar dichos bucles, luego analice los contenidos / grupos emparejados de la forma que necesite. Una vez que se hace esa parte, puede reemplazar otros valores o usar la función de reemplazo predeterminada.
El único inconveniente de este enfoque es el hecho de que tendrá que volver a crear el correo para cada destinatario (es decir, no puede hacer un correo masivo con MailDefinition
).