web-dev-qa-db-fra.com

comment envoyer un e-mail avec le modèle d'e-mail c #

supposons que je doive envoyer un courrier au client avec les détails du client et les détails de sa commande. j'ai des données html de modèle dans un fichier html. Les données client sont là et ainsi que les détails de la commande sont également là dans le même fichier de modèle html. mon html ressemble

<html>
<body>
Hi {FirstName} {LastName},

Here are your orders: 
{foreach Orders}
    Order ID {OrderID} Quantity : {Qty} <strong>{Price}</strong>. 
{end}

</body>
</html>

maintenant, je veux remplir tous les exemples de mots clés entourés de {} avec la valeur réelle et également itérer et remplir les commandes.

j'ai recherché sur Google et constaté que Microsoft fournissait une classe appelée MailDefinition par laquelle nous pouvons générer dynamiquement le corps du courrier. j'ai un exemple de code aussi

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());

par le code ci-dessus, nous pouvons remplacer la pseudo-valeur par la valeur réelle, mais je ne sais pas comment itérer dans le détail des commandes et remplir les données des commandes.

donc s'il est possible d'utiliser la classe MailDefinition, veuillez me guider avec du code expliquant comment puis-je itérer en boucle et générer le corps des détails des commandes.

23
Thomas

Comme alternative à MailDefinition, jetez un œil à RazorEngine https://github.com/Antaris/RazorEngine .

RazorEngine est un cadre de modèles simplifié construit autour du nouveau moteur d'analyse Razor de Microsoft, utilisé à la fois dans ASP.NET MVC3 et dans les pages Web. RazorEngine fournit un wrapper et des services supplémentaires construits autour du moteur d'analyse pour permettre à la technologie d'analyse d'être utilisée dans d'autres types de projets .

Il vous permet d'utiliser des modèles de rasoir en dehors d'ASP.NET MVC, puis d'écrire quelque chose comme ça ( non testé):

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);
44
David Tischler

Vous ne pouvez pas faire une telle logique "compliquée" avec les éléments de remplacement par défaut (la gestion des espaces réservés est conçue pour être utilisée uniquement pour des variables simples, par exemple des noms ou des valeurs).

Vous devrez faire l'analyse vous-même. En fonction de la complexité (par exemple, des boucles avec des boucles), cela peut devenir un peu délicat.

Si vous ne voulez pas ou n'avez pas besoin de telles choses, c'est plus trivial. Par exemple. utilisez l'expression régulière \{foreach (.*?)\}(.*?)\{end\} pour trouver de telles boucles, puis analysez le contenu/les groupes correspondants comme vous le souhaitez. Une fois cette partie terminée, vous pouvez remplacer d'autres valeurs ou utiliser la fonction de remplacement par défaut.

Le seul inconvénient de cette approche est le fait que vous devrez recréer le courrier pour chaque destinataire (c'est-à-dire que vous ne pouvez pas envoyer de courrier en masse à l'aide de MailDefinition).

1
Mario