一、簡介
如今,電子郵件已經成為一種無所不在、非同步通知和分布式的訊息系統。存在許多web開發場所;其中,伺服器端代碼都需要產生一個電子郵件並且把它發送給指定的接收者。該電子郵件可以被發送給網點中的一些使用者,通知他們有關於他們的建立使用者帳戶,提醒他們忘記的口令,或以郵件形式提交給他們一個清單。當然,這也可以是針對web開發人員或網站管理員,提供給他們有關一個剛剛公開的未處理的異常或使用者回饋的訊息。
幸好,ASP.NET使得寄送電子郵件非常輕鬆。.NET架構版本1.x在System.Web.Mail類中包括了許多類,它們允許以編程方式通過短短的幾行代碼來發送一個電子郵件。儘管這個命名空間和這些類仍然存在於.NET架構2.0版本中,但是它們已經過時,你可以在System.Net.Mail命名空間中找到新的與郵件支援相關的類。
在本文中,讓我們來一起探討System.Net.Mail命名空間中的相關類,並且分析如何從一個ASP.NET 2.0頁面的code-behind類中發送一個電子郵件。我們還要在Web.config中指定轉送伺服器訊息以及如何把這個訊息應用於一些內建ASP.NET伺服器控制項中以便實現寄送電子郵件(例如當一個使用者建立一個帳戶或需要一個口令提示器/重設器時)。
二、探討System.Net.Mail命名空間中的類
在System.Net.Mail命名空間中共有16個不同的類,它們都與把電子郵件發送到一個指定的簡單的郵件傳輸協議(SMTP)伺服器以便進一步提交有關。在這個命名空間中有兩個核心類是:
· MailMessage:描述一個電子郵件訊息;它擁有From,To,Subject,Body等屬性;
· SmtpClient:把一個指定的MailMessage執行個體發送到一個指定的SMTP伺服器。
典型地,當你從一個ASP.NET 2.0頁面中寄送電子郵件時,你要:
1. 建立一個MailMessage對象;
2. 賦給它屬性;
3. 建立一個SmtpClient類執行個體;
4. 指定關於使用該SMTP伺服器的細節(如果它們沒有在Web.config中指定);
5. 經由SmtpClient對象的Send方法發送該MailMessage。
其中,上面的第1步和第2步可以被略過,因為SmtpClient類的Send方法能夠接收一個MailMessage對象或接收四個字串(分別描述電子郵件訊息內容的from,to,subject和body部分)。
System.Net.Mail命名空間中的其它類還提供了更進階的電子郵件功能。例如,這些類能夠用於在一個電子郵件訊息中添加附件,把對象嵌入到一個電子郵件,指定SMTP伺服器認證訊息等;還有一些Exception的衍生類別用於處理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,等等),你可以在寄送電子郵件時以編程方式設定它們。