电子邮件模板引擎

3
我即将为我正在工作的网站(asp.net/c#)编写一个简单的电子邮件管理器;该网站会发送各种电子邮件,例如账户创建、新闻、某些用户操作等等。因此,会有一些电子邮件模板,其中包含像[$FirstName]这样的占位符,这些占位符将被实际值替换。非常标准的东西。我只是想知道是否有人可以提供现有的代码 - 再次强调,我需要非常简单的东西,没有太多花里胡哨的东西,并且显然带有源代码(并且免费)。任何想法/评论都将不胜感激!谢谢,Andrey

一些关于RazorEngin、HandleBars和SharpTal的测试: https://dev59.com/BnRC5IYBdhLWcg3wUfN2#33546901 - Nigrimmist
4个回答

5
已经有一些关于这个主题的帖子在Stack Overflow上了,但我最终还是从那里的各种建议中自己解决了问题。我使用了这个FormatWith扩展方法来处理简单的模板,然后我创建了一个基本的Email基类来处理常见任务,比如拉取适当的模板和替换所有必要的信息,以及提供一个Send()方法。
我需要发送的所有电子邮件都有自己的子类,派生自基类,并定义它们各自独特的东西,比如TemplateText、BindingData、Recipients和Subject。将它们分别放在它们自己的类中使得它们非常容易独立于应用程序的其余部分进行单元测试。
为了使您的应用程序可以使用这些电子邮件类而不真正关心它正在使用哪一个,实现一个接口也是一个好主意,其中包含任何共享方法(我关心的唯一一个是Send()),这样您的应用程序就可以实例化任何它想要的电子邮件类并以相同的方式与它们一起工作。也许泛型也可以使用,但这是我想出来的。
IEmail email = new MyEmailClass();
email.Send();

编辑:这里还有更多的建议:我能在ASP.NET中设置HTML/电子邮件模板吗?


1

我经常这样做。模板=带有{#}占位符的文本字符串。要使用模板,我加载字符串(从任何存储中)然后调用string.Format(template,param1,param2..)

简单而且效果很好。当您需要更强大的东西时,可以转移到某种框架,但是string.format对我来说始终有效。

注意

Alison R的链接将此方法提升到了3.5的匿名类型,效果非常好。如果您使用的是3.5,则建议在那里使用FormatWith(我会),否则这种方式也可以正常工作。


虽然这可能很简单,但它并没有将内容和表现分开。而且,既然正在使用电子邮件,为什么不使用.NET框架已经内置的东西呢? - JasCav
1
不确定你在说什么... {0} 是内容,模板是演示。 - Hogan

0
如果您正在使用ASP.NET,那么您已经可以使用模板引擎了。只需创建一个ASP.NET页面来生成您想要的结果(使用任何控件等),并将响应的ContentType设置为适当的类型(根据电子邮件格式是文本还是HTML)。 确保此URL不会公开暴露。
然后,在您的代码中,您将创建一个HttpWebRequest/HttpWebResponse或WebClient,然后获取URL并获取内容。ASP.NET引擎将处理请求并返回格式化的结果,然后您可以通过电子邮件发送。
如果您想要更简单的方法,为什么不使用RegEx和匹配?只需确保您的字段具有相当独特的标识符(前缀和后缀,您可以保证永远不会使用,或者至少可以编写转义序列),然后您可以轻松使用Match方法进行替换。
RegEx方法的唯一“陷阱”是,如果您必须进行嵌入式模板处理,则需要做更多的工作。

3
对我来说,这似乎不是适合这项工作的正确工具,并且您将遇到很多问题,因为Outlook无法呈现.NET框架认为标准的HTML。而且,您必须运行整个页面周期才能完成可以用更少代码实现的任务。 - Hogan

0

我刚刚自己完成了这个,有一些很好的信息在这里:同时发送HTML和纯文本电子邮件。最好的部分是,你不需要除了.NET之外的任何东西。

基本上,你创建一个HTML页面(也就是你格式化的电子邮件),其中包含你想要替换的标签(在这种解决方案的情况下,标签将采用以下格式:<%TAGNAME%>)。然后,你利用上述网站中找到的信息创建一个带有填充了适当数据的标签的邮件模板,并将注入操作完成到你的HTML模板中。然后,你只需使用内置于.NET中的SMTP类并将邮件发送出去即可。这非常简单和直接。

如果你有任何其他问题,请告诉我。希望这可以帮助你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接