可怕的ASP.NET郵件元件

iDotNetSpace發表於2009-02-27

這兩天在研究ASP.NET的使用者登入控制元件,在用PasswordRecovery這個控制元件時遇到了麻煩,就是郵件發不出去,也收不到。

我用過gmail,qq,126,sohu進行過測試。

按照MSDN的說法,先老老實實地在webconfig中配置了郵件傳送要用的一些必須資訊:

Code
   
       
            testforms@sohu.com">
                testforms@sohu.com"/>
           

       

   

 

上面的程式碼一看就知道是怎麼回事了,就是指定一個SMTP伺服器,然後給它一個賬號,可以用這個賬號來傳送郵件。

其中的defaultCredentials屬性需要注意,根據SMTP伺服器的不同,它可能是false,也可能是true。

搞定webconfig後,我便進行測試。

使用GMAIL作為傳送郵箱時,程式報錯是這樣的:

SMTP 伺服器要求安全連線或客戶端未通過身份驗證。 伺服器響應為: 5.7.0 Must issue a STARTTLS command first. d4sm305328tib.28

宣告一下,我所用來測試的郵箱都是可用的。

使用QQ郵箱時:

命令順序不正確。 伺服器響應為: Error: need EHLO and AUTH first !

使用126郵箱時:

郵箱不可用。 伺服器響應為: Óû§±»Ëø¶¨
(據說06年前註冊的126郵箱可以傳送,但由於我沒那種賬號,故也無法驗證真偽……)

使用搜狐郵箱時:

事務失敗。 伺服器響應為: 5.7.1 <chenru0576@gmail.com>: Relay access denied

(這個提示貌似不是搜狐SMTP的問題,而是說被要收的伺服器拒絕,chenru0576@gmail.com是我拿來接收的郵箱)

 

以上是我測試PasswordRecovery的結果,我沒寫一句程式碼,傳送郵件全是讓這個控制元件自己完成。

郵件傳送失敗率100%

然後我自己手寫程式碼,就是用System.Net.Mail.MailMessage與SmtpClient類進行傳送。

Code
        MailMessage message = new MailMessage();
        message.From = new MailAddress("testforms@sohu.com");
        message.To.Add("chenru0576@gmail.com");
       
        message.Subject = "test";
        message.Body = "tttstest";
    
        SmtpClient smtp = new SmtpClient("smtp.sohu.com");
        smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
        smtp.Credentials = new NetworkCredential("testforms@sohu.com", "123456");
        smtp.Send(message);
 

以上程式碼可以實現郵件傳送,我同樣對上面的四種郵箱進行測試,只有搜狐的郵箱可以拿來傳送郵件,gmail和QQ郵箱都能夠收到。

到了這裡我就很納悶了,為什麼同樣使用搜狐的郵箱,PasswordRecovery控制元件卻發不出去,我真想看看它的原始碼是怎麼寫的,居然狗日的發不出去……

既然這樣,將PasswordRecovery控制元件的郵件傳送的那塊程式碼換成自己寫的程式碼不就行了?

確實如此。

新建一個類庫,繼承PasswordRecovery,過載它的OnSendingMail函式,寫上自己的程式碼。

Code
    public class MyPswRecovery : PasswordRecovery
    {
       
        protected override void OnSendingMail(MailMessageEventArgs e)
        {
            e.Cancel = true;
            SmtpClient smtp = new SmtpClient("smtp.sohu.com");
           
            smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtp.Credentials = new NetworkCredential("testforms@sohu.com", "123456");

            smtp.Send(e.Message);
        }
    }
 

OK!

經實驗,郵件確實可以傳送了,我也能收到。

但是……

其中存在著一個非常可怕的缺陷,就是非常的不穩定,有時候能發成功,有時候卻報錯,兩者比例大概2:1……

這樣的郵件傳送系統也太不可靠了吧……人家要做一個密碼取回的操作,要填安全提問等單子好幾遍,使用者會怎麼想?

於是我就考慮用本地機子做為SMTP伺服器,這樣是否會好一點?

實驗證明,

it gets worse……

傳送的過程中沒報任何錯誤,但我用gmail,qq,126郵箱進行接受測試,只有gmail才能收到郵件,發給qq的郵件全被扔在本地的badmail資料夾裡,而給126的則是宛如泥牛入海杳無音信……

太可怕了……

現在我對微軟的mail元件有點絕望了,正在下JMAIL,如果比微軟的好用的話,下半輩子的幸福就靠它了……

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-558065/,如需轉載,請註明出處,否則將追究法律責任。

相關文章