C#开发基于ESMTP协议的邮件发送系统经验总结

用过C#内置的SMTP类的朋友大概知道,使用它发送邮件的时候,有时候总是出现莫名奇妙的错误,有时候可以发送成功,有时候说用户帐号验证失败,即使你设置了帐号验证信息,问题依旧,特别是在你使用QQ邮箱(好像163的用SMTP发送比较正常),基本上使用SMTP对象来发送邮件是不可能的事情,后来查询了一些资料,说QQ的协议好像是ESMTP协议了,也就是加强版的SMTP协议,不知道是不是,反正用QQ邮件的人比较多,发送的问题就比较突出了。

特别是我的软件“QQ号码采集及邮件发送系统”,之前一直使用SMTP类来处理邮件的发送,客户反映QQ邮件发送不成功的问题就特别突出,但是当时不知道如何处理这个问题,晚上找了很多资料,问题依旧,甚是头痛。先看看我这个邮件发送软件的界面先。

这个软件目前已经实现了ESMTP协议的批量发送功能了,测试发现163也支持ESMTP协议,估计大多数的SMTP提供商都是支持这个接口的了,因为对他们来说这个是更加安全、更少垃圾邮件的协议,好像有的像我们日常所说的“实名制”规则一样。

和SMTP类发送邮件不同,ESMTP是通过以流方式向服务器发送TCP/IP命令,进而获得交互响应的模式进行的,如要连接SMTP服务器,首先通过下面代码进行连接。

            //连接网络
            try
            {
                tc = new TcpClient(mailserver, mailserverport);
            }
            catch (Exception e)
            {
                errmsg = e.ToString();
                return false;
            }

            ns = tc.GetStream();

        /// <summary>
        /// 接收SMTP服务器回应
        /// </summary>
        protected string RecvResponse()
        {
            int StreamSize;
            string ReturnValue = "false";
            byte[] ReadBuffer = new byte[4096];

            try
            {
                StreamSize = ns.Read(ReadBuffer, 0, ReadBuffer.Length);
            }
            catch
            {
                errmsg = "网络连接错误";
                return ReturnValue;
            }

            if (StreamSize == 0)
            {
                return ReturnValue;
            }
            else
            {
                ReturnValue = Encoding.Default.GetString(ReadBuffer).Substring(0, StreamSize).Trim(); ;
                //logs+=ReturnValue;
                return ReturnValue;
            }
        }

一旦获得正常的响应后,就一步步向服务器发送请求命令或者数据来完成其他操作的。

发送命令的函数就是写入网络流的方式,通过下面的命令实现的

        /// <summary>
        /// 发送SMTP命令
        /// </summary>    
        protected bool SendCommand(string Command)
        {
            byte[] WriteBuffer;
            if (Command == null || Command.Trim() == "")
            {
                return true;
            }
            //logs+=Command;
            WriteBuffer = Encoding.Default.GetBytes(Command);
            try
            {
                ns.Write(WriteBuffer, 0, WriteBuffer.Length);
            }
            catch
            {
                errmsg = "网络连接错误";
                return false;
            }
            return true;
        }

ESMTP的特点就是需要验证用户,一旦验证用户通过后,用户就可以通过发送各类命令或者数据了,下面简单列出几个命令格式,其他的大家可以查询相关资料进行完成。

            //发件人信息
            SendBufferstr = "MAIL FROM:<" + From + ">" + enter;
            if (!Dialog(SendBufferstr, "发件人地址错误,或不能为空"))
                return false;

            //收件人列表
            SendBuffer.Clear();
            foreach (String item in Recipient)
            {
                SendBuffer.Add("RCPT TO:<" + item + ">" + enter);
                RecipientName = item;//这里其实只能支持一个收件人
            }
            if (!Dialog(SendBuffer, "收件人地址有误"))
                return false;

使用这个发送邮件,连最难对付的QQ邮箱也飞快的接收到了我的邮件了,不过大家不要滥发邮件,毕竟“实名制”的方式就是要对后果负责的。呵呵。

本文转自博客园伍华聪的博客,原文链接:C#开发基于ESMTP协议的邮件发送系统经验总结,如需转载请自行联系原博主。

时间: 2024-10-16 06:56:22

C#开发基于ESMTP协议的邮件发送系统经验总结的相关文章

使用ASP.NET开发邮件发送系统

asp.net|发邮件 如今,随着Internet的迅速发展,许多企业都纷纷架构起自己的网站,用来开展企业的电子商务活动,如发布.管理企业自己的供求信息:发展和管理企业的会员等.除了这些以外,还有一点是十分重要的,就是向所有企业注册会员发送电子邮件,及时通知用户企业的最新消息. Microsoft公司推出Visual Studio.NET已有一段时间了,一些以前使用ASP开发WEB应用程序的网友,现在也慢慢地有ASP转向ASP.NET平台.为了能够帮助一些想使用ASP.NET开发邮件发送系统的网

