Ich habe eine E-Mail-Vorlage von Razor Syntax entworfen. Wenn ich diese Vorlage als E-Mail mit C # -Code und SMTP-Protokoll versende, erhalte ich blanko Razor- und HTML-Markups als E-Mail-Text. Bin ich falsch in dieser Herangehensweise? Sind Rasiermesser-Seiten als E-Mail-Vorlage zulässig?
Hier ist meine Seite
@inherits ViewPage
@{
Layout = "_Layout";
ViewBag.Title = "";
}
<div class="container w-420 p-15 bg-white mt-40">
<div style="border-top:3px solid #22BCE5"> </div>
<span style="font-family:Arial;font-size:10pt">
Hello <b>{UserName}</b>,<br /><br />
Thanks for Registering to XYZ Portal<br /><br />
<a style="color:#22BCE5" href="{Url}">Click to Confirm Email</a><br />
<br /><br />
Thanks<br />
Admin (XYZ)
</span>
Aktualisieren..
using (StreamReader reader = new StreamReader(HttpContext.Current.Server.MapPath("~/ContentPages/EmailConfTemplate.cshtml")))
{
body = reader.ReadToEnd();
//Replace UserName and Other variables available in body Stream
body = body.Replace("{UserName}", FirstName);
}
Später ersetze ich den SMTP-Code als ..
MailMessage message = new MailMessage(
ApplicationWideData.fromEmailId, // From field
ToEmailId, // Recipient field
"Click On HyperLink To Verify Email Id", // Subject of the email message
body
);
E-Mail-Nachrichten verstehen nur zwei Formate: Nur-Text und HTML. Da Razor keiner von beiden ist, muss es von einer Engine verarbeitet werden, damit Sie den generierten HTML-Code zurückgeben können.
Genau das passiert, wenn Sie Razor in ASP.NET MVC im Hintergrund verwenden. Die Razor-Datei wird in eine interne C # -Klasse kompiliert, die ausgeführt wird. Das Ergebnis der Ausführung ist der String-Inhalt des HTML-Codes, der an den Client gesendet wird.
Ihr Problem ist, dass Sie möchten, dass diese Verarbeitung ausgeführt wird, nur um den HTML-Code als Zeichenfolge zurückzugeben, anstatt an den Browser gesendet zu werden. Danach können Sie mit dem HTML-String alles tun, was Sie möchten, einschließlich des Versands als E-Mail.
Es gibt mehrere Pakete, die diese Leistung enthalten, und ich habe Westwind.RazorHosting erfolgreich verwendet, aber Sie können auch RazorEngine mit ähnlichen Ergebnissen verwenden. Ich würde RazorHosting für eigenständige Nicht-Webanwendungen und RazorEngine für Webanwendungen bevorzugen
Hier ist eine (bereinigte) Version meines Codes. Ich verwende Westwind.RazorHosting, um rasiermessergerechte E-Mails von einem Windows-Dienst mit einer stark typisierten Ansicht zu senden.
RazorFolderHostContainer Host = = new RazorFolderHostContainer();
Host.ReferencedAssemblies.Add("NotificationsManagement.dll");
Host.TemplatePath = templatePath;
Host.Start();
string output = Host.RenderTemplate(template.Filename, model);
MailMessage mm = new MailMessage { Subject = subject, IsBodyHtml = true };
mm.Body = output;
mm.To.Add(email);
var smtpClient = new SmtpClient();
await smtpClient.SendMailAsync(mm);
Haben Sie sich MVC Mailer
angesehen?
Es ist ein kostenloses Paket von GitHub ( https://github.com/smsohan/MvcMailer ).
Es gibt auch eine Schritt-für-Schritt-Anleitung https://github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide
Es ist auch auf Nuget. https://www.nuget.org/packages/MvcMailer
Im Wesentlichen wird es Ihre Rasiereransicht in HTML analysieren.
Schauen Sie sich einen Rasierer-Prozessor wie RazorEngine ( https://razorengine.codeplex.com/ ) an, der auf NuGet verfügbar ist. Es verarbeitet Rasiermesser, um eine Ausgabe zu erstellen, die Sie dann als Hauptteil Ihrer E-Mail verwenden würden.
Das Projekt Mailzory ist eine wertvolle und bequeme Wahl für das Senden von E-Mails mit Razor-Vorlagen.
// template path
var viewPath = Path.Combine("Views/Emails", "hello.cshtml");
// read the content of template and pass it to the Email constructor
var template = File.ReadAllText(viewPath);
var email = new Email(template);
// set ViewBag properties
email.ViewBag.Name = "Johnny";
email.ViewBag.Content = "Mailzory Is Funny";
// send email
var task = email.SendAsync("[email protected]", "subject");
task.Wait()
dieses Projekt wird bei Github gehostet. Es gibt auch ein nuget-Paket für Mailzory.
Sie benötigen keine speziellen Bibliotheken, um eine Razor-Ansicht in einer Zeichenfolge in einer ASP.NET-MVC-Anwendung darzustellen.
So machen Sie es in MVC 5
public static class ViewToStringRenderer
{
public static string RenderViewToString<TModel>(ControllerContext controllerContext, string viewName, TModel model)
{
ViewEngineResult viewEngineResult = ViewEngines.Engines.FindView(controllerContext, viewName, null);
if (viewEngineResult.View == null)
{
throw new Exception("Could not find the View file. Searched locations:\r\n" + viewEngineResult.SearchedLocations);
}
else
{
IView view = viewEngineResult.View;
using (var stringWriter = new StringWriter())
{
var viewContext = new ViewContext(controllerContext, view, new ViewDataDictionary<TModel>(model), new TempDataDictionary(), stringWriter);
view.Render(viewContext, stringWriter);
return stringWriter.ToString();
}
}
}
}
Dann vom Controller
ViewToStringRenderer.RenderViewToString(this.ControllerContext, "~/Views/Emails/MyEmailTemplate.cshtml", model);
Nachdem Sie den E-Mail-Inhalt erhalten haben, können Sie die E-Mail einfach mit MailMessage
und SmtpClient
versenden.