zoukankan      html  css  js  c++  java
  • 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邮箱也飞快的接收到了我的邮件了,不过大家不要滥发邮件,毕竟“实名制”的方式就是要对后果负责的。呵呵。

    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    Docker简介,安装,配置
    Centos7给 root 账户开通ssh权限
    [转载]Hyper-v 安装CentOS 7
    软件开发_六大原则
    php函数名后冒号(:)+数据类型(返回值类型限制/php新特性)
    MySQL--事务介绍
    MySQL存储引擎
    leetcode刷题笔记300题 最长上升子序列
    leetcode刷题笔记299题 猜数字游戏
    **leetcode刷题笔记四 两个有序序列的中位数**
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/1576511.html
Copyright © 2011-2022 走看看