Je travaille sur un site qui enverra un nombre important de courriels. Je souhaite configurer le texte d'en-tête et de pied de page, ou peut-être même des modèles pour permettre aux utilisateurs de modifier facilement ces e-mails s'ils en ont besoin.
Si j'intègre le HTML dans des chaînes littérales C #, c'est moche et ils devraient s'inquiéter de s'échapper. Inclure des fichiers plats pour l'en-tête et le pied de page peut fonctionner, mais quelque chose à ce sujet ne semble pas juste.
Quel serait l'idéal d'utiliser une .ASPX
page comme modèle d'une manière ou d'une autre, puis dites simplement à mon code de servir cette page et utilisez le code HTML renvoyé pour l'e-mail.
Existe-t-il un moyen simple et agréable de le faire? Existe-t-il une meilleure façon de résoudre ce problème?
Mise à jour:
j'ai ajouté une réponse qui vous permet d'utiliser une page .aspx standard comme modèle d'e-mail. Remplacez simplement toutes les variables comme vous le feriez normalement, utilisez la liaison de données, etc. Ensuite, capturez simplement la sortie de la page, et le tour est joué! Vous avez votre e-mail HTML!
MISE À JOUR AVEC CAVEAT !!!:
J'utilisais très bien la classe MailDefinition sur certaines pages aspx, mais en essayant d'utiliser cette classe pendant un processus serveur en cours d'exécution, cela a échoué. Je crois que c'était parce que la méthode MailDefinition.CreateMailMessage () nécessite un contrôle valide pour référencer, même si elle ne fait pas toujours quelque chose. Pour cette raison, je recommanderais mon approche en utilisant une page aspx, ou l'approche de Mun utilisant une page ascx, ce qui semble un peu mieux.
new System.Web.UI.Control()
comme:mailDefinition.CreateMailMessage("[email protected]", iDictionaryReplacements, new System.Web.UI.Control())
.Réponses:
Il y a déjà une tonne de réponses ici, mais je suis tombé sur un excellent article sur la façon d'utiliser Razor avec la création de modèles d'e-mails. Razor a été poussé avec ASP.NET MVC 3, mais MVC n'est pas obligé d'utiliser Razor. C'est un traitement assez fluide de la création de modèles d'e-mails
Comme l'indique l'article, "La meilleure chose de Razor est que, contrairement à son prédécesseur (formulaires Web), il n'est pas lié à l'environnement Web, nous pouvons facilement l'héberger en dehors du Web et l'utiliser comme moteur de modèle à diverses fins."
Générer des e-mails HTML avec RazorEngine - Partie 01 - Introduction
Exploiter les modèles Razor en dehors d'ASP.NET: ils ne sont plus réservés au HTML!
Modèles de courrier électronique plus intelligents dans ASP.NET avec RazorEngine
QA Stackoverflow similaire
Création de modèles à l'aide de la nouvelle API RazorEngine
Utilisation de Razor sans MVC
Est-il possible d'utiliser Razor View Engine en dehors de asp.net
la source
Vous pouvez également essayer de charger un contrôle, puis de le rendre dans une chaîne et de le définir comme corps HTML:
Vous pouvez ensuite construire votre email comme d'habitude:
Votre contrôle utilisateur peut contenir d'autres contrôles, tels qu'un en-tête et un pied de page, et également tirer parti de fonctionnalités telles que la liaison de données.
la source
Vous pouvez essayer la classe MailDefinition
la source
Si vous souhaitez passer des paramètres tels que les noms d'utilisateurs, les noms de produits, etc., vous pouvez utiliser le moteur de modèle open source NVelocity pour produire vos e-mails / HTML finaux.
Un exemple de modèle NVelocity ( MailTemplate.vm ):
Génération du corps du courrier par MailTemplate.vm dans votre application:
Le corps du message de résultat est:
Pour éditer les modèles, vous pouvez peut-être utiliser FCKEditor et enregistrer vos modèles dans des fichiers.
la source
Le composant de messagerie Mail.dll comprend un moteur de modèle de courrier électronique:
Voici l'aperçu de la syntaxe:
Et le code qui charge le modèle, remplit les données de l'objet c # et envoie un e-mail:
Vous pouvez obtenir plus d'informations sur l' article de blog du moteur de modèle d'e-mail .
Ou téléchargez simplement le composant de messagerie Mail.dll et essayez-le.
Veuillez noter qu'il s'agit d'un produit commercial que j'ai créé.
la source
Si la flexibilité est l'une de vos conditions préalables, XSLT peut être un bon choix, qui est entièrement pris en charge par .NET Framework et vous pourrez même laisser l'utilisateur modifier ces fichiers. Cet article ( http://www.aspfree.com/c/a/XML/XSL-Transformations-using-ASP-NET/ ) pourrait être utile pour commencer (msdn a plus d'informations à ce sujet). Comme l'a dit ScarletGarden NVelocity est un autre bon choix, mais je préfère XSLT pour son support de framework .NET "intégré" et sa plate-forme indépendante.
la source
IXmlSerializable
interface à mes classes. En quelques lignes, je peux demander à ma classe de se rendre par e-mail.Je pense que vous pouvez également faire quelque chose comme ceci:
Créez une page .aspx et placez-la à la fin de la méthode OnLoad ou appelez-la manuellement.
Je ne sais pas s'il y a des problèmes potentiels avec cela, mais il semble que cela fonctionnerait. De cette façon, vous pouvez utiliser une page .aspx complète, au lieu de la classe MailDefinition qui prend uniquement en charge les remplacements de texte.
la source
Page
, du moins lors de l'utilisation d'une méthode d'extension générique pour le rendu. Ainsi je suis passé àUserControl
; voir ma réponse ci-dessous. Jusqu'à présent, cela semble bien fonctionner ... Je serais intéressé de savoir comment vous vous êtes débrouillé à l'époque.Bien sûr, vous pouvez créer un modèle html et je recommanderais également un modèle de texte. Dans le modèle, vous pouvez simplement mettre [BODY] à l'endroit où le corps serait placé, puis vous pouvez simplement lire le modèle et remplacer le corps par le nouveau contenu. Vous pouvez envoyer l'e-mail à l'aide de .Nets Mail Class. Il vous suffit de boucler l'envoi de l'e-mail à tous les destinataires après avoir créé l'e-mail initialement. A fonctionné à merveille pour moi.
la source
Voici une autre alternative qui utilise des transformations XSL pour des modèles d'e-mails plus complexes: Envoi d'e-mails HTML à partir d'applications .NET .
la source
Soyez prudent en faisant cela, les filtres SPAM semblent bloquer le HTML généré par ASP.net, apparemment à cause de ViewState, donc si vous allez faire cela, assurez-vous que le HTML produit est propre.
Personnellement, j'envisagerais d'utiliser Asp.net MVC pour obtenir les résultats souhaités. ou NVelocity est assez bon dans ce domaine
la source
Vous pouvez facilement créer une WebRequest pour accéder à une page ASPX et obtenir le HTML résultant. Avec un peu plus de travail, vous pouvez probablement le faire sans le WebRequest. Un PageParser et un Response.Filter vous permettraient d'exécuter la page et de capturer la sortie ... bien qu'il puisse y avoir des moyens plus élégants.
la source
J'avais une exigence similaire sur l'un des projets où vous deviez envoyer un grand nombre d'e-mails chaque jour, et le client voulait un contrôle complet sur les modèles html pour différents types d'e-mails.
en raison du grand nombre d'e-mails à envoyer, la performance était une préoccupation majeure.
ce que nous avons proposé, c'est du contenu statique sur le serveur SQL où vous enregistrez le balisage complet du modèle html (avec des espaces réservés, comme [UserFirstName], [UserLastName] qui sont remplacés par des données réelles au moment de l'exécution) pour différents types d'e-mails
puis nous avons chargé ces données dans le cache asp.net - nous ne lisons donc pas les modèles html encore et encore - mais seulement lorsqu'ils sont réellement modifiés
nous avons donné au client un éditeur WYSIWYG pour modifier ces modèles via un formulaire Web d'administration. chaque fois que des mises à jour sont effectuées, nous réinitialisons le cache asp.net.
puis nous avons eu une table séparée pour les journaux de courrier électronique - où chaque courrier électronique à envoyer était enregistré. cette table contenait des champs appelés emailType, emailSent et numberOfTries.
nous avons simplement exécuté un travail toutes les 5 minutes pour les types d'e-mails importants (comme l'inscription d'un nouveau membre, le mot de passe oublié) qui doivent être envoyés dès que possible
nous avons exécuté un autre travail toutes les 15 minutes pour les types d'e-mails moins importants (comme l'e-mail de promotion, l'e-mail d'actualités, etc.)
de cette façon, vous ne bloquez pas votre serveur d'envoyer des e-mails non-stop et vous traitez les e-mails par lots. une fois qu'un e-mail est envoyé, vous définissez le champ emailSent sur 1.
la source
Notez que les solutions aspx et ascx nécessitent un HttpContext actuel, donc ne peuvent pas être utilisées de manière asynchrone (par exemple dans les threads) sans beaucoup de travail.
la source
Je pense que la réponse facile est MvcMailer. C'est le package NuGet qui vous permet d'utiliser votre moteur d'affichage préféré pour générer des e-mails. Voir le package NuGet ici et la documentation du projet
J'espère que ça aide!
la source
DotLiquid est une autre option. Vous spécifiez les valeurs d'un modèle de classe en tant que
{{ user.name }}
, puis au moment de l'exécution, vous fournissez les données de cette classe et le modèle avec le balisage, et il fusionnera les valeurs pour vous. Il est similaire à l'utilisation du moteur de création de modèles Razor à bien des égards. Il prend en charge des choses plus complexes comme les boucles et diverses fonctions comme ToUpper. La bonne chose est que ceux-ci sont "sûrs" afin que l'utilisateur qui crée les modèles ne puisse pas planter votre système ou écrire du code dangereux comme vous le feriez dans razor: http://dotliquidmarkup.org/try-onlinela source
Si vous êtes en mesure de permettre à la ASPNET et l' autorisation des utilisateurs associés à lire et écrire un fichier, vous pouvez facilement utiliser un fichier HTML à la norme des
String.Format()
espaces réservés ({0}
,{1:C}
, etc.) pour y parvenir.Simplement lu dans le fichier, sous forme de chaîne, en utilisant les classes de l'
System.IO
espace de noms. Une fois que vous avez cette chaîne, passez-la comme premier argument àString.Format()
et fournissez les paramètres.Gardez cette chaîne autour et utilisez-la comme corps de l'e-mail, et vous avez essentiellement terminé. Nous faisons cela sur des dizaines de sites (certes petits) aujourd'hui, et n'avons eu aucun problème.
Je dois noter que cela fonctionne mieux si (a) vous n'envoyez pas des millions d'e-mails à la fois, (b) vous ne personnalisez pas chaque e-mail (sinon vous mangez une tonne de chaînes) et (c ) le fichier HTML lui-même est relativement petit.
la source
Définissez l'ensemble du message électronique IsBodyHtml = true
Prenez votre objet qui contient le contenu de votre e-mail Sérialisez l'objet et utilisez xml / xslt pour générer le contenu html.
Si vous voulez faire AlternateViews, faites la même chose que jmein n'utilise qu'un modèle xslt différent pour créer le contenu en texte brut.
l'un des principaux avantages à cela est que si vous souhaitez modifier votre mise en page, il vous suffit de mettre à jour le modèle xslt.
la source
Regardez SubSonic (www.subsonicproject.com). Ils font exactement cela pour générer du code - le modèle est ASPX standard, et il génère c #. La même méthode serait réutilisable pour votre scénario.
la source
J'utiliserais une bibliothèque de modèles comme TemplateMachine . cela vous permet principalement de mettre votre modèle de courrier électronique avec du texte normal, puis d'utiliser des règles pour injecter / remplacer des valeurs si nécessaire. Très similaire à ERB en Ruby. Cela vous permet de séparer la génération du contenu du courrier sans vous attacher trop à quelque chose comme ASPX, etc., puis une fois que le contenu est généré avec cela, vous pouvez envoyer un courrier électronique.
la source
J'aime la réponse de Raj. Des programmes comme ListManager et des frameworks comme DNN font des choses similaires, et si une édition facile par des utilisateurs non techniques est nécessaire, les éditeurs WYSIWYG pour modifier le HTML stocké dans SQL est un moyen simple et direct de procéder et peut facilement accueillir l'édition des en-têtes indépendamment des pieds de page, etc, ainsi que l'utilisation de jetons pour insérer dynamiquement des valeurs.
Une chose à garder à l'esprit si vous utilisez la méthode ci-dessus (ou n'importe laquelle, vraiment) est d'être strict et prudent sur les types de styles et de balises que vous autorisez les éditeurs à insérer. Si vous pensez que les navigateurs sont capricieux, attendez de voir à quel point les clients de messagerie rendent la même chose différemment ...
la source
Similaire à la réponse de Canavar, mais au lieu de NVelocity, j'utilise toujours " StringTemplate " que je charge le modèle à partir d'un fichier de configuration, ou charge un fichier externe en utilisant File.ReadAllText () et définit les valeurs.
C'est un projet Java mais le port C # est solide et je l'ai utilisé dans plusieurs projets (je l'ai juste utilisé pour la création de modèles de courrier électronique en utilisant le modèle dans un fichier externe).
Les alternatives sont toujours bonnes.
la source
Voici un moyen simple d'utiliser la classe WebClient :
Alors appelez-le comme ceci:
Bien sûr, votre CSS devra être intégré afin d'afficher les styles de la page Web dans la plupart des clients de messagerie (comme Outlook). Si votre e-mail affiche un contenu dynamique (ex. Nom du client), je vous recommande d'utiliser QueryStrings sur votre site Web pour remplir les données. (ex. http://www.yourwebsite.com?CustomerName=Bob )
la source
@bardev fournit une bonne solution, mais malheureusement ce n'est pas idéal dans tous les cas. Le mien était l'un d'entre eux.
J'utilise WebForms dans un site Web (je jure que je n'utiliserai plus jamais un site Web - quel PITA) dans VS 2013.
J'ai essayé la suggestion de Razor, mais le mien étant un site Web, je n'ai pas obtenu le très important IntelliSense fourni par l'EDI dans un projet MVC. J'aime aussi utiliser le concepteur pour mes modèles - un endroit parfait pour un UserControl.
Nix sur Razor à nouveau.
Je suis donc venu avec ce petit framework à la place (chapeau à @mun pour UserControl et @imatoria pour Strong Typing). Le seul problème potentiel que je puisse voir est que vous devez faire attention à garder votre nom de fichier .ASCX synchronisé avec son nom de classe. Si vous vous égarez, vous obtiendrez une erreur d'exécution.
FWIW: Dans mes tests, au moins l'appel RenderControl () n'aime pas un contrôle Page, donc je suis allé avec UserControl.
Je suis presque sûr d'avoir tout inclus ici; faites-moi savoir si j'ai oublié quelque chose.
HTH
Usage:
Classe de base:
Classe "Usine":
Classe de modèle:
En-tête ASCX:
Pied de page ASCX:
Modèle ASCX:
Fichier de code de modèle ASCX:
Aides:
la source
Il suffit de jeter la bibliothèque que j'utilise dans le mix: https://github.com/lukencode/FluentEmail
Il rend les e-mails à l'aide de RazorLight , utilise le style fluide pour créer des e-mails et prend en charge plusieurs expéditeurs prêts à l' emploi . Il est également livré avec des méthodes d'extension pour ASP.NET DI. Simple à utiliser, peu de configuration, avec support texte et HTML.
la source