125 votes

Générer le corps de l’e-mail HTML en c#

Y a-t-il une meilleure façon de générer des email HTML en c# (pour l’envoi via System.Net.Mail), que d’utiliser Stringbuilder pour effectuer les opérations suivantes :

et ainsi de suite et ainsi de suite ?

189voto

MartinHN Points 8587

Vous pouvez utiliser la classe MailDefinition.

Mise à jour - le lien précédent a été rompu
J’ai écrit un blog sur la façon de générer des corps courriel HTML en c# à l’aide de modèles à l’aide de la classe MailDefinition.

31voto

AnthonyWJones Points 122520

Utilisez la classe System.Web.UI.HtmlTextWriter.

Pour HTML étendu qui inclut la création d’attributs de style HtmlTextWriter est probablement la meilleure façon d’aller. Cependant, il peut être un peu maladroit d’utiliser et certains développeurs aiment la balise elle-même à être facile à lire mais choix de perversly HtmlTextWriter avec échancrure égard est un peu bizarre.

Dans cet exemple, vous pouvez également utiliser XmlTextWriter assez efficacement :-

18voto

Seth Points 567

À l'aide de la MailDefinition classe est la mauvaise approche. Oui, c'est pratique, mais c'est aussi primitif et dépend de l'INTERFACE web des commandes--qui n'a pas de sens pour quelque chose qui est généralement une tâche de côté serveur.

L'approche présentée ci-dessous est basé sur la documentation MSDN et Qureshi post sur CodeProject.com.

REMARQUE: Cet exemple extrait le fichier HTML, des images et des pièces jointes à partir de ressources intégrées, mais en utilisant d'autres solutions de rechange pour obtenir les flux de ces éléments sont très bien, par exemple, les chaînes codées en dur, des fichiers locaux, et ainsi de suite.

Stream htmlStream = null;
Stream imageStream = null;
Stream fileStream = null;
try
{
    // Create the message.
    var from = new MailAddress(FROM_EMAIL, FROM_NAME);
    var to = new MailAddress(TO_EMAIL, TO_NAME);
    var msg = new MailMessage(from, to);
    msg.Subject = SUBJECT;
    msg.SubjectEncoding = Encoding.UTF8;
 
    // Get the HTML from an embedded resource.
    var assembly = Assembly.GetExecutingAssembly();
    htmlStream = assembly.GetManifestResourceStream(HTML_RESOURCE_PATH);
 
    // Perform replacements on the HTML file (if you're using it as a template).
    var reader = new StreamReader(htmlStream);
    var body = reader
        .ReadToEnd()
        .Replace("%TEMPLATE_TOKEN1%", TOKEN1_VALUE)
        .Replace("%TEMPLATE_TOKEN2%", TOKEN2_VALUE); // and so on...
 
    // Create an alternate view and add it to the email.
    var altView = AlternateView.CreateAlternateViewFromString(body, null, MediaTypeNames.Text.Html);
    msg.AlternateViews.Add(altView);
 
    // Get the image from an embedded resource. The <img> tag in the HTML is:
    //     <img src="pid:IMAGE.PNG">
    imageStream = assembly.GetManifestResourceStream(IMAGE_RESOURCE_PATH);
    var linkedImage = new LinkedResource(imageStream, "image/png");
    linkedImage.ContentId = "IMAGE.PNG";
    altView.LinkedResources.Add(linkedImage);
 
    // Get the attachment from an embedded resource.
    fileStream = assembly.GetManifestResourceStream(FILE_RESOURCE_PATH);
    var file = new Attachment(fileStream, MediaTypeNames.Application.Pdf);
    file.Name = "FILE.PDF";
    msg.Attachments.Add(file);
 
    // Send the email
    var client = new SmtpClient(...);
    client.Credentials = new NetworkCredential(...);
    client.Send(msg);
}
finally
{
    if (fileStream != null) fileStream.Dispose();
    if (imageStream != null) imageStream.Dispose();
    if (htmlStream != null) htmlStream.Dispose();
}

5voto

Leather Points 177

Je conseille à l'aide de modèles d'une certaine sorte. Il existe différentes façons de procéder, mais essentiellement de tenir un modèle de l'e-Mail où (sur le disque, dans une base de données, etc) et il suffit d'insérer les données de la clé (c'est à dire: nom des Destinataires etc) dans le modèle.

C'est beaucoup plus flexible, car elle signifie que vous pouvez modifier le modèle sans avoir à modifier le code. Dans mon expérience, vos chances d'obtenir les demandes de modifications aux modèles des utilisateurs finaux. Si vous voulez aller jusqu'au bout vous pourriez inclure un éditeur de modèle.

3voto

Mark Dickinson Points 4276

Émettant frottée html comme ceci est probablement la meilleure façon, tant que le balisage n’est pas trop compliqué. Stringbuilder commence seulement à te rembourser en termes d’efficacité après environ trois concaténations, donc pour des trucs vraiment simple chaîne + string va faire.

Autre que celui, vous pouvez commencer à utiliser les contrôles html (System.Web.UI.HtmlControls) et de les rendre, de cette façon vous pouvez parfois hériter d’eux et faire votre propre clasess pour disposition conditionnelle complexe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X