Asp.net 2.0 发送电子邮件
在網上收集的資料,和一點自己的心得
資料1
最基本的小例子,幫助上的例子看著可真夠亂的:
????private?void?SendMail()????{
????????MailMessage?message?=?new?MailMessage("發件人電子郵件地址",?"收件人電子郵件地址");
????????message.Subject?=?"郵件標題";
????????message.Body?=?"郵件內容";
????????message.SubjectEncoding?=?Encoding.GetEncoding("gb2312");
????????message.BodyEncoding?=?Encoding.GetEncoding("gb2312");
????????message.IsBodyHtml?=?true;
????????message.Priority?=?MailPriority.Normal;
????????SmtpClient?clint?=?new?SmtpClient("郵件服務器名");
????????clint.UseDefaultCredentials?=?false;
????????clint.Credentials?=?new?System.Net.NetworkCredential("郵件用戶名",?"登錄密碼");
????????clint.DeliveryMethod?=?SmtpDeliveryMethod.Network;
????????clint.Send(message);
????????message.Dispose();
????}
代碼雖然簡單,也能正常運行,但也產生了一些疑問,主要是SmtpClient的參數。我用公司的服務器、用戶名和密碼能正確的發送郵件(我測試了發給自己和發給163郵箱),但使用163的郵件服務器(smtp.163.com)、用戶名和密碼時,總是提示服務器拒絕發件人,但我用這套用戶名密碼可以通過mail.163.com登錄。懷疑163做了什么設置,不讓代碼調用它的郵件服務。
?
資料2
剛剛看到一篇關于在.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.Net.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="*@*.com">
????????????????<network host="smtp.tom.com" password=" " port="25" userName="*" 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("*@*.com");
m_message.To.Add(new MailAddress("*@*.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值是一樣的,這里好像也可以不用設,大家可以試一下。
?
心得
通過外部服務器發送郵件比較有難度,首先不清楚別人的郵件服務器如何設置,另外第3芳郵件服務器的安全設置會阻礙郵件的發送。所以最快最方便的方法就是用自己的服務器的IIS里的SMTP服務器來發送。
打開IIS后,進入默認SMTP服務器的屬性項,由于只發送郵件,因此,其他設置可以用默認,最后的安全設置里,把ASPNET用戶加進去,不然.NET 不沒有權限發送郵件。OK,完成,最后在程序里SmtpClient對象的郵件服務器屬性里設置郵件服務的域的名稱就可以了,端口默認是25,可以不用設置,并且可以不用設置用戶名和密碼了。
?
轉載于:https://www.cnblogs.com/ZetaChow/archive/2007/05/11/2237383.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Asp.net 2.0 发送电子邮件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinXP中鲜为人知的28项隐藏功能
- 下一篇: JMeter 进行压力测试