利用OpenSmtp.Net发送需要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.结论
   经过两天的调试和思考,解决的不是一个很大的问题,但是我也从中获得了一个教训,思考问题,一定要灵活,不要太过于固定化,比如我错误的认为是对方防火墙的问题,而且这种思路被我错位的坚持了很久,其实在我们不能很好的解决一个问题的时候,与其费劲脑筋,不如反过来想想。
附:openmail.dll/Files/jillzhang/OpenSmtp.rar
        Telnet到端口25以测试SMTP通信

作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2007-01-21 11:42 Robin Zhang 阅读(3205) 评论(13)  编辑 收藏 网摘 所属分类: asp.net

  回复  引用  查看    
#1楼2007-01-21 14:31 | xuanfeng      
如果,你本机就是SMTP服务器,可以用登陆的系统的帐户来认证了,不就可以省了吗?
  回复  引用  查看    
#2楼2007-01-21 15:31 | Jeffrey Zhao      
不要使用System.Web.Mail里的类,现在尽量使用System.Net.Mail里的类。
  回复  引用  查看    
#3楼2007-01-21 16:01 | deerchao      
DotNetOpenMail也还不错,LumiSoft.Net(http://www.lumisoft.ee/lsWWW/download/downloads/">http://www.lumisoft.ee/lsWWW/download/downloads/)里有POP3_Client,可以用来接收邮件。
  回复  引用  查看    
#4楼2007-01-21 18:22 | bogey      
OpenSmtp.Net 我前阵子也用过,感觉是不错
我没有出现楼主所说的问题,不过存在一个问题,如果邮件标题太长,接收时显示会一堆Unicode的编乱,信内容也是,也没细查是什么原因,解决是暂时限定邮件标题长度~

  回复  引用  查看    
#5楼2007-01-21 19:21 | 一味      
SmtpClient smtp = new SmtpClient();
smtp.Host = SmtpServer;
smtp.Port = 25;
smtp.UseDefaultCredentials = false;
smtp.Credentials = new System.Net.NetworkCredential(UserName,Password);
.....

这样就可以了,测试163邮箱成功。

  回复  引用  查看    
#6楼[楼主]2007-01-21 20:55 | jillzhang      
@一味
正常情况下都是这样的代码,这个我也知道,不过如果有杀软的话,我的卖咖啡,就不行了

  回复  引用    
#7楼2007-01-22 08:08 | nk912114[未注册用户]
@jillzhang
McAfee默认是把25端口给禁止了,一味那代码当然是发送不成功了

  回复  引用  查看    
#8楼2007-01-22 13:55 | 浪子      
2.0里面可以发送带验证的mail,只不过需要在Web.config里面配置一下而已
http://www.cnblogs.com/hjf1223/archive/2006/07/06/444716.html">http://www.cnblogs.com/hjf1223/archive/2006/07/06/444716.html

  回复  引用    
#9楼2007-01-22 14:52 | 小春[匿名][未注册用户]
这个命名空间下可以发送不带smtp验证的电子邮件,不过现在网络上很少再有不需要smtp验证的,所以这个命名空间下的类应该算是比较鸡肋

1.1的MAILMESSAGE可以验证的
Dim mailobj As New MailMessage
mailobj.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1") 'basic authentication
mailobj.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "xxx@gmail.com") 'set your username here
mailobj.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "*****") 'set your password here

2.0已经有带类
http://www.cnblogs.com/cnzc/archive/2006/05/31/414310.html

  回复  引用  查看    
#10楼[楼主]2007-02-03 23:22 | jillzhang      
@小春[匿名]
这个方法,其实在光纤断掉的时候,应该就体现出来不足的地方了

  回复  引用    
#11楼2007-08-07 15:35 | abc[未注册用户]
你就不能把使用的代码贴出来?
  回复  引用    
#12楼2007-11-29 22:34 | tide[未注册用户]
我OpenSmtp发送报220,344错误是咋回事?
  回复  引用    
#13楼2008-03-10 09:20 | pzlhuster[未注册用户]
和版主深有同感,这个mcafee确实阻止了25端口向外发送邮件,不过我还是用winsocket进行smtp收发邮件



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 626006




相关文章:

相关链接: