我设计了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"> </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
);
答案 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);
拥有电子邮件内容之后,可以很容易地使用MailMessage
和SmtpClient
发送电子邮件。