我正在开发一个即将上线的Web应用程序,现在我正在尝试找出处理从应用程序发送电子邮件的最佳方法。我完全理解如何使用MailMessage和SmtpClient类从应用程序发送电子邮件,但我的问题来自不同的角度。我在这个项目之前工作的主要目的是支持我之前开发的旧应用程序。在这些应用程序中,当他们需要发送电子邮件时,他们会将任何消息硬编码到实际消息中,并将所有HTML标记直接嵌入到C#代码中。
我正在处理的应用程序将有一个模板用于发送电子邮件,作为一种样式容器,不同的消息将嵌入到模板的主要内容div中。我想避免在这个应用程序中硬编码这些模板,所以我一直在试图找出布局项目的最佳方法。我曾想过使用t4模板,并将不同的t4读入应用程序并使用指定参数的String.Format将名称/电子邮件添加到要发送的消息中。但是,我不确定这是最好的方法。
我的另一个想法是为每种类型的消息定义一个类,但这最终会再次硬编码消息,正如我所说,我不想这样做。
我的问题是,你过去怎么接近这个?什么有效,什么没有,有什么原因?我已经在网上看了一遍,但是其中唯一的内容是如何发送消息,或者我没有使用正确的Google强力词。
答案 0 :(得分:2)
我是这样做的:
例如,如果您的应用程序中有一个ViewModel Car
显示在某处,您也可以在Razor模板中将此ViewModel用作@model进行电子邮件。
答案 1 :(得分:0)
我必须在几次这样做。我最初使用ASP.Net模板引擎基于我认为Rick Strahl博客文章。它起作用但总是有一些问题我正在敲打着。
我转而使用NVelocity模板引擎,发现这是一种创建和维护电子邮件模板的简单方法。还有许多其他模板引擎,我怀疑下次我可能会认真审视Razor engine。
将值合并到模板中的代码:
private string Merge(ManualTypeEnum manualType, Object mergeValues)
{
var body = "";
var templateFile = string.Format("{0}MailTemplate.vm", manualType);
var velocity = new VelocityEngine();
var props = new ExtendedProperties();
props.AddProperty("file.resource.loader.path", Config.EmailTemplatePath);
velocity.Init(props);
var template = velocity.GetTemplate(templateFile);
var context = new VelocityContext();
context.Put("Change", mergeValues);
using (var writer = new StringWriter())
{
template.Merge(context, writer);
body = writer.ToString();
}
return body;
}
要合并的值作为匿名对象传递,并且可以包括各种类型,包括列表等,例如
var emailBody = Merge(newDocument.ManualType, new
{
ManualType = newDocument.ManualType.ToString(),
Message = change.Message,
NewTitle = newDocument.Title ?? "",
NewVersion = newDocument.Version ?? "",
Contact = From,
Changes = change.ToList(),
});