剛剛看到一篇關于在.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帳號:
<configuration>
??? <system.net>
??????? <mailSettings>
??????????? <smtp from="hjf1223@tom.com">
??????????????? <network host="smtp.tom.com" password=" " port="25" userName="hjf1223" defaultCredentials="false"/>
??????????? </smtp>
??????? </mailSettings>
??? </system.net>
</configuration>
.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("hjf1223@tom.com");
m_message.To.Add(new MailAddress("hjf1223@gmail.com"));
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值是一樣的,這里好像也可以不用設,大家可以試一下。
好了,附上代碼,希望能對你有所幫助。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>? <head>??????? <title>Test</title>??? <!--??? <link rel="stylesheet" type="text/css" href="styles.css">??? -->? </head>??? <body>??? welcome to ivo? </body></html>