ASP.NET 2.0中傳送電子郵件剖析之一

iteye_20683發表於2009-12-17

出處:天極網 作者:朱先忠編譯 時間:2006-9-25 9:26:00

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


四、通過回饋Web頁面傳送管理員電子郵件
為了說明使用MailMessage和SmtpClient類來實現傳送一個電子郵件,我已經建立了一個簡單的回饋頁面示例。在這個頁面中,使用者被提示輸入其電子郵件地址,他們的回饋主題和相應的回饋內容。

<table border="0">
<tr>
<td>
<b>Your Email:</b>
</td>
<td>
<asp:TextBox runat="server" ID="UsersEmail" Columns="30"></asp:TextBox>
</td>
</tr>
<tr>
<td>
<b>Subject:</b>
</td>
<td>
<asp:TextBox runat="server" ID="Subject" Columns="30">
</asp:TextBox>
</td>
</tr>
<tr>
<td colspan="2">
<b>Body:</b> <br />
<asp:TextBox runat="server" ID="Body" TextMode="MultiLine" Columns="55" Rows="10">
</asp:TextBox>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<asp:Button runat="server" ID="SendEmail" Text="Send Feedback" />
</td>
</tr>
</table>

0926001.gif

一旦使用者提供了回饋訊息並且點選了"Send Feedback"按鈕,即發生一個回寄並且該按鈕的Click事件激發。在該事件處理器內,一個MailMessage物件被建立,並且它的To,From,Subject和Body屬性都根據使用者提供的訊息加以設定。在建立MailMessage物件並且填充它的屬性後,該電子郵件被通過SmtpClient類的Send方法傳送出去。

Protected Sub SendEmail_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SendEmail.Click
'!!!把這個值更新為你的電子郵件地址
Const ToAddress As String = "you@youremail.com"
'(1)建立MailMessage例項
Dim mm As New MailMessage(UsersEmail.Text, ToAddress)
'(2)屬性MailMessage賦值
mm.Subject = Subject.Text
mm.Body = Body.Text
mm.IsBodyHtml = False
'(3)建立SmtpClient物件
Dim smtp As New SmtpClient
'(4)傳送MailMessage(將使用Web.config設定)
smtp.Send(mm)
End Sub

在這裡的程式碼中,我們不需要設定SmtpClient類的任何屬性,因為它們已經在Web.config檔案中指定了(請參考本文下載原始碼)。

0926002.gif

五、結論
通過進一步結合來自於ASP.NET 1.x的其它改進功能,ASP.NET 2.0中的電子郵件傳送能力被進一步更新並且移動到一個新的名稱空間-System.Net.Mail。在ASP.NET 2.0中,中繼伺服器設定能夠容易地脫離ASP.NET程式碼,而移動到Web.config檔案中,正如我們在這個示例所看到的。而且,還有對中繼伺服器認證更好的支援。在下篇文章中,我們將探討更高階電子郵件使用情況,例如構造HTML格式的電子郵件,傳送附件,把物件嵌入到電子郵件內,處理與SMTP/中繼伺服器相關的異常,等等。

相關文章