剛剛看到一篇關於在.NET 中發送Email的文章《從asp.net頁面發送電子郵件》看到使用的還是System.Web.Mail命名空間下的類別。我們都知道,在.NET 1.1下大部分都是使用這個命名空間下的類別來發送郵件的,使用SmtpMail的Send靜態方法可以很簡單的發送Email,但由於這個類別調用的是Windows2000版本以上的操作系統的CDO元件來傳送郵件,不管是什麼錯誤都會提示是CDO.Message物件無法存取或其它的CDO.Message異常,我們無法得到很比較詳細的異常訊息,給我們的調試帶來的很大的不便。特別是當我們需要Smtp驗證的話,還要為MailMessage增加三個郵件頭定義,相對來說還是比較麻煩的。那麼在.NET 2.0下,發送Email的功能已經被設計得非常好了,利用System.Net.Mail空間下的類別可以讓我們很簡單地發送各種Email。但為了相容原來的版本,所以System.Web.Mail空間並沒有被刪除,這個空間下的類別也都被打上Obsolete標記了,使用.NET 2.0 類別編譯的話都會提示說,推薦使用System.Web.Mail空間的類別來代替。
下面我們就來看看需要做哪些事才能發送Email的,在這裡我也找到了園子裡一篇關於.NET 2.0發送Email的文章《基於.NET 2.0 System.Net.Mail namespace 的郵件發送組件》,它涵蓋了發送和接收郵件。在本篇裡,我們只討論如何發送的,我感覺它那邊好像沒有真正用好配置文件。還要自己給SmtpClient指定Stmp帳號的一些信息,事實上我們只需要透過web.config(或app.config)配置我們將要使用的Smtp帳號:
< /system.net>
.NET 2.0的設定係統就是強大,我們完全不用去參考任何的資料就可以非常簡單的寫出如上的配置了。如上,from屬性就是你將要從哪個郵箱發送Email,host就是smtp伺服器位址了,password,port,userName就不用多說了,至於defaultCredentials就需要注意了,當我們不需要smtp伺服器驗證發送使用者時,就將它設為false,反過來設為true,目前大多數SMTP伺服器都需要使用者驗證的,所以一般情況下都設為true,讓它使用我們設定好的使用者名稱和密碼去驗證是否是合法使用者。
設定檔寫好了,接一來就是程式如何呼叫了,等我寫出如下的發送Email後,你就感到非常奇怪,真的就這麼簡單嗎?是的,就是這麼簡單,來看看:
MailMessage m_message = new MailMessage();
m_message.From = new MailAddress(" [email protected] ");
m_message.To.Add(new MailAddress(" [email protected] "));
m_message.Subject = "使用.NET 2.0發送郵件";
m_message.Body = "非常簡單";
SmtpClient m_smtpClient = new SmtpClient();
m_smtpClient.Send(m_message);
我們甚至沒有一個多餘的代碼,就是一個多餘的代碼,就是建構一個MailMessage對象,然後建構一個SmtpClient直接就利用它來發送郵件了。比起原來的靜態方法,沒有多一句程式碼。這裡有的朋友可能就要問了?那smtp帳號資訊哪來呢?其實你可以調試一下,這時候m_smtpClient物件裡屬性就是我們前面設定檔配置的值了。在構重一個SmtpClient時,會自動去讀取system.net配置節下的值,如果用戶有配置smtp資訊的話,那麼它將會被自動被始到當前的SmtpClient對象,進而利用它去發送Email。在.NET 2.0中發送郵件就只要做這麼多工作了,而且非常穩定。
總結:雖然在.NET 2.0下,使用System.Web.Mail發送郵件很簡單,在錯誤的時候也可以得到比較詳細的異常信息,但是有時候出現的問題也會讓你摸不著頭腦。最常出現的是,當你的機器有安裝防毒防火牆,有可能會發不出郵件,但是提示訊息卻讓你無法診斷是哪裡出問題了,大意是郵件發送被拒絕。出現這種事況是由於防火牆拒絕了我們對25埠的使用,造成無法與SMTP伺服器正常通訊。解決辦法就是關閉它了,相信網路上已經有很多的案例了。還有一點要特別注意,要發送郵件的機器必須是直接外網的,由於公司是透過代理商上網,所以這個印象特別深。 上面的程式碼還有一點要注意,MailMessage物件的From值必須跟設定檔中From值是一樣的,這裡好像也可以不用設,大家可以試試看。
好了,附上程式碼,希望能對你有幫助http://hjf1223.cnblogs.com/archive/2006/07/06/444716.html