ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 可怕的ASP.NET邮件组件

可怕的ASP.NET邮件组件

原创 Linux操作系统 作者:iDotNetSpace 时间:2009-02-27 13:15:13 0 删除 编辑

这两天在研究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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5315877