第二周的NuGet软件介绍 - MvcMailer通过ASP.NET MVC Razor视图和基架发送邮件

[原文发表地址] NuGet Package of the Week #2 - MvcMailer sends mails with ASP.NET MVC Razor Views and Scaffolding

[原文发表时间] 2011-03-15 02:31 PM

 

嘿,您实施了NuGet行动计划吗?行动起来吧,它只需5分钟——升级到1.2版本安装自动更新获取NuGet 软件包浏览器NuGet1.3已经out了,所以请确保您已经设置了自动更新!

 

故事背景: 我正在思考, 既然NuGet.Net软件包管理网站开始逐渐充实,那么我应该开始在那寻找宝石了(没有双关含义)。您知道,就是那种大家可能没法发现的真正有用东西。我将主要寻找开放源代码项目——我认为它们很有用。我会查看它们如何生成NuGet软件包,看看它们设计盒外(out of the box)安装体验时有没有什么有趣的地方(以及任何它们可以改进而实施的举措),当然也会关注软件包本身所做的事。

 

MvcMailer通过ASP.NET MVC Razor视图和基架发送邮件

 

我只是热爱NuGet包背后的理念: 利用ASP.NET 的转变来有效移植/重装Rails ActionMailer。 这样做的奇妙之处很多。

 

首先,因为我们都有这个想法但是从来没有实现过它(所有出色的软件都会有这个成分)! 六个月之间我一直在说会写出来。当然,多说无益,给我看代码。 我非常高兴我从来没有编写过它,否则的话,它就不会有这么出色了。

其次,因为作者Sohan是以一种非常“乐高”的方法在现有技术上实现它的。杰出的开源应用程序常常完全构建在其他很棒的应用程序上。通过分离关注点,着重考虑MvcMailer所添加的新功能, 他真正避免了重复代码的编写。

Description: clip_image002

 

在这个时代,你在每个项目中都需要发邮件给用户。传统上这样做大多数时候都很糟糕。正如Sohan所说,通常像这样做:

 

StringBuilder mailBody = new StringBuilder();

mailBody.Append("<html><head><style type=\"text\css\">...</style></head>");

mailBody.Append("<body>")

