我正在开发一个会发送大量电子邮件的网站.我想设置页眉和页脚文本,甚至是模板,以便用户在需要时轻松编辑这些电子邮件.
如果我将HTML嵌入到C#字符串文字中,那就很难看了,他们不得不担心转义.包括页眉和页脚的平面文件可能会起作用,但关于它的一些东西感觉不对.
什么是理想的.ASPX
是以某种方式使用页面作为模板,然后告诉我的代码服务该页面,并使用为电子邮件返回的HTML.
有这么好的方法吗?有没有更好的方法来解决这个问题?
更新:
我添加了一个答案,使您可以使用标准的.aspx页面作为电子邮件模板.只需像通常那样替换所有变量,使用数据绑定等.然后只需捕获页面的输出,瞧!你有HTML电子邮件!
更新
了CAVEAT !!!:我在一些aspx页面上使用MailDefinition类就好了,但是当在运行的服务器进程中尝试使用这个类时,它失败了.我相信这是因为MailDefinition.CreateMailMessage()方法需要一个有效的控件来引用,即使它并不总是做某事.因此,我建议使用aspx页面的方法,或使用ascx页面的Mun方法,这看起来好一点.
这里已经有很多答案,但我偶然发现了一篇关于如何将Razor与电子邮件模板结合使用的精彩文章.使用ASP.NET MVC 3推动了Razor,但MVC不需要使用Razor.这是处理电子邮件模板的非常流畅的处理
正如文章所指出的那样,"Razor的最佳之处在于它与其前身(webforms)不同,它与网络环境无关,我们可以轻松地将其托管在网络之外,并将其用作各种用途的模板引擎."
使用RazorEngine生成HTML电子邮件 - 第01部分 - 简介
利用ASP.NET之外的Razor模板:它们不仅仅适用于HTML了!
使用RazorEngine在ASP.NET中实现更智能的电子邮件模板
类似Stackoverflow QA
使用新的RazorEngine API进行模板化
使用没有MVC的Razor
是否可以在asp.net外部使用Razor View Engine
您可能还想尝试加载控件,然后将其呈现为字符串并将其设置为HTML正文:
// Declare stringbuilder to render control to StringBuilder sb = new StringBuilder(); // Load the control UserControl ctrl = (UserControl) LoadControl("~/Controls/UserControl.ascx"); // Do stuff with ctrl here // Render the control into the stringbuilder StringWriter sw = new StringWriter(sb); Html32TextWriter htw = new Html32TextWriter(sw); ctrl.RenderControl(htw); // Get full body text string body = sb.ToString();
然后,您可以照常构建您的电子邮件:
MailMessage message = new MailMessage(); message.From = new MailAddress("from@email.com", "from name"); message.Subject = "Email Subject"; message.Body = body; message.BodyEncoding = Encoding.ASCII; message.IsBodyHtml = true; SmtpClient smtp = new SmtpClient("server"); smtp.Send(message);
用户控件可以包含其他控件,例如页眉和页脚,还可以利用数据绑定等功能.
您可以尝试MailDefinition类
如果您想传递用户名,产品名称等信息,您可以使用开源模板引擎NVelocity来生成最终的电子邮件/ HTML.
NVelocity模板(MailTemplate.vm)的一个示例:
A sample email template by $name.
Foreach example :
#foreach ($item in $itemList) [Date: $item.Date] Name: $item.Name, Value: $itemValue.Value
#end
在应用程序中通过MailTemplate.vm生成邮件正文:
VelocityContext context = new VelocityContext(); context.Put("name", "ScarletGarden"); context.Put("itemList", itemList); StringWriter writer = new StringWriter(); Velocity.MergeTemplate("MailTemplate.vm", context, writer); string mailBody = writer.GetStringBuilder().ToString();
结果邮件正文是:
ScarletGarden的示例电子邮件模板 .
Foreach示例:
[日期:2009年12月12日]姓名:第1项,价值:09
[日期:2009年2月21日]姓名:第4项,价值:52
[日期:01.03.2009]姓名:第2项,价值:21
[日期:2009年3月23日]姓名:第6项,价值:24
要编辑模板,您可以使用FCKEditor并将模板保存到文件中.
Mail.dll电子邮件组件包括电子邮件模板引擎
这是语法概述:
Hi {FirstName} {LastName}, Here are your orders: {foreach Orders} Order '{Name}' sent to {Street}. {end}
加载模板的代码填充c#对象的数据并发送电子邮件:
Mail.Html(Template .FromFile("template.txt") .DataFrom(_contact) .Render()) .Text("This is text version of the message.") .From(new MailBox("alice@mail.com", "Alice")) .To(new MailBox("bob@mail.com", "Bob")) .Subject("Your order") .UsingNewSmtp() .WithCredentials("alice@mail.com", "password") .Server("mail.com") .WithSSL() .Send();
您可以获得有关电子邮件模板引擎博客帖子的更多信息
或者只是下载Mail.dll电子邮件组件并尝试一下.
请注意,这是我创建的商业产品.
如果灵活性是您的先决条件之一,那么XSLT可能是一个不错的选择,.NET框架完全支持它,您甚至可以让用户编辑这些文件.本文(http://www.aspfree.com/c/a/XML/XSL-Transformations-using-ASP-NET/)可能对一开始很有用(msdn有更多关于它的信息).正如ScarletGarden所说,NVelocity是另一个不错的选择,但我更喜欢XSLT的"内置".NET框架支持和平台无关.
我认为您也可以这样做:
创建和.aspx页,并将其放在OnLoad方法的末尾,或手动调用它。
StringBuilder sb = new StringBuilder(); StringWriter sw = new StringWriter(sb); HtmlTextWriter htmlTW = new HtmlTextWriter(sw); this.Render(htmlTW);
我不确定是否有任何潜在的问题,但看起来可行。这样,您可以使用功能齐全的.aspx页,而不是仅支持文本替换的MailDefinition类。