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

iteye_20683發表於2009-12-17

出處:天極網 作者:朱先忠編譯 時間:2006-9-25 9:36: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內容。如下圖所示。

0936001.jpg

提示:有關傳送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屬性被應用於這兩個值。

0936003.jpg

四、處理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屬性)。在任何一種情況下,顯示一個客戶端警告框以通知該使用者有關該錯誤的細節資訊。

0936004.gif

五、結論
在本文中,我們瞭解瞭如何傳送HTML格式的電子郵件,使用附件傳送電子郵件,以及優雅地處理在傳送一個電子郵件訊息中發生的異常。傳送一個HTML格式的電子郵件就象在Body屬性中指定HTML內容並且把IsBodyHtml屬性為設定True一樣地簡單。真正的挑戰在於,確保HTML內容能夠在流行的電子郵件客戶端按預期效果生成。為了把一個附件新增到一個電子郵件,只需要簡單地新增一個Attachment物件到MailMessage的附件集合中。附件相應的資料可以來自於web伺服器上的一個檔案或來自於一個流。最後,為了處理SMTP級的異常,你可以新增使用SmtpClient類捕獲SmtpException丟擲的異常處理程式碼。

相關文章