Formater un email via HTML [C#/HTML] - C#/.NET managed - Programmation
Marsh Posté le 17-11-2016 à 09:24:22
Bonjour,
Effectivement le StringBuilder est une façon affreuse de faire : c'est illisible et chiant à maintenir. Le premier objectif est donc de séparer le template html dans un fichier BodyEmailFormat.html comme tu as fait.
Si tu restes sur du fait maison, tu peux garder les String.Replace mais pour ton tableau, au lieu de remplacer une seule ligne tu injectes le tableau entier d'un coup (l'ensemble des tr) à la place de la balise tableStrMember.
Comme ça tu auras quand même l'essentiel de ton gabarit dans le .html.
Si tu veux un truc plus poussé, utilise un vrai moteur de templating, là le choix va dépendre de ce que tu maitrises déjà et du temps que tu veux y consacrer, parce que ton besoin est super basique, donc si tu mets une grosse solution en place ça te prendra du temps qui ne sera pas forcément rentabilisé mais ce sera enrichissant pour toi.
Tu y gagnes la possibilité de faire par exemple des vraies boucles, des tests conditionnels (ex : si ligne paire alors fond gris sinon fond blanc, si valeur = "ERREUR" alors afficher en rouge, etc), directement dans le template...
Il y a plusieurs solutions :
- Si tu maitrises MVC, tu peux utiliser par exemple https://github.com/Antaris/RazorEngine C'est très puissant vu que ça utilise Razor, mais sans doute un peu lourd et il faut un framework récent
- Dans le temps il y avait NVelocity : https://sourceforge.net/projects/nvelocity/ , ça a un peu vieilli mais ça peut être un avantage si ton environnement aussi.
Quick start : https://chrisseroka.wordpress.com/2 [...] nvelocity/
Comme tu peux voir en quelques lignes ça fait déjà bcp de choses et sans embarquer un truc monstrueux derrière. T'as juste à remettre dans un fichier .html distinct le contenu de la variable "template" de l'exemple.
- Sans doute plein d'autres moteurs
- Une approche différente mais supportée en natif par .Net : utiliser un fichier XLST et un XML. Mais il faut maitriser XSLT et tu n'as plus de vrai .html pour ton template.
Marsh Posté le 23-11-2016 à 21:47:21
TotalRecall a écrit : Bonjour, Effectivement le StringBuilder est une façon affreuse de faire : c'est illisible et chiant à maintenir. Le premier objectif est donc de séparer le template html dans un fichier BodyEmailFormat.html comme tu as fait. Si tu restes sur du fait maison, tu peux garder les String.Replace mais pour ton tableau, au lieu de remplacer une seule ligne tu injectes le tableau entier d'un coup (l'ensemble des tr) à la place de la balise tableStrMember. Si tu veux un truc plus poussé, utilise un vrai moteur de templating, là le choix va dépendre de ce que tu maitrises déjà et du temps que tu veux y consacrer, parce que ton besoin est super basique, donc si tu mets une grosse solution en place ça te prendra du temps qui ne sera pas forcément rentabilisé mais ce sera enrichissant pour toi. Tu y gagnes la possibilité de faire par exemple des vraies boucles, des tests conditionnels (ex : si ligne paire alors fond gris sinon fond blanc, si valeur = "ERREUR" alors afficher en rouge, etc), directement dans le template... Il y a plusieurs solutions : - Dans le temps il y avait NVelocity : https://sourceforge.net/projects/nvelocity/ , ça a un peu vieilli mais ça peut être un avantage si ton environnement aussi. - Sans doute plein d'autres moteurs - Une approche différente mais supportée en natif par .Net : utiliser un fichier XLST et un XML. Mais il faut maitriser XSLT et tu n'as plus de vrai .html pour ton template. |
Salut,
Merci pour ta réponse.
Du coup j'ai fais comme tu disais en passant directement le tableau dans ma string.
Par contre ne connaissant pas MVC, je ne me suis pas lancé dedans... mais de ce que j'en ai lu sur internet ça m'a l'air un peu "overkill" comme solution
Marsh Posté le 16-11-2016 à 22:30:06
Bonjour tout le monde,
Je suis en train de créer une application qui permet de vérifier les membres d'un groupe Active Directory, exporter la liste des utilisateurs et leur managers en utilisant un Dictionary<string utilisateur, string manager>.
Le but étant ensuite de formater le corps d'un email en y insérant un tableau contenant le nom du manager et les utilisateurs qui sont liés a ce même manager. Chaque manager recevra un email séparément avec un tableau contenant uniquement ses utilisateurs.
Mon application est composées de deux fichiers class Program.cs (pour l’exécution du code) et Emails.cs (pour la création de l'email avec le paramètre IsBodyHTML = True; et la configuration SMTP) ainsi que d'un fichier HTML BodyEmailFormat.html.
Jusqu'ici j'arrive a exporter la liste des utilisateurs/manager et l’envoyer via email. Sauf que le résultat n'est pas tip top sans aucun formatage. L’idée serait donc de formater le corps de l'email en HTML. Et c'est la que mes problèmes commencent...
J'ai réussi a faire un formatage basique en utilisant StringBuilder() de la façon suivante:
Et le résultat donne ça (Pas ce qu'on fait de mieux en terme d’esthétique ) :
Ce que je souhaiterais faire c'est de pouvoir appliquer du CSS a ma table/autres via mon fichier HTML et utiliser ce fichier HTML directement pour le corps du message en y insérant les données. Ce qui me permettrait aussi d'avoir un code plus propre.
J'ai vu qu'il était possible d'utiliser la façon suivante affin de remplacer du texte directement dans le fichier HTML:
Sauf que cette méthode remplace du texte déjà existant et ne sachant pas a l'avance combien d'utilisateurs le groupe contient, je ne vois pas comment faire pour ajouter x utilisateurs en même temps.
Est-ce que vous auriez une idée/conseil pour pouvoir formater mon email en HTML directement via le fichier HTML sans tout écrire via StringBuilder() ?
Merci d'avance
Voici le code un peu plus complet:
Message édité par Slayer_hc le 16-11-2016 à 22:33:25
---------------
BattleTag : Xephon#2299