使用过C#内置SMTP系统的朋友应该知道,用它发送邮件时,有时会出现奇怪的错误,有时发送成功,有时用户帐户验证失败。 设置帐户验证信息不会改变问题。 特别是当你使用QQ邮件地址发送邮件时,基本上不可能使用SMTP对象发送邮件。 然后,我们检查了一些资料,发现QQ的协议似乎是ESMTP协议,也就是增强版的SMTP协议。 不知道是不是,总之很多人都使用QQ邮件,所以发送的问题很突出。 特别是我的软件“QQ号码收集和邮件发送系统”,以前就使用SMTP类处理邮件的发送。 客户的QQ邮件发送不顺利这一问题尤为突出,但当时不知道如何处理这个问题,晚上找了很多资料。 问题仍然是,我非常头痛。 先看看我这个邮件发送软件的接口吧。 该软件现在实现了ESMTP协议的大量发送功能,测试显示163个支持ESMTP协议,许多SMTP提供程序可能支持该接口。 对他们来说,这是一个更安全、垃圾邮件更少的协议,所以似乎有些像我们日常所说的“实名制”规则。 与SMTP类发送邮件不同,ESMTP以流方式向服务器发送TCP/IP命令并获得交互式响应的模式进行。 要连接到SMTP服务器,请首先使用以下代码进行连接: //连接到网络
特里
{
TC=new TCP客户端(邮件服务器,邮件服务器端口);
}
catch (Exceptione )
{
errmsg=e.ToString (;
返回假;
}
ns=tc.GetStream (; ///summary
接收SMTP服务器的响应
////summary
保护性字符串recv响应(
{
int StreamSize;
字符串返回值=' false ';
byte [ ]读取缓冲器=new byte [ 4096 ];
特里
{
stream size=ns.read (读缓冲器,0,读缓冲器. length );
}
广告宣传
{
errmsg='网络连接错误';
返回返回值;
}
if (流大小==0) ) ) )。
{
返回返回值;
}
else
{
return value=encoding.default.getstring (read buffer ).Substring(0) 0,StreamSize ).Trim );
//logs=返回值;
返回返回值;
}
}收到成功响应后,向服务发送请求命令或数据以完成其他操作。 发送命令的函数是以写入网络流的方式通过以下命令实现的///summary
发送SMTP命令
////summaryg
t;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邮箱也飞快的接收到了我的邮件了,不过大家不要滥发邮件,毕竟“实名制”的方式就是要对后果负责的。呵呵。 本文转自博客园dddst的博客,原文链接:C#开发基于ESMTP协议的邮件发送系统经验总结,如需转载请自行联系原博主。