ASP.NET 2.0中發送電子郵件剖析

 

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

2006-09-23 07:00 作者: 朱先忠編譯 出處: 天極開發 責任編輯:方舟

本文關鍵詞: ASP.NET 發送 電子郵件

一、簡介

  如今,電子郵件已經成爲一種無所不在、異步通知和分佈式的消息系統。存在許多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>


  一旦用戶提供了回饋消息並且點擊了"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 = "[email protected]"
 '(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文件中指定了(請參考本文下載源碼)。


  五、結論

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

ASP.NET 2.0發送電子郵件全面剖析之二

2006-09-24 08:00 作者: 朱先忠編譯 出處: 天極開發 責任編輯:方舟

  一、簡介

  在上篇中我們詳細分析過,.NET框架2.0版本提供了一個新的命名空間(System.Net.Mail)和一些發送電子郵件的新類(注意:.NET框架1.x版本中提供的命名空間System.Web.Mail及相關的類仍然可以使用,以實現向後兼容性)。而且,我們還詳細分析過如何使用System.Net.Mail命名空間中的MailMessage和SmtpClient類來發送簡單的普通文本格式的電子郵件消息。

  本篇將討論與電子郵件相關的更高級的選項。我們要分析如何發送HTML格式的電子郵件,如何包括附件,以及當發送一個電子郵件時如何優雅地處理SMTP異常(例如無效的中繼服務器憑證或如果該中繼服務器處於離線狀態)。

  本文假定你已經熟悉從一個ASP.NET 2.0 web頁面發送簡單的普通文本電子郵件;否則的話,請首先閱讀本系列文章中的上篇。

  二、發送HTML格式的電子郵件

  在ASP.NET 2.0中發送電子郵件時,我們已經看到如何發送普通文本電子郵件,這是通過把電子郵件內容賦給MailMessage類的Body屬性實現的。其實,爲了發送HTM格式的電子郵件,我們只要簡單地把Body屬性設置爲要發送的HTML內容,然後把MailMessage類的IsBodyHtml屬性設置爲True即可。

  爲了演示如何發送一個HTML格式的消息,我創建了一個示例,其名字爲HtmlEmail.aspx。代碼如下:

'(1)創建MailMessage實例
Dim mm As New MailMessage(FromEmailAddress, ToEmailAddress)
'(2)賦值MailMessage的屬性
mm.Subject = "HTML-Formatted Email Demo Using the IsBodyHtml Property"
mm.Body = "<h2>This is an HTML-Formatted Email Send Using the <code>IsBodyHtml</code> Property</h2><p>Isn't HTML <em>neat</em>?</p><p>You can make all sorts of <span style=""color:red;font-weight:bold;"">pretty colors!!</span>.</p>"
mm.IsBodyHtml = True
'(3) 創建SmtpClient對象
Dim smtp As New SmtpClient
'(4)發送MailMessage (將使用Web.config設置)
smtp.Send(mm)

  如你所見,簡單地把Body屬性設置爲要發送的HTML內容,並且把IsBodyHtml屬性設置爲True。至此,所有這些你已經完成!被髮送到中繼服務器的實際電子郵件內容(並且最後要到達接收者的電子郵件客戶端)看上去如下所示:

x-sender: ToEmailAddress
x-receiver: FromEmailAddress
mime-version: 1.0
from: FromEmailAddress
to: ToEmailAddress
date: 25 Jul 2006 15:06:44 -0700
subject: HTML-Formatted Email Demo Using the IsBodyHtml Property
content-type: text/html; charset=us-ascii
content-transfer-encoding: quoted-printable
<h2>This is an HTML-Formatted Email Send Using the <code>IsBodyHtml</code>=
Property</h2><p>Isn't HTML <em>neat</em>?</p><p>You can make all sorts=
of <span style=3D"color:red;font-weight:bold;">pretty colors!!</span>.</p>

  提示:觀察發送到中繼服務器的電子郵件內容

  觀察通過SmtpClient類發送到中繼服務器的實際電子郵件內容是很有趣的(如上面這樣),對不對?在上篇中,我們討論瞭如何配置SmtpClient類以把電子郵件發送到一箇中繼服務器或者把它投入到一個指定的目錄下。使用第二個選擇時,我們能夠探討實際的電子郵件內容。你可以檢查本文下載代碼中的Web.config文件。其中,有一個加了註釋的<smtp>元素,它展示瞭如何配置該SmtpClient類以便把電子郵件的內容複製到一個指定的目錄。

  該電子郵件客戶端(假定它支持HTML格式的電子郵件)將在電子郵件內顯示該HTML內容。如下圖所示。


  提示:有關發送HTML格式的電子郵件的說明

  當發送HTML格式的電子郵件時,必須理解你在你的屏幕看到的HTML可能與你的接收者所看到的相當不同。大多數的電子郵件客戶端都會"剔除"潛在危險的HTML內容(例如ActiveX控件等),許多用戶都阻止JavaScript運行。
 
三、包括附件

  MailMessage類有一個Attachments屬性,它是一個Attachment類實例的集合。你能夠把web服務器上的一個現有文件附加到電子郵件消息,或使附件的內容基於一個流(Stream)。爲了展示使用附件發送電子郵件,我創建了一個演示程序,其中訪問者能夠填充一個回饋形式的表單以便把一個電子郵件發送到管理員。然而,這個回饋表單允許訪問者從他們的計算機中選擇一個文件以便依附到從該web頁面發送的電子郵件中(這很象基於Web的電子郵件程序,如Hotmail,GMail,等等。當發送一個電子郵件時,它們允許你附加一個你的計算機中的文件)。

  爲了允許訪問者從他們的計算機中附加一個文件,我們需要允許該用戶把他們的計算機中的一個文件上載到web服務器。這可以使用FileUpload控件(這是ASP.NET2.0新添加的)來容易地實現。讓我們來看一下這個演示程序中用於創建用戶接口的聲明性語法:

