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

标签: none

添加新评论