Joh*_*ski 94 c# asp.net email templates
我正在开发一个会发送大量电子邮件的网站.我想设置页眉和页脚文本,甚至是模板,以便用户在需要时轻松编辑这些电子邮件.
如果我将HTML嵌入到C#字符串文字中,那就很难看了,他们不得不担心转义.包括页眉和页脚的平面文件可能会起作用,但关于它的一些东西感觉不对.
什么是理想的.ASPX
是以某种方式使用页面作为模板,然后告诉我的代码服务该页面,并使用为电子邮件返回的HTML.
有这么好的方法吗?有没有更好的方法来解决这个问题?
更新:
我添加了一个答案,使您可以使用标准的.aspx页面作为电子邮件模板.只需像通常那样替换所有变量,使用数据绑定等.然后只需捕获页面的输出,瞧!你有HTML电子邮件!
更新
了CAVEAT !!!:我在一些aspx页面上使用MailDefinition类就好了,但是当在运行的服务器进程中尝试使用这个类时,它失败了.我相信这是因为MailDefinition.CreateMailMessage()方法需要一个有效的控件来引用,即使它并不总是做某事.因此,我建议使用aspx页面的方法,或使用ascx页面的Mun方法,这看起来好一点.
Mik*_*Dev 73
这里已经有很多答案,但我偶然发现了一篇关于如何将Razor与电子邮件模板结合使用的精彩文章.使用ASP.NET MVC 3推动了Razor,但MVC不需要使用Razor.这是处理电子邮件模板的非常流畅的处理
正如文章所指出的那样,"Razor的最佳之处在于它与其前身(webforms)不同,它与网络环境无关,我们可以轻松地将其托管在网络之外,并将其用作各种用途的模板引擎."
使用RazorEngine生成HTML电子邮件 - 第01部分 - 简介
利用ASP.NET之外的Razor模板:它们不仅仅适用于HTML了!
使用RazorEngine在ASP.NET中实现更智能的电子邮件模板
类似Stackoverflow QA
是否可以在asp.net外部使用Razor View Engine
Mun*_*Mun 55
您可能还想尝试加载控件,然后将其呈现为字符串并将其设置为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();
Run Code Online (Sandbox Code Playgroud)
然后,您可以照常构建您的电子邮件:
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);
Run Code Online (Sandbox Code Playgroud)
用户控件可以包含其他控件,例如页眉和页脚,还可以利用数据绑定等功能.
Joh*_*han 35
您可以尝试MailDefinition类
Can*_*var 18
如果您想传递用户名,产品名称等信息,您可以使用开源模板引擎NVelocity来生成最终的电子邮件/ HTML.
NVelocity模板(MailTemplate.vm)的一个示例:
A sample email template by <b>$name</b>.
<br />
Foreach example :
<br />
#foreach ($item in $itemList)
[Date: $item.Date] Name: $item.Name, Value: $itemValue.Value
<br /><br />
#end
Run Code Online (Sandbox Code Playgroud)
在应用程序中通过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();
Run Code Online (Sandbox Code Playgroud)
结果邮件正文是:
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电子邮件组件包括电子邮件模板引擎
这是语法概述:
<html>
<body>
Hi {FirstName} {LastName},
Here are your orders:
{foreach Orders}
Order '{Name}' sent to <strong>{Street}</strong>.
{end}
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
加载模板的代码填充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();
Run Code Online (Sandbox Code Playgroud)
您可以获得有关电子邮件模板引擎博客帖子的更多信息
或者只是下载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);
Run Code Online (Sandbox Code Playgroud)
我不确定是否有任何潜在的问题,但看起来可行。这样,您可以使用功能齐全的.aspx页,而不是仅支持文本替换的MailDefinition类。
归档时间: |
|
查看次数: |
125207 次 |
最近记录: |