smtp
1.引言
下周,需要做一个发送电子邮件的模块,磨刀不误砍柴工,周末在家里先做了一下测试,微软在,net1.1中有System.Web.Mail空间,这个命名空间下可以发送不带smtp验证的电子邮件,不过现在网络上很少再有不需要smtp验证的,所以这个命名空间下的类应该算是比较鸡肋。 于是找到opensmtp.net这个开源项目,这个项目的admin是园子里面的"我得女儿好漂亮",真诚感谢一下。
2.本文宗旨
本文并不是介绍openmail.net的使用方法,该开源项目是一个非常正规的项目,它自己具有详细的文档和使用方法。本文主要阐述再使用OpenMail或者.net 2.0里面的SmtpClient的时候可能遇到的问题,这个问题跟你的运行环境有关系,如果你恰巧遇到这样问题的时候,网上相关资料也比较少。我在下面就描述一下我遇到的问题以及归纳出来的解决办法
3、在使用OpenMail或者SmtpClient中可能遇到的问题
1)在发送电子邮件的时候,提示“您主机中的软件放弃已经建立的连接”
这个是我遇到的最为头疼的问题,因为他昨天晚上调到12点,搞的我差点没疯掉。起初,我知道一定是防火墙引起的问题,但是我把本地Windows XP内置防火墙关闭之后,问题依旧。但是无论我是否关闭防火墙,outlook都能正常接收和发送电子邮件,我用的是smtp.126.com,我直接telnet smtp.126.com 25或者在软件中TcpClient client = new TcpClient("smtp.126.com",25);都提示无法连接。而outlook却能发送邮件,我netstat -n ,本机与smtp.126.com 25端口的tcp连接在outlook发送电子邮件的时候也建立了,但为什么outlook能建立连接,我的软件或者telnet为何不能?如何能让我的软件和telnet能连接smtp 服务器的25端口?
2)第一个问题着实让我浪费了很多时间,而且浪费了n多脑细胞,不过还好终于解决了,第二个问题是在发送电子邮件的时候,邮件的正文产生乱麻的问题,这个问题我看网上有人在问,不过很好解决。
4.解决问题的步骤和方法,以及经验教训
1)对于第一个问题,我的确犯了一个方向性的错误,那就是我关闭了本机防火墙之后,我错误的认为导致我不能正常连接smtp服务器的原因在于smtp服务端的防火墙,而且我本地outlook能正常发送邮件极大的误导了我的思路,我错误的任务,outlook能发送,那么表示数据一定能从我本地出去。错误只能出现在服务端,我猜想可能outlook有特殊的技术能穿透smtp服务器的防火墙,但是我查阅了穿透防火墙的技术,如果要防火墙,一般的做法是HttpChannel,其实http请求本身不能穿透防火墙,但是一般防火墙不阻止对80端口的连接,smtp.126.com的80端口确也是关闭的。这样的思路导致我在错误的方向用了很多功。
今天早晨起来,我决定换个思路看看,我把本地防火墙关掉,还是不行,后来我看到了我的macfee,是不是这厮搞得鬼那,我打开virtusScan Console,o,my god,里面的确有一项On-Delivery E-Mail Scanner ,我关闭它,发现还是不行,我有点失望了,不过还不甘心,再找,终于又发现了,在Access Protection里面,有一个ports to block,里面有25端口,日志文件保存在"AccessProtectionLog.txt",打开文件后有许多失败记录,去掉25端口阻塞,禁止On-Delivery E-Mail Scanner ,问题解决
2) 对于第二个问题,只需要更改编码就可以了,在openmail.net里面设置MailMessage.CharSet,如果在中国,设置"gb2312"一般可以解决这个问题
5.结论
经过两天的调试和思考,解决的不是一个很大的问题,但是我也从中获得了一个教训,思考问题,一定要灵活,不要太过于固定化,比如我错误的认为是对方防火墙的问题,而且这种思路被我错位的坚持了很久,其实在我们不能很好的解决一个问题的时候,与其费劲脑筋,不如反过来想想。