学习坊广告 网站建设咨询电话0711-3202220 、 QQ:215665888        将学习坊设为主页     广告赞助QQ:410899793     主页申请

ASP.net发送Email

来源:网络 【www.cn0711.net】   作者:未知【学习坊转】 [字体: ]

从上面的分析可以看出,在这个身份验证过程中,服务器和客户端都直接通过Socket传递经过标准Base64编码的纯文本这个过程可以非常方便的用C#实现,或者直接添加到原有的源代码中另外,有些ESMTP服务器不支持AUTH LOGIN方式的认证,只支持AUTH CRAM-MD5方式验证但是这两者之间的区别只是文本的编码方式不同

实现此功能的源代码可以在SourceForge.NET http://sourceforge.NET/projects/opensmtp-net/ 上找到下载下面给出了一个简单的伪码:

public void SendMail(MailMessage msg)  

NetworkStream nwstream = GetConnection();

 


WrITeToStream(ref nwstream, "EHLO " + smtpHost + "\r\n");

string welcomeMsg = ReadFromStream(ref nwstream);

 


// implement HELO command if EHLO is unrecognized.

if (IsUnknownCommand(welcomeMsg))

{

WrITeToStream(ref nwstream, "HELO " + smtpHost + "\r\n");

}

CheckForError(welcomeMsg, ReplyConstants.OK);   

 


// Authentication is used if the u/p are supplied

AuthLogin(ref nwstream);

 


WrITeToStream(ref nwstream, "MAIL FROM: <" + msg.From.Address + ">\r\n");

CheckForError(ReadFromStream(ref nwstream), ReplyConstants.OK);

 


SendRecipientList(ref nwstream, msg.To);

SendRecipientList(ref nwstream, msg.CC);

SendRecipientList(ref nwstream, msg.BCC);

 


WrITeToStream(ref nwstream, "DATA\r\n");

CheckForError(ReadFromStream(ref nwstream), ReplyConstants.START_INPUT);

 


if (msg.ReplyTo.Name != null && msg.ReplyTo.Name.Length != 0)

{ WrITeToStream(ref nwstream, "Reply-To: \"" + msg.ReplyTo.Name + "\" <" +

msg.ReplyTo.Address + ">\r\n"); }

else

{ WrITeToStream(ref nwstream, "Reply-To: <" + msg.ReplyTo.Address + ">\r\n"); }

 

if (msg.From.Name != null && msg.From.Name.Length != 0)

{ WrITeToStream(ref nwstream, "From: \"" + msg.From.Name + "\" <" +

msg.From.Address + ">\r\n"); }

else

{ WrITeToStream(ref nwstream, "From: <" + msg.From.Address + ">\r\n"); }

 

WrITeToStream(ref nwstream, "To: " + CreateAddressList(msg.To) + "\r\n");

 

if (msg.CC.Count != 0)

{ WrITeToStream(ref nwstream, "CC: " + CreateAddressList(msg.CC) + "\r\n"); }

 


WrITeToStream(ref nwstream, "Subject: " + msg.Subject + "\r\n");

 


if (msg.PriorITy != null)

{ WrITeToStream(ref nwstream, "X-PriorITy: " + msg.PriorITy + "\r\n"); }

 


if (msg.Headers.Count > 0)

{

SendHeaders(ref nwstream, msg);

}

 

if (msg.Attachments.Count > 0 || msg.HtmlBody != null)

{

SendMessageBody(ref nwstream, msg);

}

else

{

WrITeToStream(ref nwstream, msg.Body + "\r\n");

}

 

WrITeToStream(ref nwstream, "\r\n.\r\n");

CheckForError(ReadFromStream(ref nwstream), ReplyConstants.OK);

WrITeToStream(ref nwstream, "QUIT\r\n");

CheckForError(ReadFromStream(ref nwstream), ReplyConstants.QUIT);

CloseConnection();

}

 


private bool AuthLogin(ref NetworkStream nwstream)

{

if (username != null && username.Length > 0 && password != null && password.Length > 0)

{

WrITeToStream(ref nwstream, "AUTH LOGIN\r\n");

if (AuthImplemented(ReadFromStream(ref nwstream)))

{

WrITeToStream(ref nwstream, Convert.ToBase64String(

Encoding.ASCII.GetBytes(this.username.ToCharArray())) + "\r\n");

CheckForError(ReadFromStream(ref nwstream), ReplyConstants.SERVER_CHALLENGE);

WrITeToStream(ref nwstream, Convert.ToBase64String(Encoding.ASCII.GetBytes(

this.password.ToCharArray())) + "\r\n");

CheckForError(ReadFromStream(ref nwstream), ReplyConstants.AUTH_SUCCESSFUL);

return true;

}

}

return false;

}

总结

本文介绍了.NET中三种不同的使用SMTP协议发送邮件的方法,其中第一种(使用SmtpMail类)方案能满足大部分基本的发送邮件的功能需求,而第二种(使用CDO组件)和第三种(使用Socket自己撰写SMTP类)方案提供更自由和完整的定制方法,比如他们都能实现第一种方案不能做到的通过带认证的SMTP服务器发送邮件的功能



上一页 [1] [2]    

 

录入:学习坊

查看对 ASP.net发送Email_Page2 的评论 【 发表见解 】 【 查看见解 】 【 打印资料 】  
上一篇:ASP.NET中使用Caching
下一篇:ASP.NET设计网络硬盘之两重要类
百度中>“ASP.net发送Email”相关内容 google中>“ASP.net发送Email”相关内容
雅虎中>“ASP.net发送Email”相关内容 搜狗中>“ASP.net发送Email”相关内容
中搜中>“ASP.net发送Email”相关内容 爱问中>“ASP.net发送Email”相关内容