一、簡介
如今,電子郵件已經成為一種無所不在、異步通知和分布式的消息系統。存在許多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,等等),你可以在發送電子郵件時以編程方式設置它們。