知识大全 利用ASP.net编写发送Email程序

Posted

篇首语:木尺虽短,能量千丈。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 利用ASP.net编写发送Email程序相关的知识,希望对你有一定的参考价值。

利用ASP.net编写发送Email程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  首先 我们来介绍一下 NET类库种自带的SMTP类

  在 NET中的System Web Mail名字空间下 有一个专门使用SMTP协议来发送邮件的类 SmtpMail 它已能满足最普通的发送邮件的需求 这个类只有一个自己的公共函数 Send()和一个公共属性—SmtpServer您必须通过SmtpServer属性来指定发送邮件的服务器的名称(或IP地址) 然后再调用Send()函数来发送邮件 代码示例如下

   (in C#)using System Web Mail;public void sendMail()    try   System Web Mail MailMessage myMail=new MailMessage();  myMail From = ;  myMail To = ;  myMail Subject = MailTest ;  myMail Priority = MailPriority Low;  myMail BodyFormat = MailFormat Text;  myMail Body = Test ;  SmtpMail SmtpServer= smarthost ; //your smtp server here

  SmtpMail Send(myMail);         catch(Exception e)   throw e;       

     您可以在Send函数的参数MailMessage对象中设置邮件的相关属性 如优先级 附件等等 除了以MailMessage对象为参数(如上述代码) Send函数还可以简单的直接以邮件的 个主要信息(from to subject messageText)作为字符串参数来调用

  第二 使用CDO组件发送邮件

  CDO是Collaboration Data Objects的简称 它是一组高层的对象集合 并经历了好几个版本的演化 现在在Windows 和Exchange 中使用的都是CDO 的版本(分别为cdosys dll和cdoex dll) CDOSYS构建在SMTP协议和NNTP协议之上 并且作为Windows Server的组件被安装 您可以在系统目录(如c:\\winnt或c:\\windows)的system 子目录中找到它(cdosys dll)   CDO组件相对于先前介绍的SmtpMail对象功能更为丰富 并提供了一些SmtpMail类所没有提供的功能 如通过需要认证的SMTP服务器发送邮件等   下面一段代码就展示了如何使用CDO组件通过需要认证的SMTP服务器发送邮件的过程

   (in C#)public void CDOsendMail() try       CDO Message oMsg = new CDO Message();      oMsg From = ;  oMsg To = ;  oMsg Subject = MailTest ;                   oMsg HTMLBody = <><body>Test</body></> ;

  CDO IConfiguration iConfg = oMsg Configuration;  ADODB Fields oFields = iConfg Fields;          oFields[ ] Value= ;oFields[ ] Value= ; //sender mailoFields[ ] Value= ; //email accountoFields[ ] Value= username ;oFields[ ] Value= password ; oFields[ ] Value= ;//value= 代表Anonymous验证方式(不需要验证)//value= 代表Basic验证方式(使用basic (clear text) authentication //The configuration sendusername/sendpassword or postusername/postpassword fields are used to specify credentials )//Value= 代表NTLM验证方式(Secure Password Authentication in Microsoft Outlook Express)oFields[ ] Value= x ;oFields[ ] Value= ;

  oFields Update();  oMsg BodyPart Charset= gb ;  oMsg HTMLBodyPart Charset= gb ;

  oMsg Send();  oMsg = null;     catch (Exception e)   throw e;  

     注意 由于Exchange 的CDO组件cdoex dll会更新原有的Windows 的CDO组件cdosys dll 所以如果您希望继续使用cdosys dll 您必须先通过regsrv exe卸载掉cdoex dll

  第三 使用Socket撰写邮件发送程序

  当然 如果您觉得SmtpMail不能满足您的需求 CDO又不够直截了当 那就只能自己动手了 其实如果您很熟悉Socket编程 自己写一个发送邮件的程序并不很难 以下就是一个例子 首先 我们简单介绍一下带验证的SMTP服务器如何使用AUTH原语进行身份验证 其详细的定义可以参考RFC 具体如下 )首先 需要使用EHLO而不是原先的HELO )EHLO成功以后 客户端需要发送AUTH原语 与服务器就认证时用户名和密码的传递方式进行协商 )如果协商成功 服务器会返回以 开头的结果码 这是就可以把用户名和密码传给服务器 )最后 如果验证成功 就可以开始发信了 下面是一个实际的例子 客户端在WinXP的Command窗口中通过 telnet smtp NET 命令连接到 的smtp服务器发信 Wele to coremail System(With Anti Spam) EHLO NET PIPELINING SIZE ETRN AUTH LOGIN BITMIMEAUTH LOGIN VXNlcm hbWU bXlhY NvdW UGFzc dvcmQ bXlwYXNzd yZA== Authentication successfulMAIL FROM:myaccount@ NET OkRCPT TO:myaccount@ NET OkData End data with <CR><LF> <CR><LF>This is a testing email haha Ok: queued as AC D C QUIT Bye

  上面的内容就是发信的全过程 其中与身份验证有关的主要是第九到第十四行 AUTH LOGIN 客户端输入 VXNlcm hbWU 服务器提示 Username:= bXlhY NvdW 客户端输入 myaccount= 的Base 编码 UGFzc dvcmQ 服务器提示 Password:= bXlwYXNzd yZA== 客户端输入 mypassword= 的Base 编码 Authentication successful 服务器端通过验证从上面的分析可以看出 在这个身份验证过程中 服务器和客户端都直接通过Socket传递经过标准Base 编码的纯文本 这个过程可以非常方便的用C#实现 或者直接添加到原有的源代码中 另外 有些ESMTP服务器不支持AUTH LOGIN方式的认证 只支持AUTH CRAM MD 方式验证 但是这两者之间的区别只是文本的编码方式不同 实现此功能的源代码可以在SourceFe NET net/ 上找到下载 下面给出了一个简单的伪码

   public void SendMail(MailMessage msg)      NeorkStream nwstream = GetConnection();

  WriteToStream(ref nwstream EHLO + smtpHost + \\r\\n ); string weleMsg = ReadFromStream(ref nwstream);

  // implement HELO mand if EHLO is unrecognized  if (IsUnknownCommand(weleMsg))   WriteToStream(ref nwstream HELO + smtpHost + \\r\\n );  CheckForError(weleMsg 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 != )  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 != )  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 != )  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 > )   SendHeaders(ref nwstream msg);   if (msg Attachments Count > || 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 NeorkStream nwstream)if (username != null && username Length > && password != null && password Length > ) WriteToStream(ref nwstream AUTH LOGIN\\r\\n ); if (AuthImplemented(ReadFromStream(ref nwstream)))   WriteToStream(ref nwstream Convert ToBase String(    Encoding ASCII GetBytes(this username ToCharArray())) + \\r\\n );  CheckForError(ReadFromStream(ref nwstream) ReplyConstants SERVER_CHALLENGE);  WriteToStream(ref nwstream Convert ToBase String(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服务器发送邮件的功能 cha138/Article/program/net/201311/12344

