Azure : 通過 SendGrid 傳送郵件

sparkdev發表於2017-06-16

SendGrid 是什麼?

SendGrid 是架構在雲端的電子郵件服務,它能提供基於事務的可靠的電子郵件傳遞。並且具有可擴充性和實時分析的能力。常見的用例有:
1. 自動回覆使用者的郵件
2. 定期傳送資訊給使用者
3. 生成報表等

由於使用 SendGrid 這樣的第三方郵件服務既穩定可靠,又不用自己維護郵件伺服器。並且對於郵件傳送量不大的應用,免費傳送的郵件數 (每個月 25000 封)已經可以滿足需求。所以越來越多的應用都開始使用這種郵件服務來傳送郵件。
下面我們從 Azure 上建立 SendGrid 賬號開始,介紹如何通過 SendGrid 傳送郵件。

建立 SendGrid 賬號

登入 Azure 的管理網站,點選 "+" 開始建立 SendGrid 賬號。在搜尋欄中輸入 "SendGrid Email Delivery" 並回車:

選擇 "SendGrid Email Delivery" 進入簡介介面:

在簡介介面中,您可以讀到一些基本的資訊,當然直接點選 "Create" 就可以了!此時進入建立 SendGrid 詳情介面,基本資訊我們就不關注了,看看 Pricing tier 中F1 free 的收費標準吧。這可是貨真價實的每個月 25000 封免費郵件。最後點選 "Create" 完成建立:

SendGrid 賬號建立完成後我們去看一下它的 Configurations 資訊:

在使用 SendGrid 傳送郵件時,需要用到這裡的資訊。首先您會看到使用者名稱已經被處理過了,在訪問 SendGrid 服務時,我們使用的就是這個被處理過的使用者名稱稱。還有下面的 SMTP SERVER,也就是說當我們建立了 SendGrid 賬號後,還可以用傳統的方式通過指定的 smtp 伺服器來傳送郵件。

在C# 專案中使用 SendGrid

假如我們要在一個 asp.net 的應用中通過 SendGrid 傳送郵件。要使用 SendGrid 服務需要先在該專案中安裝 SendGrid 提供的元件。請在 Visual Studio 的 Package Manager Console 中執行下面的命令:

> Install-Package Sendgrid -Version 6.3.4

注意,SendGrid 的API 升級很快,我們這裡使用的是 V2 版本的 API,所以要指定安裝的版本。

傳送測試郵件

萬事俱備,讓我們先傳送一封普通的郵件試試:

// 請使用前面介紹的被 SendGrid 處理過的使用者名稱。
string username = "xxxxx";
string password = "yyyyy";
var credentials = new NetworkCredential(username, password);
var transport = new Web(credentials);

var myMessage = new SendGridMessage();
myMessage.From = new MailAddress("fromaddress");
myMessage.AddTo("toaddress");
myMessage.Subject = "test";
myMessage.Html = "<p>Hello World!</p>";

// 通過非同步方法傳送郵件。
transport.DeliverAsync(myMessage);

程式碼很簡單,不需要解釋。需要注意的是這段程式碼在您本地除錯時是無法傳送郵件的。您需要把您的應用釋出到 Azure的 Web App 或是 Cloud Service 上才能成功的傳送郵件。

傳送帶附件的郵件

您可以使用 SendGridMessage.AddAttachment 方法為您的郵件新增附件。這個方法有兩個過載,分別是指定檔案路徑和檔案流。因為如果您的程式執行在 Azure上,讀取檔案流的用例會多一些。

如果您還需要其它一些功能,請詳細的閱讀 SendGridMessage 型別的 API,它基本上能夠滿足您所有的需求。

已知問題

如果您有一個非常頑固的使用者,他要求您發出的郵件內容必須是純文字的形式 (主要是為了保持手動建立的各種換行和縮排),不能是 HTML 格式的。這會是一個不小的挑戰,因為 SendGrid 預設把郵件內容包成了 HTML 格式。不過我們還是有機會滿足您的客戶,您可以嘗試在每一行文字前面新增一個半形的空格。這是 SendGrid 官方給出的方法,也曾救過筆者一命,但願您不會碰到這樣的客戶!
其實,還有另外一種方式可以實現類似的效果。那就是把所有的文字內容放到 html 的<pre>元素中。程式碼也很簡單:

message.Html = string.Format("<pre>{0}</pre>", System.Web.HttpUtility.HtmlEncode(message.Text));

總結

本文概要的介紹了在 Azure 上的 C# 應用中,如何使用 SendGrid 傳送電子郵件。雖然程式碼不多,但描述了整個操作過程,希望對朋友們有所幫助。

相關文章