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

用过C#放置的SMTP类的情侣大致知道,使用它发送邮件的时候,有时候总是出现莫名奇妙的不当,有时候可以发送成功,有时候说用户帐号验证败北,固然你设置了帐号验证音信,问题仍旧,尤其是在你利用QQ邮箱(好像163的用SMTP发送相比正规),基本上选择SMTP对象来发送邮件是不容许的工作,后来查询了一部分材料,说QQ的磋商好像是ESMTP协和了,也就是加强版的SMTP协议,不知底是或不是,反正用QQ邮件的人可比多,发送的题材就比较卓绝了。

专程是我的软件“QQ号码采集及邮件发送系统”,以前一贯接纳SMTP类来处理邮件的发送,客户反映QQ邮件发送不成功的题材就尤其突出,然则及时不明了如何处理这一个问题,早上找了诸多资料,问题依然,甚是感冒。先看看自家那些邮件发送软件的界面先。

图片 1

本条软件方今已经落成了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邮箱也快速的吸纳到了自家的邮件了,但是大家不要滥发邮件,毕竟“实名制”的法子就是要对结果负责的。呵呵。

相关文章