什么被认为是构建从C#Web应用程序发送电子邮件的最佳方式?

时间:2011-12-19 00:41:06

标签: c# asp.net-mvc email architecture t4

我正在开发一个即将上线的Web应用程序,现在我正在尝试找出处理从应用程序发送电子邮件的最佳方法。我完全理解如何使用MailMessage和SmtpClient类从应用程序发送电子邮件,但我的问题来自不同的角度。我在这个项目之前工作的主要目的是支持我之前开发的旧应用程序。在这些应用程序中,当他们需要发送电子邮件时,他们会将任何消息硬编码到实际消息中,并将所有HTML标记直接嵌入到C#代码中。

我正在处理的应用程序将有一个模板用于发送电子邮件,作为一种样式容器,不同的消息将嵌入到模板的主要内容div中。我想避免在这个应用程序中硬编码这些模板,所以我一直在试图找出布局项目的最佳方法。我曾想过使用t4模板,并将不同的t4读入应用程序并使用指定参数的String.Format将名称/电子邮件添加到要发送的消息中。但是,我不确定这是最好的方法。

我的另一个想法是为每种类型的消息定义一个类,但这最终会再次硬编码消息,正如我所说,我不想这样做。

我的问题是,你过去怎么接近这个?什么有效,什么没有,有什么原因?我已经在网上看了一遍,但是其中唯一的内容是如何发送消息,或者我没有使用正确的Google强力词。

2 个答案:

答案 0 :(得分:2)

我是这样做的:

  • 使用ViewModel和Razor模板
  • 进行常规编码
  • 通过创建电子邮件,使用http://razorengine.codeplex.com/加载和解析模板
  • 如果你想在一个帖子中发送电子邮件,请注意不要使用Html和Url助手,因为它们依赖于你在那种情况下没有的HttpContext。如果需要,建立自己的帮手。

例如,如果您的应用程序中有一个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(),
});