<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>File to Send:</b></td>
<td>
<asp:FileUpload ID="AttachmentFile" runat="server" />
</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>

  這個FileUpload控件生成一個<input type="file" ... />HTML元素,它在瀏覽器中被顯示爲帶有一個Browse按鈕的一個文本框。當被點擊時,一個對話框打開以便用戶能夠從他們的計算機中選擇一個文件。

點擊放大此圖片

  在填滿回饋表單後,選擇一個要上傳的文件,並且點擊"Send Feedback"按鈕,則發生一個回寄,最後把選擇文件的內容發送到web服務器。在"Send Feedback"按鈕的點擊事件處理器中,創建一個MailMessage對象,並且添加一個附件。由於該FileUpload提供一個到上傳數據的Stream,所以,我們可以簡單地指向在這個Stream中的新的Attachment對象。我們不需要把上傳文件保存到web服務器的文件系統。

'確保已經上傳一個文件
If String.IsNullOrEmpty(AttachmentFile.FileName) OrElse AttachmentFile.PostedFile Is Nothing Then
 Throw New ApplicationException("Egad, a file wasn't uploaded... you should probably use more graceful error handling than this, though...")
End If
'(1) 創建MailMessage實例
Dim mm As New MailMessage(FromEmailAddress, ToEmailAddress)
'(2)賦值MailMessage的屬性
mm.Subject = "Emailing an Uploaded File as an Attachment Demo"
mm.Body = Body.Text
mm.IsBodyHtml = False
'附加文件
mm.Attachments.Add(New Attachment(AttachmentFile.PostedFile.InputStream, AttachmentFile.FileName))
'(3) 創建SmtpClient對象
Dim smtp As New SmtpClient
'(4)發送MailMessage (將使用Web.config設置)
smtp.Send(mm)

  在上面的代碼示例中重載的Attachment構造器使用兩個輸入:一個對Stream(它包含要附加的數據)的引用,以及要使用的附件名字。該FileUpload的FileName和FileName屬性被應用於這兩個值。

四、處理SMTP異常

  當從一個ASP.NET頁面發送電子郵件時,如果中繼服務器關閉會發生什麼?如果認證信息使用無效,又會怎麼樣呢?在出現一個SMTP錯誤時,SmtpClient類將拋出一個SmtpException異常。爲了較好地處理這樣的問題,我們可以在發送電子郵件的代碼中加入異常處理代碼。如果出現一個SmtpException,則我們能夠顯示一個更友好的信息性的錯誤提示。

  在本文的下載內容中,我包括了一個演示,它允許訪問者指定要使用的中繼服務器以及認證信息。如果在試圖發送一封電子郵件時存在一個錯誤,那麼將顯示一個客戶端警告框,解釋該問題。爲了測試這一點,對於一個需要認證的中繼服務器,你可以輸入一個無效的中繼服務器主機名或無效的憑證。

Try
 '(1)創建MailMessage實例
 Dim mm As New MailMessage(FromEmailAddress, ToEmailAddress)
 '(2)賦值MailMessage的屬性
 mm.Subject = "Test Email... DO NOT PANIC!!!1!!!111!!"
 mm.Body = "This is a test message..."
 mm.IsBodyHtml = False
 '(3)創建SmtpClient對象
 Dim smtp As New SmtpClient
 'SMTP設置...
 smtp.Host = Hostname.Text
 If Not String.IsNullOrEmpty(Port.Text) Then
  smtp.Port = Convert.ToInt32(Port.Text)
 End If
 If Not String.IsNullOrEmpty(Username.Text) Then
  smtp.Credentials = New NetworkCredential(Username.Text, Password.Text)
 End If
 '(4)發送MailMessage(將使用Web.config設置)
 smtp.Send(mm)
 '顯示一個客戶端彈出窗口,解釋該該郵件已經發出
 ClientScript.RegisterStartupScript(Me.GetType(), "HiMom!", String.Format("alert('An test email has successfully been sent to {0}');", ToAddress.Replace("'", "/'")), True)
 Catch smtpEx As SmtpException
  '當發送電子郵件消息時發生了一個問題
  ClientScript.RegisterStartupScript(Me.GetType(), "OhCrap", String.Format("alert('There was a problem in sending the email: {0}');", smtpEx.Message.Replace("'", "/'")), True)
 Catch generalEx As Exception
  '發生另外的一些問題
  ClientScript.RegisterStartupScript(Me.GetType(), "OhCrap", String.Format("alert('There was a general problem: {0}');", generalEx.Message.Replace("'", "/'")), True)
End Try

  這段代碼捕獲SMTP特定的錯誤消息和普通的異常(例如把無效電子郵件地址賦值給MailMessage對象的To或From屬性)。在任何一種情況下,顯示一個客戶端警告框以通知該用戶有關該錯誤的細節信息。


  五、結論

  在本文中,我們瞭解瞭如何發送HTML格式的電子郵件,使用附件發送電子郵件,以及優雅地處理在發送一個電子郵件消息中發生的異常。發送一個HTML格式的電子郵件就象在Body屬性中指定HTML內容並且把IsBodyHtml屬性爲設置True一樣地簡單。真正的挑戰在於,確保HTML內容能夠在流行的電子郵件客戶端按預期效果生成。爲了把一個附件添加到一個電子郵件,只需要簡單地添加一個Attachment對象到MailMessage的附件集合中。附件相應的數據可以來自於web服務器上的一個文件或來自於一個流。最後,爲了處理SMTP級的異常,你可以添加使用SmtpClient類捕獲SmtpException拋出的異常處理代碼。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章