剃刀查看页面为电子邮件模板

时间:2015-10-14 11:22:38

标签: c# html .net email razor

我设计了Razor Syntax的电子邮件模板。当我使用C#代码和SMTP协议将此模板作为电子邮件发送时,我将裸露的Razor和HTML标记作为电子邮件正文。这种方法我错了吗? Razor页面是否允许作为电子邮件模板?

这是我的页面

@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>

更新..

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

  }

稍后我将SMTP代码替换为..

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

5 个答案:

答案 0 :(得分:19)

电子邮件只能理解两种格式:纯文本和HTML。由于Razor不是,它需要由某个引擎处理,以便它返回生成的HTML。

这正是在幕后使用ASP.NET MVC中的Razor时会发生的事情。 Razor文件被编译成一个内部C#类,它被执行,执行的结果是HTML的字符串内容,它被发送到客户端。

您的问题是您需要并且需要运行该处理,只是将HTML作为字符串返回,而不是发送到浏览器。之后,您可以使用HTML字符串执行任何操作,包括将其作为电子邮件发送。

有几个包含此功能的软件包,我已成功使用Westwind.RazorHosting,但您也可以使用RazorEngine类似的结果。我更喜欢RazorHosting用于独立的非Web应用程序,而RazorEngine用于Web应用程序

这是我的一些代码的(已消毒的)版本 - 我使用Westwind.RazorHosting使用强类型视图从Windows服务发送剃刀格式的电子邮件。

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

答案 1 :(得分:3)

你看过MVC Mailer吗?

这是GitHub提供的免费软件包(https://github.com/smsohan/MvcMailer

还有一个分步指南https://github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide

它也在Nuget上。 https://www.nuget.org/packages/MvcMailer

基本上它会将你的剃刀视图解析成html。

答案 2 :(得分:1)

检查Nuzet上可用的RazorEngine(https://razorengine.codeplex.com/)之类的剃须刀处理器。它处理剃须刀以创建输出,然后您将其用作电子邮件的正文。

答案 3 :(得分:0)

Mailzory项目是发送具有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("mailzory@outlook.com", "subject");
task.Wait()

这个项目在Github举办。还有一个nuget package可用于Mailzory。

答案 4 :(得分:0)

您不需要任何特殊的库即可将Razor视图呈现为ASP.NET MVC应用程序中的字符串。

这是您在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();
            }
        }
    }
}

然后,从控制器

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

拥有电子邮件内容之后,可以很容易地使用MailMessageSmtpClient发送电子邮件。