現今,電子郵件已成為無所不在、非同步通知與分散式訊息系統。許多 Web 開發場合中,伺服器端程式碼都需要產生電子郵件並發送給指定收件者。這些郵件可能通知用戶新建帳戶、提醒遺忘密碼、以郵件形式提交清單,或針對開發人員與網站管理員,提供未處理的例外狀況或用戶回饋訊息。
所幸,ASP.NET 讓發送電子郵件變得非常輕鬆。.NET Framework 1.x 在 System.Web.Mail 類別中包含許多類別,允許以程式設計方式透過幾行程式碼發送郵件。雖然這個命名空間和類別在 .NET Framework 2.0 中仍存在,但已標記為過時,新的郵件支援相關類別位於 System.Net.Mail 命名空間中。
本文將探討 System.Net.Mail 命名空間中的相關類別,分析如何從 ASP.NET 2.0 頁面的 code-behind 類別中發送電子郵件。我們還將說明如何在 Web.config 中指定中繼伺服器訊息,並套用至內建 ASP.NET 伺服器控制項以實現發送郵件(例如用戶建立帳戶或需要密碼提示/重設時)。
System.Net.Mail 命名空間共有 16 個不同類別,都與將電子郵件發送到指定的簡單郵件傳輸協定 (SMTP) 伺服器以便進一步提交有關。其中兩個核心類別為:
通常從 ASP.NET 2.0 頁面發送電子郵件的步驟:
其中,步驟 1 和 2 可省略,因為 SmtpClient 類別的 Send 方法能接收 MailMessage 物件,或接收四個字串(分別描述郵件內容的 from、to、subject 和 body 部分)。
System.Net.Mail 命名空間中的其他類別提供更高階的電子郵件功能,例如:在郵件中加入附件、嵌入物件、指定 SMTP 伺服器認證資訊等;還有處理 SMTP 特定例外的衍生類別。我們將在後續文章討論這些進階用法。
當從 Outlook 或 Gmail 發送郵件給朋友時,郵件程式使用中繼伺服器建立連線並發送郵件內容(連同其他資訊,如郵件建立日期、格式(文字或 HTML)、收件者等)。中繼伺服器接收訊息,再連線到收件者的 SMTP 伺服器並發送訊息。一旦提交,收件者即可(稍後)使用不同協定(如 IMAP 或 POP3)提取訊息。
因此,為了從 ASP.NET 頁面發送郵件,我們需提供 SmtpClient 類別關於中繼伺服器的資訊。透過中繼伺服器主機名,可指定:對應的連接埠號碼(通常用連接埠 25)、連線到中繼伺服器時是否使用 SSL、以及認證憑證(如必要)。或者,若你可在 Web 伺服器上安裝本地 SMTP 服務,它可定期監視特定的「drop-off」目錄,發送出現在該目錄中的任何訊息。你可配置 SmtpClient 類別是將郵件傳送給單一中繼伺服器,或透過 DeliveryMethod 屬性將郵件投入指定的檢出目錄。
SmtpClient 類別使用的中繼伺服器資訊,可透過 SmtpClient 類別屬性以程式設計方式指定,也可集中在 Web.config 檔案中。若要使用 Web.config 方式,可在 <configuration> 元素內加入 <system.net> 元素,再加入包含 <smtp> 元素(其設定在 <network> 子元素中指定)的 <mailSettings> 元素。程式碼如下:
<configuration>
<!-- 將電子郵件設定加入 <system.net> 元素 -->
<system.net>
<mailSettings>
<smtp>
<network host="relayServerHostname" port="portNumber" userName="username" password="password" />
</smtp>
</mailSettings>
</system.net>
<system.web> ... </system.web>
</configuration>
其中 host 屬性包含 relayServerHostname。若使用外部中繼伺服器,relayServerHostname 可能類似 smtp.yourisp.com。若中繼伺服器連接埠非預設的 25,可透過 port 屬性指定。大多數外部中繼伺服器要求某種認證(防止匿名垃圾郵件透過中繼發送垃圾信),需提供 userName 和 password 屬性。
只有 SmtpClient 屬性的子集能透過 Web.config 設定指定。若要自訂其他 SmtpClient 屬性(如 EnableSsl、Timeout 等),可在發送郵件時以程式設計方式設定。