65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (16投票s)

2011 年 1 月 12 日

MIT

4分钟阅读

viewsIcon

103116

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 包,它会将以下内容添加到你的项目中

  1. Mvc.Mailer.dll 的引用
  2. Notifier.cs 到 Mailers
  3. _Layout.cshtmlWelcomeMessage.cshtml 到 Views/Notifier
  4. system.net mailSettingsweb.config

如果你打开 Mailers/Notifier.cs,你将找到一个如何使用 MvcMailer 库发送电子邮件的示例。 你可以按照此列表在 3 分钟内启动并运行

  1. 打开 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>									
  2. 打开 Mailers/Notifier.cs 并使用适当的电子邮件地址替换收件人
    mailMessage.To.Add("some-email@gmail.com");
  3. 现在,添加以下代码以在你的控制器、模型或任何其他地方发送电子邮件
    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 页面

有趣的更新

  1. 2011 年 1 月 28 日 - MvcMailer 0.7 发布。 此版本为使用 MvcMailer 发送电子邮件的代码添加了自动化测试支持。
  2. 2011 年 1 月 28 日 - MvcMailer-Example 项目已推送到 github。 使用示例项目可以更快地启动并运行 MvcMailer
© . All rights reserved.