Windows Azure Cloud Service (27) 在Windows Azure发送邮件(上)
《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
轉載于:https://www.cnblogs.com/threestone/archive/2012/06/24/2560448.html
總結
以上是生活随笔為你收集整理的Windows Azure Cloud Service (27) 在Windows Azure发送邮件(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于现在手上做的项目的数据库设计思考
- 下一篇: asp.net ajax控件工具集 Au