Azure Lei Zhang的博客

weibo: LeiZhang的微博/QQ: 185165016/QQ群:319036205/邮箱:leizhang1984@outlook.com/TeL:139-161-22926

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  390 随笔 :: 0 文章 :: 394 评论 :: 0 引用

  Windows Azure Platform 系列文章目录

 

  许多Web应用都具有发送邮件通知的功能,不管是作为用户注册流程的一部分,还是通知用户一系列重要事件的发生。如果您是一个.NET的开发人员,你可能使用System.Web.Mail这个命名空间来完成该功能。然而,这些类需要访问一个SMTP电子邮件服务器发送消息,Windows Azure目前并不能提供这样的功能。我将会写量部分系列文章,介绍一些设计模式,使得部署到Windows Azure平台的应用可以使用电子邮件的功能。

  1.使用用户部署在内部局域网上的邮件转发服务器(Email Forward Service),这种模式将在本章中做详细介绍。利用局域网内部的邮件服务器,替代Windows Azure公有云上的应用程序发送电子邮件。这种方式通过创建一个使用分布式异步模式的自定义服务,使用Windows Azure Storage Queues和Blob来实现。

  2.使用电子邮件服务器的Web Service API。这种模式将在下一部分中介绍:使用由Microsoft Exchange Web Services API提供直接从Windows Azure发送电子邮件。这种模式可以应用到其他的通讯产品,提供了一个相似的Web服务接口。

  3.使用第三方的SMTP服务。这种模式将在第三部分介绍,利用像SendGrid或者AuthSMTP第三方电邮服务中继电子邮件。同时我们也会介绍如何从Windows Azure应用程序接收电子邮件,利用25端口监听SMTP流量。

 

使用用户部署在内部局域网上的邮件转发服务器

这种模式利用您现有的内部邮件服务器,替代Windows Azure公有云上的应用程序发送电子邮件。这种模式通过创建一个自定义的邮件转发服务器,使用Windows Azure Storage和Blob来实现。该模式分为两个主要部分:

  1.准备和发送电子邮件的工作:由Windows Azure Web Role和Worker Role来实现,生成邮件的工作。它序列化邮件对象,然后在Windows Azure Storage中创建一个电子邮件的工作项目。

  2.接收和发送电子邮件的工作:由一个邮件转发服务来实现。从Windows Azure Storage中获得电子邮件的工作项目,反序列化电子邮件对象,并把该对象发送到邮件服务器。

对于从Windows Azure到内部局域网的分布式邮件服务器,我们将定义一个"工作项目"的概念。工作项目是一个逻辑容器组成:

  1.一个Queue(队列)项目:这个队列项目保存了,存储在Blob中的邮件信息的引用(通过URL)。它也可以容纳多达8K的元数据。

  2.一个Blob项目:这个Blob项目包含了序列化后的邮件对象。因为Blob的存储上限高达1TB,电子邮件对象可以包含多个大数据量的附件。

下图展示了该模式的工作流:

当一个在Windows Aure中托管的应用程序需要发送电子邮件时,会发生如下情况:

  1.Worker / Web Role 生成一封电子邮件。这个邮件信息生成一个System.Net.Mail.MailMessage的实例。这个邮件对象可以包含任意数量的附件。

  2.电子邮件的对象被序列化,并存储到Blob中。Blob的URL被添加到Queue项目。Queue项目和Blob项目组合,成为了电子邮件的工作项目。您可以使用Queue和Blob项目的元数据存储额外的信息。

  3.在内部局域网里,电子邮件转发服务器不断的监视邮件队列。队列项目可以一次被检索32项。邮件转发服务器首先检索队列,然后提取Blob URL和检索序列化的电子邮件。

  4.一旦反序列化结束,邮件转发服务器使用局域网的邮件服务器信息,发送电子邮件。当发送电子邮件结束后,它会从Queue和Blob Storage中删除该工作项。

  5.局域网内的邮件服务器接收邮件。因为这是一个内部的应用程序,身份验证和授权应该非常直接。

  6.邮件服务器发送电子邮件到相应的用户。

 

为了更好的说明该模式,一个简单的邮件转发服务器和Windows Azure应用的工程文件可供下载。该代码示例包含以下项目:

  • 邮件转发服务:实现了局域网内的邮件转发服务。为了简单的演示,我们实现了一个Windows Form应用。然而在实际部署中,最好在Windows Service中实现该功能。为了测试这个示例服务,请编辑app.config文件,包含SMTP服务器的配置。
  • 实体:类库中包含了邮件信息序列化功能,和从Windows Azure Storage中添加、删除电子邮件的操作。邮件转发服务和Web / Worke Role都使用此项目。
  • 生成电子邮件的Web Role:实现了一个简单的Web Role,可以发送电子邮件。该Role提供了一个Web用户界面,可以让您输入想要发送的电子邮件的细节。
  • 生成电子邮件的Worker Role:实现一个简单的Worker Role,可以发送电子邮件。Worker Role每10秒钟生成和发送邮件信息,具体可以参考该Role下的app.config文件。

 

建构思考:

对于任何解决方案来说,了解架构是非常重要的。在自定义的邮件转发服务器中,我们需要考虑一些问题包含:

  • 成本:对于局域网内的服务来说,存储在Blobs、Queues和数据流中的数据会对整个解决方案增加额外的费用。总成本由每一个单独的解决方案中的邮件数量来决定,必须在实现该模式之前进行考虑。使用压缩是可取的,以减少序列化的电子邮件对象的大小。为了尽量减少带宽成本,使用Blobs和Queue的Windows Azure Storage账户必须和发送邮件的Worker Role/ Web Role 在同一个数据中心里。
  • 性能:性能主要有两点需要考虑:

    1.序列化那些包含巨大附件的邮件对象,可能会带来一些性能的影响。因为这些内容需要被序列化,保存到Storage里,然后被局域网内的邮件转发服务器检索和反序列化。

    2.考虑到这种模式异步的特性,电子邮件转发服务器定期检查Windows Azure Storag Queue。这产生了邮件发送到邮件服务器的边际演示(marginal delay)。这个必须仔细研究,并对不同的需求进行设置。

  • 管理:必须监测服务。我们建议增加记录和实施监控。
  • 可靠性:应该实施采取适当的重试机制(retry mechanisms),包括指数回退(exponential back-off),让电子邮件转发服务器提高可靠性。

 

参考资料:

http://msdn.microsoft.com/zh-tw/windowsazure/gg486877.aspx

 

http://blogs.msdn.com/b/windowsazure/archive/2010/10/08/adoption-program-insights-sending-emails-from-windows-azure-part-1-of-2.aspx

posted on 2012-06-24 22:45 Lei Zhang的博客 阅读(...) 评论(...) 编辑 收藏