我即将为我正在开发的网站(asp.net/c#)编写一个简单的电子邮件管理器;该网站会发送各种电子邮件,例如帐户创建、新闻、一些用户操作等。因此,会有一些带有占位符的电子邮件模板,例如 [$FirstName],这些占位符将被实际值替换。相当标准的东西。我只是想知道是否有人可以对现有代码提供建议 - 再说一次,我需要一些非常简单的东西,没有很多花哨的东西,并且显然带有源代码(并且免费)
任何想法/评论将不胜感激!
谢谢, 安德烈
Stack Overflow 上已经有几个关于此问题的线程,但我最终根据那里的各种建议推出了自己的解决方案。
我使用这个 FormatWith 扩展方法来处理简单的模板,然后我创建了一个基本的电子邮件基类来处理常见任务,例如引入适当的模板并替换所有必需的信息,以及提供Send() 方法。
我需要发送的所有电子邮件都有自己的从基础派生的子类,并定义它们独有的内容,例如 TemplateText、BindingData、Recipients 和主题。让它们各自在自己的类中,使它们很容易独立于应用程序的其余部分进行单元测试。
为了让您的应用程序可以使用这些电子邮件类,而无需真正关心它正在使用哪个类,使用任何共享方法(我唯一关心的是 Send())实现一个接口也是一个好主意,所以您的应用程序可以实例化它想要的任何电子邮件类并以相同的方式使用它们。也许也可以使用泛型,但这就是我想到的。
IEmail email = new MyEmailClass();
email.Send();
编辑:这里还有更多建议:我可以使用 ASP.NET 设置 HTML/电子邮件模板吗?
我总是做以下事情。 模板 = 带有
{#}
占位符的文本字符串。 要使用模板,我加载字符串(从任何商店),然后调用 string.Format(template,param1,param2..)
简单且效果良好。 当你需要更强大的东西时,你可以转向某种框架,但 string.format 对我来说一直很有效。
注意
Alison R 的链接将此方法带入下一步,使用 3.5 的匿名类型取得了巨大的效果。 如果你是 3.5,我建议使用 FormatWith(我会),否则这种方式效果很好。
如果您使用 ASP.NET,则您已经有一个可用的模板引擎。 只需创建一个 ASP.NET 页面,该页面将为您生成所需的结果(使用任何控件等),并将响应的 ContentType 设置为适当的类型(文本或 HTML,具体取决于电子邮件格式) )
确保此网址未公开暴露。
然后,在代码中,您将创建 HttpWebRequest/HttpWebResponse 或 WebClient,然后获取 URL 并获取内容。 ASP.NET 引擎将处理该请求并返回您的格式化结果,然后您可以通过电子邮件发送该结果。
如果你想要更简单的东西,为什么不使用正则表达式和匹配呢? 只需确保您的字段有一个相当唯一的标识符(前缀和后缀,您可以保证永远不会使用它们,或者,您至少可以为其编写一个转义序列),然后您可以轻松地使用 Match 方法来执行更换。
RegEx 方法的唯一“陷阱”是,如果您必须进行嵌入式模板,那么这将需要更多的工作。
我自己刚刚完成此操作,这里有一些很棒的信息:Sending Email Both in HTML and Plain Text。 最好的部分是,除了 .NET 之外,您不需要任何其他东西。
本质上,您使用要替换的标签创建一个 HTML 页面(也称为格式化电子邮件)(在此解决方案中,标签的格式为:<%TAGNAME%>)。 然后,您可以利用在上述网站上找到的信息创建一个邮件模板,其中的标签填充了适当的数据,并且注入将完成到您的 HTML 模板中。 然后,您只需使用 .NET 中内置的 SMTP 类并按其方式发送邮件。 非常简单明了。
如果您还有任何其他问题,请告诉我。 希望有帮助!