Ich arbeite an einer Site, die eine beträchtliche Anzahl von E-Mails versendet. Ich möchte sowohl Kopf- als auch Fußzeilentext oder sogar Vorlagen einrichten, damit die Benutzer diese E-Mails bei Bedarf einfach bearbeiten können.
Wenn ich den HTML-Code in C # -String-Literale einbetten würde, wäre dies hässlich und sie müssten sich Sorgen machen, dass sie entkommen. Das Einfügen von Flatfiles für Kopf- und Fußzeile funktioniert möglicherweise, aber etwas daran fühlt sich einfach nicht richtig an.
Was wäre ideal, wenn Sie eine .ASPX
Seite irgendwie als Vorlage verwenden würden, dann sagen Sie einfach meinem Code, dass er diese Seite bereitstellen soll, und verwenden Sie den für die E-Mail zurückgegebenen HTML-Code.
Gibt es eine schöne und einfache Möglichkeit, dies zu tun? Gibt es einen besseren Weg, um dieses Problem zu lösen?
Aktualisiert:
Ich habe eine Antwort hinzugefügt, mit der Sie eine ASPX-Standardseite als E-Mail-Vorlage verwenden können. Ersetzen Sie einfach alle Variablen wie gewohnt, verwenden Sie die Datenbindung usw. Erfassen Sie dann einfach die Ausgabe der Seite und voila! Sie haben Ihre HTML-E-Mail!
AKTUALISIERT MIT CAVEAT !!!:
Ich habe die MailDefinition-Klasse auf einigen Aspx-Seiten verwendet, aber beim Versuch, diese Klasse während eines laufenden Serverprozesses zu verwenden, ist sie fehlgeschlagen. Ich glaube, das lag daran, dass für die MailDefinition.CreateMailMessage () -Methode ein gültiges Steuerelement zum Verweisen erforderlich ist, obwohl dies nicht immer der Fall ist. Aus diesem Grund würde ich meinen Ansatz mit einer Aspx-Seite oder Muns Ansatz mit einer Ascx-Seite empfehlen, was etwas besser zu sein scheint.
new System.Web.UI.Control()
:mailDefinition.CreateMailMessage("[email protected]", iDictionaryReplacements, new System.Web.UI.Control())
.Antworten:
Hier gibt es bereits eine Menge Antworten, aber ich bin auf einen großartigen Artikel gestoßen, in dem es darum geht, wie man Razor mit E-Mail-Vorlagen verwendet. Razor wurde mit ASP.NET MVC 3 gepusht, MVC ist jedoch nicht erforderlich, um Razor zu verwenden. Dies ist eine ziemlich raffinierte Verarbeitung von E-Mail-Vorlagen
In dem Artikel heißt es: "Das Beste an Razor ist, dass es im Gegensatz zu seinem Vorgänger (Webformulare) nicht an die Webumgebung gebunden ist. Wir können es problemlos außerhalb des Webs hosten und als Vorlagen-Engine für verschiedene Zwecke verwenden."
Generieren von HTML-E-Mails mit RazorEngine - Teil 01 - Einführung
Nutzung von Rasiermesser-Vorlagen außerhalb von ASP.NET: Sie sind nicht mehr nur für HTML gedacht!
Intelligentere E-Mail-Vorlagen in ASP.NET mit RazorEngine
Ähnliche Stackoverflow-Qualitätssicherung
Vorlagen mit der neuen RazorEngine-API
Verwenden von Razor ohne MVC
Ist es möglich, Razor View Engine außerhalb von asp.net zu verwenden?
quelle
Möglicherweise möchten Sie auch versuchen, ein Steuerelement zu laden, es dann in eine Zeichenfolge zu rendern und dieses als HTML-Text festzulegen:
Sie können dann Ihre E-Mail wie gewohnt erstellen:
Ihr Benutzersteuerelement kann andere Steuerelemente enthalten, z. B. eine Kopf- und Fußzeile, und auch Funktionen wie die Datenbindung nutzen.
quelle
Sie können die MailDefinition-Klasse ausprobieren
quelle
Wenn Sie Parameter wie Benutzernamen, Produktnamen usw. übergeben möchten, können Sie die Open Source Template Engine NVelocity verwenden , um Ihre endgültigen E-Mails / HTML- Dateien zu erstellen.
Ein Beispiel für eine NVelocity-Vorlage ( MailTemplate.vm ):
Generieren von Mail Body durch MailTemplate.vm in Ihrer Anwendung:
Der Ergebnis-Mail-Text lautet:
Zum Bearbeiten der Vorlagen können Sie möglicherweise FCKEditor verwenden und Ihre Vorlagen in Dateien speichern.
quelle
Die Mail.dll-E-Mail-Komponente enthält eine E-Mail-Vorlagen-Engine:
Hier ist die Syntaxübersicht:
Und der Code, der die Vorlage lädt, Daten aus dem c # -Objekt füllt und eine E-Mail sendet:
Weitere Informationen finden Sie im Blogbeitrag der E-Mail-Vorlagen-Engine .
Oder laden Sie einfach die E-Mail-Komponente Mail.dll herunter und probieren Sie es aus.
Bitte beachten Sie, dass dies ein kommerzielles Produkt ist, das ich erstellt habe.
quelle
Wenn Flexibilität eine Ihrer Voraussetzungen ist, ist XSLT möglicherweise eine gute Wahl, die vollständig von .NET Framework unterstützt wird, und Sie können den Benutzer sogar diese Dateien bearbeiten lassen. Dieser Artikel ( http://www.aspfree.com/c/a/XML/XSL-Transformations-using-ASP-NET/ ) kann für den Anfang hilfreich sein (msdn enthält weitere Informationen dazu). Wie von ScarletGarden gesagt, ist NVelocity eine weitere gute Wahl, aber ich bevorzuge XSLT wegen seiner "integrierten" .NET Framework-Unterstützung und Plattformunabhängigkeit.
quelle
IXmlSerializable
Schnittstelle zu meinen Klassen großartig funktionierte . In nur wenigen Zeilen kann ich meine Klasse in eine E-Mail verwandeln.Ich denke, Sie könnten auch so etwas tun:
Erstellen Sie eine ASPX-Seite und fügen Sie diese am Ende der OnLoad-Methode ein oder rufen Sie sie manuell auf.
Ich bin mir nicht sicher, ob es potenzielle Probleme damit gibt, aber es sieht so aus, als würde es funktionieren. Auf diese Weise können Sie anstelle der MailDefinition-Klasse, die nur Textersetzungen unterstützt, eine ASPX-Seite mit vollem Funktionsumfang verwenden.
quelle
Page
, zumindest wenn eine generische Erweiterungsmethode für das Rendern verwendet wurde. Also wechselte ich zuUserControl
; siehe meine Antwort unten. Bisher scheint es gut zu funktionieren ... Es würde mich interessieren, wie Sie es damals ausgearbeitet haben.Sicher können Sie eine HTML-Vorlage erstellen und ich würde auch eine Textvorlage empfehlen. In der Vorlage können Sie einfach [KÖRPER] an der Stelle platzieren, an der der Körper platziert werden soll. Anschließend können Sie einfach die Vorlage einlesen und den Körper durch den neuen Inhalt ersetzen. Sie können die E-Mail mit .Nets Mail Class senden. Sie müssen nur das Senden der E-Mail an alle Empfänger durchlaufen, nachdem Sie die E-Mail erstellt haben. Arbeitete wie ein Zauber für mich.
quelle
Hier ist eine weitere Alternative, die XSL-Transformationen für komplexere E-Mail-Vorlagen verwendet: Senden von HTML-basierten E-Mails aus .NET-Anwendungen .
quelle
Seien Sie vorsichtig, wenn Sie dies tun. SPAM-Filter scheinen das von ASP.net generierte HTML zu blockieren, anscheinend aufgrund von ViewState. Wenn Sie dies tun, stellen Sie sicher, dass das erzeugte HTML sauber ist.
Ich persönlich würde die Verwendung von Asp.net MVC prüfen, um die gewünschten Ergebnisse zu erzielen. oder NVelocity ist ziemlich gut darin
quelle
Sie können einfach eine WebRequest erstellen, um eine ASPX-Seite aufzurufen und den resultierenden HTML-Code abzurufen. Mit etwas mehr Arbeit können Sie es wahrscheinlich ohne WebRequest erledigen. Mit einem PageParser und einem Response.Filter können Sie die Seite ausführen und die Ausgabe erfassen ... obwohl es möglicherweise elegantere Möglichkeiten gibt.
quelle
Ich hatte eine ähnliche Anforderung bei einem der Projekte, bei denen Sie jeden Tag eine große Anzahl von E-Mails senden mussten, und der Kunde wollte die vollständige Kontrolle über HTML-Vorlagen für verschiedene Arten von E-Mails.
Aufgrund der großen Anzahl der zu sendenden E-Mails war die Leistung ein Hauptanliegen.
Was wir uns ausgedacht haben, war statischer Inhalt auf einem SQL Server, auf dem Sie das gesamte HTML-Vorlagen-Markup (zusammen mit Platzhaltern wie [UserFirstName], [UserLastName], die zur Laufzeit durch echte Daten ersetzt werden) für verschiedene Arten von E-Mails speichern
Dann haben wir diese Daten in den asp.net-Cache geladen - damit wir die HTML-Vorlagen nicht immer wieder lesen - sondern nur, wenn sie tatsächlich geändert werden
Wir haben dem Client einen WYSIWYG-Editor zur Verfügung gestellt, um diese Vorlagen über ein Admin-Webformular zu ändern. Wann immer Aktualisierungen vorgenommen wurden, setzen wir den asp.net-Cache zurück.
und dann hatten wir eine separate Tabelle für E-Mail-Protokolle - in der jede zu sendende E-Mail protokolliert wurde. Diese Tabelle enthielt Felder mit den Namen emailType, emailSent und numberOfTries.
Wir haben einfach alle 5 Minuten einen Job für wichtige E-Mail-Typen (wie Anmeldung eines neuen Mitglieds, vergessenes Passwort) ausgeführt, die so schnell wie möglich gesendet werden müssen
Wir haben alle 15 Minuten einen weiteren Job für weniger wichtige E-Mail-Typen ausgeführt (wie Werbe-E-Mail, Nachrichten-E-Mail usw.).
Auf diese Weise blockieren Sie nicht Ihren Server, der ununterbrochen E-Mails sendet, und Sie verarbeiten E-Mails im Stapel. Sobald eine E-Mail gesendet wurde, setzen Sie das Feld emailSent auf 1.
quelle
Beachten Sie, dass die Lösungen aspx und ascx einen aktuellen HttpContext erfordern und daher nicht ohne viel Arbeit asynchron (z. B. in Threads) verwendet werden können.
quelle
Ich denke, die einfache Antwort ist MvcMailer. Mit diesem NuGet-Paket können Sie Ihre bevorzugte Ansichts-Engine zum Generieren von E-Mails verwenden. Sehen Sie das NuGet-Paket hier und das Projektdokumentation
Ich hoffe es hilft!
quelle
DotLiquid ist eine weitere Option. Sie geben Werte aus einem Klassenmodell an,
{{ user.name }}
und zur Laufzeit stellen Sie die Daten in dieser Klasse und die Vorlage mit dem Markup bereit. Die Werte werden dann für Sie zusammengeführt. Es ähnelt in vielerlei Hinsicht der Verwendung der Razor-Template-Engine. Es unterstützt komplexere Dinge wie Schleifen und verschiedene Funktionen wie ToUpper. Das Schöne ist, dass diese "sicher" sind, damit Benutzer, die die Vorlagen erstellen, Ihr System nicht zum Absturz bringen oder unsicheren Code schreiben können, wie Sie es in Rasiermesser tun würden: http://dotliquidmarkup.org/try-onlinequelle
Wenn Sie dem ASPNET und den zugeordneten Benutzern die Berechtigung zum Lesen und Schreiben einer Datei gewähren können, können Sie problemlos eine HTML-Datei mit Standardplatzhaltern verwenden
String.Format()
({0}
,{1:C}
usw.) , dies zu erreichen.Lesen Sie die Datei lediglich als Zeichenfolge mit Klassen aus dem
System.IO
Namespace ein. Wenn Sie diese Zeichenfolge haben, übergeben Sie sie als erstes Argument anString.Format()
und geben Sie die Parameter an.Behalten Sie diese Zeichenfolge bei und verwenden Sie sie als Textkörper der E-Mail, und Sie sind im Wesentlichen fertig. Wir tun dies heute auf Dutzenden von (zugegebenermaßen kleinen) Websites und hatten keine Probleme.
Ich sollte beachten, dass dies am besten funktioniert, wenn (a) Sie nicht Millionen von E-Mails gleichzeitig senden, (b) Sie nicht jede E-Mail personalisieren (andernfalls verbrauchen Sie eine Menge Zeichenfolgen) und (c ) Die HTML-Datei selbst ist relativ klein.
quelle
Setzen Sie die E-Mail-Nachricht IsBodyHtml = true
Nehmen Sie Ihr Objekt, das Ihren E-Mail-Inhalt enthält. Serialisieren Sie das Objekt und verwenden Sie xml / xslt, um den HTML-Inhalt zu generieren.
Wenn Sie AlternateViews ausführen möchten, verwenden Sie dasselbe, dass jmein nur eine andere xslt-Vorlage verwendet, um den Nur-Text-Inhalt zu erstellen.
Einer der Hauptvorteile ist, wenn Sie Ihr Layout ändern möchten, müssen Sie nur die xslt-Vorlage aktualisieren.
quelle
Schauen Sie sich SubSonic an (www.subsonicproject.com). Sie tun genau dies, um Code zu generieren - die Vorlage ist Standard-ASPX und gibt c # aus. Die gleiche Methode kann für Ihr Szenario wiederverwendet werden.
quelle
Ich würde eine Vorlagenbibliothek wie TemplateMachine verwenden . Auf diese Weise können Sie Ihre E-Mail-Vorlage meistens mit normalem Text zusammenstellen und dann Regeln verwenden, um Werte nach Bedarf einzufügen / zu ersetzen. Sehr ähnlich zu ERB in Ruby. Auf diese Weise können Sie die Generierung des E-Mail-Inhalts trennen, ohne zu stark an ASPX usw. gebunden zu sein. Sobald der Inhalt damit generiert wurde, können Sie E-Mails versenden.
quelle
Ich mag Rajs Antwort. Programme wie ListManager und Frameworks wie DNN erledigen ähnliche Aufgaben. Wenn eine einfache Bearbeitung durch nicht technische Benutzer erforderlich ist, sind WYSIWYG-Editoren zum Ändern von in SQL gespeichertem HTML-Code eine meist einfache und unkomplizierte Methode, mit der Sie Kopfzeilen unabhängig von Fußzeilen bearbeiten können. usw. sowie die Verwendung von Token zum dynamischen Einfügen von Werten.
Eine Sache, die Sie bei der Verwendung der oben genannten Methode (oder einer anderen) beachten sollten, ist, streng und vorsichtig zu sein, welche Arten von Stilen und Tags die Editoren einfügen dürfen. Wenn Sie der Meinung sind, dass Browser pingelig sind, warten Sie einfach, bis Sie sehen, wie unterschiedlich E-Mail-Clients dasselbe rendern ...
quelle
Ähnlich wie bei Canavars Antwort, aber anstelle von NVelocity verwende ich immer " StringTemplate ", mit dem ich die Vorlage aus einer Konfigurationsdatei lade, oder lade eine externe Datei mit File.ReadAllText () und setze die Werte.
Es ist ein Java-Projekt, aber der C # -Port ist solide und ich habe ihn in mehreren Projekten verwendet (nur zum Erstellen von E-Mail-Vorlagen mithilfe der Vorlage in einer externen Datei verwendet).
Alternativen sind immer gut.
quelle
Hier ist eine einfache Möglichkeit, die WebClient- Klasse zu verwenden:
Dann nenne es einfach so:
Natürlich muss Ihr CSS eingebunden sein, damit die Stile der Webseite in den meisten E-Mail-Clients (z. B. Outlook) angezeigt werden. Wenn in Ihrer E-Mail dynamischer Inhalt angezeigt wird (z. B. Kundenname), würde ich empfehlen, QueryStrings auf Ihrer Website zum Auffüllen der Daten zu verwenden. (z. B. http://www.yourwebsite.com?CustomerName=Bob )
quelle
@bardev bietet eine gute Lösung, ist aber leider nicht in allen Fällen ideal. Meins war einer von ihnen.
Ich verwende WebForms in einer Website (ich schwöre, ich werde nie wieder eine Website verwenden - was für eine PITA) in VS 2013.
Ich habe den Razor-Vorschlag ausprobiert, aber da ich eine Website bin, habe ich nicht den wichtigen IntelliSense erhalten, den die IDE in einem MVC-Projekt liefert. Ich verwende den Designer auch gerne für meine Vorlagen - ein perfekter Ort für ein UserControl.
Wieder Nix auf Razor.
Also habe ich mir stattdessen dieses kleine Framework ausgedacht (Tipps für @mun für UserControl und @imatoria für Strong Typing). Der einzige potenzielle Problempunkt, den ich sehen kann, ist, dass Sie vorsichtig sein müssen, um Ihren .ASCX-Dateinamen mit dem Klassennamen synchron zu halten. Wenn Sie verirrt sind, wird ein Laufzeitfehler angezeigt.
FWIW: In meinen Tests mag zumindest der Aufruf von RenderControl () kein Seitensteuerelement, deshalb habe ich mich für UserControl entschieden.
Ich bin mir ziemlich sicher, dass ich hier alles aufgenommen habe. Lass es mich wissen, wenn ich etwas ausgelassen habe.
HTH
Verwendung:
Basisklasse:
"Fabrik" -Klasse:
Vorlagenklasse:
ASCX-Header:
ASCX-Fußzeile:
ASCX-Vorlage:
ASCX Template CodeFile:
Helfer:
quelle
Wirf einfach die Bibliothek, die ich benutze, in die Mischung: https://github.com/lukencode/FluentEmail
Es rendert E-Mails mit RazorLight , verwendet den fließenden Stil zum Erstellen von E-Mails und unterstützt sofort mehrere Absender. Es enthält auch Erweiterungsmethoden für ASP.NET DI. Einfach zu bedienen, wenig eingerichtet, mit Klartext- und HTML-Unterstützung.
quelle