宣布 MvcMailer - 使用 ASP.NET MVC 视图发送电子邮件






4.84/5 (16投票s)
MvcMailer NuGet 包允许您将 MVC 视图渲染为电子邮件正文。
问题
你是否曾经需要从你的 ASP.NET MVC 应用程序发送一封专业的 HTML 电子邮件? 例如,欢迎新注册的用户或发送密码重置链接? 我相信在某个时候你必须这样做! 好吧,在某个时候,我们都必须从我们的应用程序发送电子邮件,无论是为了通知,还是“告诉朋友”功能,还是任何其他事情... 可悲的是,构建具有个性化文本、图像和样式的 HTML 电子邮件至少让人头疼(或其他什么地方)! 为了可视化,这通常在代码中看起来像这样
StringBuilder mailBody = new StringBuilder();
mailBody.Append("<html><head><style type=\"text\css\">...</style></head>");
mailBody.Append("<body>")
mailBody.AppendFormat("Hi {0}<br/>", user.FirstName);
...
... XX lines of similar Appending unless it its done!
...
mailBody.Append("</body></html>");
理想的解决方案
等一下! 我们已经在使用 MVC 视图文件创建具有所有样式、母版页和动态内容的复杂 HTML 视图。 这正是我们在 HTML 电子邮件中需要的! 因此,对我来说,理想的解决方案将如下所示
/* Layout: ~Views/Notifier/_Layout.cshtml */
<html>
<head>
<style type="text\css">
...
</style>
</head>
<body>
<div class="banner"></div>
<div class="mailBody">
Hello @user.FirstName:<br/>
@RenderBody()
Thank you.
--
The Team!
</div>
<body>
</html>
/* WecomeMessage: ~Views/Notifier/WelcomeMessage.cshtml */
Welcome to the Team Site. Please click the following link to complete your account signup!
@Html.ActivationLink(user.ActivationUrl)
这是否更简洁?
介绍 MvcMailer NuGet 包
MvcMailer
在这里可用。 要安装它,只需打开你的程序包管理器控制台并运行“Install-Package MvcMailer”(不带引号)即可! 如果你是 NuGet 的新手,我建议你安装它,以便像 MvcMailer
一样利用免费的库作为你应用程序的插件!
使用 MvcMailer
一旦你安装了 MvcMailer
NuGet 包,它会将以下内容添加到你的项目中
- 对 Mvc.Mailer.dll 的引用
- Notifier.cs 到 Mailers
- _Layout.cshtml 和 WelcomeMessage.cshtml 到 Views/Notifier
system.net mailSettings
到 web.config
如果你打开 Mailers/Notifier.cs,你将找到一个如何使用 MvcMailer
库发送电子邮件的示例。 你可以按照此列表在 3 分钟内启动并运行
- 打开 web.config 并使用以下部分中的适当值替换占位符
<smtp from="some-email@gmail.com"> <network enableSsl="true" host="smtp.gmail.com" port="587" userName="some-email@gmail.com" password="valid-password"/> </smtp>
- 打开 Mailers/Notifier.cs 并使用适当的电子邮件地址替换收件人
mailMessage.To.Add("some-email@gmail.com");
- 现在,添加以下代码以在你的控制器、模型或任何其他地方发送电子邮件
using Mvc.Mailer; using YourAppRootNamespace.Mailers; ... new Notifier().WelcomeMessage().Send(); ...
你还可以使用以下方法发送异步电子邮件
new Notifier().WelcomeMessage().SendAsync();
因此,总而言之,只需在其 2 行标准 .NET Mail 配置之上加上 1 行代码,即可利用所有 MVC 视图的功能发送电子邮件! 听起来不错,是吗?
这如何工作?
如果你查看 Mailers/Notifier.cs 中的 WelcomeMessage()
方法,你将看到这一行
mailMessage.Body = PopulateBody(mailMessage: mailMessage,
viewName: "WelcomeMessage")
上面的行使用 string
(包含从视图编译的 HTML)填充 mailMessage.body
,就像在常规 MVC 视图的情况下一样! 因此,你可以充分利用你的视图引擎来构建电子邮件正文,而不是到处都是丑陋的 string
连接!
正如你所看到的,它使用的视图引擎与你的其余视图相同。 因此,它只是重用现有 ASP.NET MVC 框架中的组件并在其之上进行扩展。 它使用一个名为 StringResult
的新类扩展了 ASP.NET MVC 的 ViewResult
类。 StringResult
执行与 ViewResult
完全相同的功能,但有一个例外:它不是写入 HTTP 响应输出流,而是简单地写入 StringBuilder
! 因此,HTML 生成是完全相同的,但呈现是不同的。
现在,视图及其母版页和动态内容被编译成一个 string
,它可以用作电子邮件的正文。 这就是它的工作原理。 除此之外,它还利用了 System.Net.Mail namespace
的标准 MailMessage
类。 因此,对于已经了解 ASP.NET 电子邮件库的人来说,实际上没有任何学习曲线。
为了简化事情,Mvc.Mailer
命名空间具有 MailMessage
的扩展类,该类为其添加了两个方便的方法 - 即 Send() 和 SendAsync()
。 这些方法只是中继到 SmtpClient
类的一个实例。 因此,你的代码不需要处理所有这些传输层细节,并且可以保持在与 Controller Actions
相当高的级别,你只需触发视图并忘记它实际上是如何发送到输出流的!
一些有趣的要点
- 实现
MvcMailer
的想法实际上是在我浏览 ASP.NET MVC 源代码时产生的。 - 这个想法源于我的 Ruby on Rails 背景。
- NuGet 包裹似乎是为 .NET 应用程序发布插件的好方法!
MvcMailer
的源代码只有几十行,如果你想,你可以看看这个 github 页面!
有趣的更新
- 2011 年 1 月 28 日 -
MvcMailer
0.7 发布。 此版本为使用MvcMailer
发送电子邮件的代码添加了自动化测试支持。 - 2011 年 1 月 28 日 - MvcMailer-Example 项目已推送到 github。 使用示例项目可以更快地启动并运行
MvcMailer
!