web-dev-qa-db-fra.com

Razor View Page comme modèle de courrier électronique

J'ai conçu un modèle de courrier électronique à partir de Razor Syntax. Lorsque j'envoie ce modèle en tant qu'e-mail en utilisant le code C # et le protocole SMTP, je reçois des balises HTML et Razor nues en tant que corps d'e-mail. Est-ce que je me trompe dans cette approche? Razor Pages est-il autorisé en tant que modèle de courrier électronique? 

Voici ma page

@inherits ViewPage
@{
Layout = "_Layout";
ViewBag.Title = "";
}
<div class="container w-420 p-15 bg-white mt-40">
<div style="border-top:3px solid #22BCE5">&nbsp;</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>

Mettre à jour..

 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);

  }

Plus tard, je remplace le code SMTP par ..

  MailMessage message = new MailMessage(
    ApplicationWideData.fromEmailId, // From field
    ToEmailId, // Recipient field
    "Click On HyperLink To Verify Email Id", // Subject of the email message
    body
   );
11
Lara

Les e-mails ne comprennent que deux formats: texte brut et HTML. Comme Razor n’est ni l’un ni l’autre, il devra être traité par un moteur afin de vous restituer le code HTML généré.

C'est exactement ce qui se produit lorsque vous utilisez Razor dans ASP.NET MVC, en coulisse. Le fichier Razor est compilé dans une classe interne C #, qui est exécutée. Le résultat de l'exécution est le contenu de chaîne du code HTML, qui est envoyé au client.

Votre problème est que vous souhaitez et avez besoin de ce traitement pour s'exécuter, mais uniquement pour récupérer le code HTML sous forme de chaîne, au lieu d'être envoyé au navigateur. Après cela, vous pouvez faire ce que vous voulez avec la chaîne HTML, y compris en l'envoyant par courrier électronique.

Plusieurs paquets incluent ce pouvoir, et j'ai utilisé Westwind.RazorHosting avec succès, mais vous pouvez également utiliser RazorEngine avec des résultats similaires. Je préférerais RazorHosting pour les applications non Web autonomes et RazorEngine pour les applications Web.

Voici une version (assainie) de certains de mes codes - J'utilise Westwind.RazorHosting pour envoyer des courriels au format rasoir à partir d'un service Windows, à l'aide d'une vue fortement typée.

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);
17
SWeko

Avez-vous jeté un oeil à MVC Mailer?

C'est un package gratuit disponible sur GitHub ( https://github.com/smsohan/MvcMailer )

Il existe également un guide étape par étape https://github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide

C'est aussi sur Nuget aussi. https://www.nuget.org/packages/MvcMailer

Essentiellement, il analysera votre vue rasoir en HTML. 

3
Darren

Découvrez un processeur de rasoir comme RazorEngine ( https://razorengine.codeplex.com/ ) disponible sur NuGet. Il traite rasoir pour créer une sortie, que vous utiliseriez ensuite comme corps de votre courrier électronique.

1
Chris Disley

Le projet Mailzory est un choix précieux et pratique pour envoyer des courriels contenant des modèles Razor.

// 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()

ce projet est hébergé chez Github. Il existe également un paquet nuget disponible pour Mailzory.

0
Ehsan Mirsaeedi

Aucune bibliothèque spéciale n'est nécessaire pour convertir une vue Razor en chaîne dans une application ASP.NET MVC.

Voici comment vous le faites dans 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();
            }
        }
    }
}

Ensuite, du contrôleur

ViewToStringRenderer.RenderViewToString(this.ControllerContext, "~/Views/Emails/MyEmailTemplate.cshtml", model);

Après avoir reçu le contenu de l'e-mail, il est facile de l'envoyer à l'aide de MailMessage et SmtpClient.

0
Bassem