这两天在研究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,如果比微软的好用的话,下半辈子的幸福就靠它了……
来源:https://www.cnblogs.com/lolicon/archive/2009/02/26/1399050.html