《Web异步与实时交互——iframe AJAX WebSocket开发实战》—— 1.1 基于HTTP协议的Web交互

1.1 基于HTTP协议的Web交互 HTTP协议(Hyper Text Transport Potocol,超文本传输协议),是基于服务器/客户端模式的无连接.无状态的协议.基于HTTP协议的Web应用中,所有的请求是由客户端发起的,服务器处于被动响应的地位.然而,服务器却相当于是信息的发布者,当有新信息产生时,服务器并不能主动将新信息发送给客户端,必须等待客户端主动发起访问请求建立连接后才能发送给客户端. 当遇到实时监控.即时通信.在线互动等的Web交互开发需求(如设备监控.聊天室.股票行情

java实现基于SGIP协议开发联通短信的方法_java

本文实例讲述了java实现基于SGIP协议开发联通短信的方法.分享给大家供大家参考.具体如下: 近段时间,由于公司的业务需要,开发出了联通短信.此文章的编写也是根据网上的一些示例来完成的.闲话少说,下面来看代码:(运行此程序的时候需要导入华为的开发包,此包可以到网上下载) 下行: public class Mt { private static String SPNumber = "**********"; //接入号码 private static String ChargeNumb

Android中基于XMPP协议实现IM聊天程序与多人聊天室_Android

简单的IM聊天程序由于项目需要做一个基于XMPP协议的Android通讯软件.故开始研究XMPP. XMPP协议采用的是客户端-服务器架构,所有从一个客户端发到另一个客户端的消息和数据都必须经过XMPP服务器转发,而且支持服务器间DNS的路由,也就是说可以构建服务器集群,使不同的 服务器下的客户端也可以通信,XMPP的前身是一个开源组织制定的网络通信协议--Jabber,XMPP的核心是在网络上分片段发送XML流的协议,这个协议是XMPP的即时通讯指令的传递手段.       为了防止服务器间发

DMARC安全协议为邮件保驾护航

近日,搜狐武汉研发中心的消息称,其研发的搜狐SendCloud触发式邮件发送系统,即将采用DMARC安全协议来进一步保证所其邮件发送的安全性. 作为由搜狐武汉中心研发的,提供多种接口来协助开发者和创业者完成邮件的发送与追踪任务的第三方邮件发送服务平台.搜狐SendCloud致力于为用户提供便捷的触发邮件的发送服务,满足用户个性化需求,并提供实时数据分析,从技术上有效防止垃圾邮件的误判,使邮件能够高效到达,以专业的技术和服务解决用户邮件发送的难题. 众所周知,一封邮件中"发件人"地址是可

Android中基于XMPP协议实现IM聊天程序与多人聊天室

简单的IM聊天程序 由于项目需要做一个基于XMPP协议的Android通讯软件.故开始研究XMPP. XMPP协议采用的是客户端-服务器架构,所有从一个客户端发到另一个客户端的消息和数据都必须经过XMPP服务器转发,而且支持服务器间DNS的路由,也就是说可以构建服务器集群,使不同的 服务器下的客户端也可以通信,XMPP的前身是一个开源组织制定的网络通信协议--Jabber,XMPP的核心是在网络上分片段发送XML流的协议,这个协议是XMPP的即时通讯指令的传递手段.       为了防止服务器间

[WEB开发] 基于XMLHTTP的简单实例

web|xml 樊欢 java爱好者.Email :heydaymail@hotmail.comBlog :http://heyday.blogone.net2005-8-23 引言 大家都知道可以通过post或者get获得form表单的数据,那么我们如何实现不刷新的提交直接获得页面上的数据呢?这就要借助xmlhttp协议了.xmlhttp是xmldom技术的一部分.  下面的代码就是一个很简单的例子,我们利用xmlhttp技术实现简单的用户登陆.   开始  1.简单的登录页面 login.j

也不贴上,用ASP开发基于Windows NT Server和IIS的Web应用

iis|server|web|window 用ASP开发基于Windows NT Server和IIS的Web应用 国防科工委指挥技术学院 韩正清 钱明 摘要: 本文比较了CGI ISAPI与ASP在结构和性能方面的差异,并介绍了用ASP开发WEB 应用的一般过程.关键词: ASP CGI ISAPI IIS一.前言Internet/Intranet和WEB技术的出现和发展,为信息的交换和共享提供了快捷有效的方法,但Internet/Intranet上提供的信息多以静态网页为主,对于一个WEB应

用ASP.NET做自己的邮件发送系统

如果要你用ASP来做一个邮件发送系统,你一定认为这是一个比较复杂的工作.其实也的确是这样.但当他的后继产品ASP.NET被推出以后,他的强大功能就使的这一切就变的相对简单了.真的这样神奇么?我们就通过ASP.NET做一个邮件发送系统,看看到底有什么奥秘,是不是真的简单. 一.运行环境 虽然Microsoft公司推出Visual Studio .NET已经有一段时间了,但.NET Framework SDK却依然还是BETA版,分别是BETA 1和BETA 2.这二个版本之间也有很大的差异,譬如说