可怕的ASP.NET邮件组件

这两天在研究ASP.NET的用户登录控件,在用PasswordRecovery这个控件时遇到了麻烦,就是邮件发不出去,也收不到。

我用过gmail,qq,126,sohu进行过测试。

按照MSDN的说法,先老老实实地在webconfig中配置了邮件发送要用的一些必须信息:

Code

 

上面的代码一看就知道是怎么回事了,就是指定一个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

 

以上代码可以实现邮件发送,我同样对上面的四种邮箱进行测试,只有搜狐的邮箱可以拿来发送邮件,gmail和QQ邮箱都能够收到。

到了这里我就很纳闷了,为什么同样使用搜狐的邮箱,PasswordRecovery控件却发不出去,我真想看看它的源码是怎么写的,居然狗日的发不出去……

既然这样,将PasswordRecovery控件的邮件发送的那块代码换成自己写的代码不就行了?

确实如此。

新建一个类库,继承PasswordRecovery,重载它的OnSendingMail函数,写上自己的代码。

Code

 

OK!

经实验,邮件确实可以发送了,我也能收到。

但是……

其中存在着一个非常可怕的缺陷,就是非常的不稳定,有时候能发成功,有时候却报错,两者比例大概2:1……

这样的邮件发送系统也太不可靠了吧……人家要做一个密码取回的操作,要填安全提问等单子好几遍,用户会怎么想?

于是我就考虑用本地机子做为SMTP服务器,这样是否会好一点?

实验证明,

it gets worse……

发送的过程中没报任何错误,但我用gmail,qq,126邮箱进行接受测试,只有gmail才能收到邮件,发给qq的邮件全被扔在本地的badmail文件夹里,而给126的则是宛如泥牛入海杳无音信……

太可怕了……

现在我对微软的mail组件有点绝望了,正在下JMAIL,如果比微软的好用的话,下半辈子的幸福就靠它了……

 

posted on 2009-02-26 20:07  lolicon  阅读(4749)  评论(13编辑  收藏  举报