mailBody.AppendFormat("Hi {0}

", user.FirstName);

...

... XX lines of similar Appending unless it its done!

...   

mailBody.Append("</body></html>");

 

 

如果您与众不同,也许您将模板文本文件放置在某个地方,然后替换(“{token}”),但是这样做仍然很差劲。

 

此外,你希望不但能够发送内容丰富的HTML邮件而且能够发送普通的文本邮件(甚至多部分的)。 幸运的是,我们已经能通过ASP.NET MVC来为只使用HTTP的用户创建很不错的HTML模板输出。 我们为什么不能对邮件做同样的操作呢?

 

MvcMailer是如何工作的? 它凭什么酷?

 

MVCMailer NuGet包真的在诸多层面上都很聪明。我们(您,我,亲爱的读者)也许可以一起来研究它。 它满载可以用于我们的NuGet包的小窍门和灵活的最佳实践。

 

在安装包时会运行的PowerShell脚本install.ps1里面, 他以一系列Write-Host命令的方式给出了少量自述文件,以一种简洁聪明又有效的方式来吸引我的注意。它做到了!

 

Write-Host ---------------------------READ ME---------------------------------------------------

Write-Host

Write-Host Your default Mailer Scaffolder is set to $mailerScaffolder

Write-Host

Write-Host You can generate your Mailers and Views using the following Scaffolder Command

Write-Host

Write-Host "PM> Scaffold Mailer UserMailer Welcome,GoodBye"

Write-Host

Write-Host Edit the smtp configuration at web.config file before you send an email

Write-Host

Write-Host You can find more at: https://github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide

Write-Host

Write-Host -------------------------------------------------------------------------------------

 

他也使用了特定版本的lib文件夹。 因为这个包只能在.NET4上使用而且NuGet也通过lib文件夹命名来获知它的信息, 所以Lib下面有40个文件夹。 你可以通过这些文件夹使用Silverlight等。 

 

MvcMailer利用了Steve Sanderson创建的非常好(而且有前瞻性)的基架系统。 Steve将基本MvcScaffolding原型变成了两个包:MvcScandffolding包,和另一个不是只针对MVC的称为T4Scanffolding的基本包。您可以获取Scaffolder并设置Scaffolder去生成任何你想要的东西,他就那么去做了。

 

如果我键入Get-Scaffoler,我会看到MvcMailer植入的地方:

 

PM> Get-Scaffolder

 

Name Description Package                      

---- ----------- -------                      

Mailer.Aspx Scaffold ... MvcMailer 1.1                

Mailer.Razor Scaffold ... MvcMailer 1.1                

T4Scaffolding.CustomScaffolder Creates a... T4Scaffolding 0.9.7          

T4Scaffolding.CustomTemplate Allows yo... T4Scaffolding 0.9.7          

T4Scaffolding.EFDbContext Makes an ... T4Scaffolding 0.9.7          

T4Scaffolding.EFRepository Creates a... T4Scaffolding 0.9.7

 

现在我可以构造一个发送欢迎再见邮件(随便什么, 像更改密码等等)的邮件软件。

 

PM> Scaffold Mailer UserMailer Welcome,GoodBye

Added MvcMailer output 'Mailers\IUserMailer.cs'

Added MvcMailer output 'Mailers\UserMailer.cs'

Added MyScaffolder output 'Views\UserMailer\_Layout.cshtml'

Added MyScaffolder output 'Views\UserMailer\Welcome.cshtml'

Added MyScaffolder output 'Views\UserMailer\GoodBye.cshtml'

 

 

啊,但是我需要HTML和文本两个版本,所以我用WithText再做一次:

 

PM> Scaffold Mailer UserMailer Welcome,GoodBye -WithText

Mailers\IUserMailer.cs already exists! Skipping...

Mailers\UserMailer.cs already exists! Skipping...

Views\UserMailer\_Layout.cshtml already exists! Skipping...

Views\UserMailer\Welcome.cshtml already exists! Skipping...

Views\UserMailer\GoodBye.cshtml already exists! Skipping...

Added MyScaffolder output 'Views\UserMailer\_Layout.text.cshtml'

Added MyScaffolder output 'Views\UserMailer\Welcome.text.cshtml'

Added MyScaffolder output 'Views\UserMailer\GoodBye.text.cshtml'

 

 

非常酷。现在我得到了用来欢迎和再见的结构良好的模板,就像用HTML和文本来查看的一样。我可以去掉UserMail中生成的代码去扩展它。比如说,如果我希望将数据发给我的mailer(我可能会), 我会把它改成这样:

 

public virtual MailMessage Welcome(string firstName, string email)

{

    var mailMessage = new MailMessage{Subject = "Welcome"};

    

    mailMessage.To.Add(email);

    ViewBag.FirstName = firstName;

    PopulateBody(mailMessage, viewName: "Welcome");

 

    return mailMessage;

}

 

 

然后我可以从常规控件来调用它去响应操作。喜欢的话,你当然可以在一行之内完成:

 

var mailer = new UserMailer();

var msg = mailer.Welcome(firstName: "Scott", email: "scottha@microsoft.com");

msg.Send();

 

我喜欢指定的参数。

 

注意 : Send()方法是一个扩展方法,你需要确保已经在命名空间内引用MvcMailer了。 解决这个问题耽误了我一会.

 

现在,因为我不想搭建SMTP邮件服务器,所以就修改web.config,将邮件写入一个临时文件夹内:

 

<system.net>

  <mailSettings>

    <!-- Method#1: Configure smtp server credentials -->

    <!--<smtp from="some-email@gmail.com">

      <network enableSsl="true" host="smtp.gmail.com" port="587" userName="some-email@gmail.com" password="valid-password" />

    </smtp>-->

    <!-- Method#2: Dump emails to a local directory -->

    <smtp from="some-email@gmail.com" deliveryMethod="SpecifiedPickupDirectory">

      <network host="localhost" />

      <specifiedPickupDirectory pickupDirectoryLocation="c:\temp\"/>

    </smtp>

  </mailSettings>

</system.net>

 

当我执行 /Home/SendWelcomeEmail时,我的临时文件夹内就设置好邮件了(注意Outloook图标):

MvcMailerTempEmail

下面是我的邮件。请注意邮件表单和姓名处传入的用户数据。

 

 

Welcome - Message (HTML) (32)

 

我只是很喜欢这个包的诞生,喜欢构建在当前项目基础上又完全与现有的规范融合的一个如此好的开源典范。它也是Steve关于T4Scaffolding的扩展性观点、Andrew Nurse与研究Razor的朋友们实践的证明,因为没有团队曾料到这个项目的诞生!表扬下Sohan对这个有用又精致的项目所做的贡献!我希望社区能感谢他的工作,支持他修复缺陷和更多改进。请以发表评论和关注他在GitHub的项目的方式感谢他吧

 

另一件聪明事

 

下面是Sohan所做的另一件聪明事。因为他需要确定您更中意的引擎,所以他计算了ASPX文件和Razor文件的数量,然后认定最多的那个引擎就是您更喜欢的。

 

StringBuilder mailBody = new StringBuilder();

mailBody.Append("<html><head><style type=\"text\css\">...</style></head>");

mailBody.Append("<body>")

mailBody.AppendFormat("Hi {0}

", user.FirstName);

...

... XX lines of similar Appending unless it its done!

...   

mailBody.Append("</body></html>");

StringBuilder mailBody = new StringBuilder();

mailBody.Append("<html><head><style type=\"text\css\">...</style></head>");

mailBody.Append("<body>")

mailBody.AppendFormat("Hi {0}

", user.FirstName);

...

... XX lines of similar Appending unless it its done!

...   

mailBody.Append("</body></html>");

 

非常酷。