相关参考

知识大全 ASP.NET结合COM组件发送Email

ASP.NET结合COM组件发送Email  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在系统

知识大全 用ASP.Net写一个发送ICQ信息的程序

用ASP.Net写一个发送ICQ信息的程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这里我

知识大全 编写ASP.NET应用程序的十大技巧

编写ASP.NET应用程序的十大技巧  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在使用Vis

知识大全 Web上利用System.Web.Mail发送EMail

Web上利用System.Web.Mail发送EMail  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 vs.net打造发送与接收端程序

  本篇文章的主要开发环境是VisualStudioVisualStudio系列产品一直以来都提供了强大的控件功能然而我们利用这些控件可以编写出功能强大的应用程序本文主要利用微软的最新net开发工具为

知识大全 Asp.net中的mail的发送

Asp.net中的mail的发送  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  现在的邮件发送大

知识大全 ASP.NET定时发送邮件总结

ASP.NET定时发送邮件总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  香港那边公司的市场

知识大全 ASP.NET自动发送邮件功能的实现

ASP.NET自动发送邮件功能的实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  有时我们需要

知识大全 ASP.Net 2.0 发送邮件的代码

ASP.Net2.0发送邮件的代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb

知识大全 ASP.NET服务器控件发送脚本

ASP.NET服务器控件发送脚本  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘要尽管从技术角