博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#开发基于ESMTP协议的邮件发送系统经验总结
阅读量:5825 次
发布时间:2019-06-18

本文共 2108 字,大约阅读时间需要 7 分钟。

用过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邮箱也飞快的接收到了我的邮件了,不过大家不要滥发邮件,毕竟“实名制”的方式就是要对后果负责的。呵呵。
本文转自博客园伍华聪的博客,原文链接:,如需转载请自行联系原博主。
你可能感兴趣的文章
PyTips 0x02 - Python 中的函数式编程
查看>>
使用《Deep Image Prior》来做图像复原
查看>>
Linux基础命令---rmdir
查看>>
Android图片添加水印图片并把图片保存到文件存储
查看>>
开源 免费 java CMS - FreeCMS1.2-标签 infoSign
查看>>
Squid 反向代理服务器配置
查看>>
Java I/O操作
查看>>
Tomcat性能调优
查看>>
Android自学--一篇文章基本掌握所有的常用View组件
查看>>
灰度图像和彩色图像
查看>>
FreeMarker-Built-ins for strings
查看>>
argparse - 命令行选项与参数解析(转)
查看>>
修改上一篇文章的node.js代码,支持默认页及支持中文
查看>>
spring-boot支持websocket
查看>>
菜鸟笔记(一) - Java常见的乱码问题
查看>>
我理想中的前端工作流
查看>>
记一次Git异常操作:将多个repository合并到同一repository的同一分支
查看>>
Chrome 广告屏蔽功能不影响浏览器性能
查看>>
Android状态栏实现沉浸式模式
查看>>
使用Openfiler搭建ISCSI网络存储
查看>>