您的位置:首页精文荟萃软件资讯 → ASP.net发送Email

ASP.net发送Email

时间:2004/10/8 13:56:00来源:本站整理作者:蓝点我要评论(0)

 首先,我们来介绍一下.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 = "myaccount@test.com";
  myMail.To = "myaccount@test.com";
  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函数还可以简单的直接以邮件的4个主要信息(from,to,subject,messageText)作为字符串参数来调用。



第二、使用CDO组件发送邮件
  CDO是Collaboration Data Objects的简称,它是一组高层的COM对象集合,并经历了好几个版本的演化,现在在Windows2000和Exchange2000中使用的都是CDO2.0的版本(分别为cdosys.dll和cdoex.dll)。CDOSYS构建在SMTP协议和NNTP协议之上,并且作为Windows2000 Server的组件被安装,您可以在系统目录(如c:\winnt或c:\windows)的system32子目录中找到它(cdosys.dll)。
  CDO组件相对于先前介绍的SmtpMail对象功能更为丰富,并提供了一些SmtpMail类所没有提供的功能,如通过需要认证的SMTP服务器发送邮件等。
  下面一段代码就展示了如何使用CDO组件通过需要认证的SMTP服务器发送邮件的过程:
(in C#)
public void CDOsendMail()
{
 try
 {    
  CDO.Message oMsg = new CDO.Message();
    
  oMsg.From = "myaccount@test.com";
  oMsg.To = "myaccount@test.com";
  oMsg.Subject = "MailTest";
                 
  oMsg.HTMLBody = "Test";



  CDO.IConfiguration iConfg = oMsg.Configuration;
  ADODB.Fields oFields = iConfg.Fields;
          
oFields["http://schemas.microsoft.com/cdo/configuration/sendusing"].Value=2;
oFields["http://schemas.microsoft.com/cdo/configuration/sendemailaddress"].Value="myaccount@test.com"; //sender mail
oFields["http://schemas.microsoft.com/cdo/configuration/smtpaccountname"].Value="myaccount@test.com"; //email account
oFields["http://schemas.microsoft.com/cdo/configuration/sendusername"].Value="username";
oFields["http://schemas.microsoft.com/cdo/configuration/sendpassword"].Value="password"; 
oFields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"].Value=1;
//value=0 代表Anonymous验证方式(不需要验证)
//value=1 代表Basic验证方式(使用basic (clear-text) authentication. 
//The configuration sendusername/sendpassword or postusername/postpassword fields are used to specify credentials.)
//Value=2 代表NTLM验证方式(Secure Password Authentication in Microsoft Outlook Express)
oFields["http://schemas.microsoft.com/cdo/configuration/languagecode"].Value=0x0804;
oFields["http://schemas.microsoft.com/cdo/configuration/smtpserver"].Value="smtp.21cn.com";



  oFields.Update();
  oMsg.BodyPart.Charset="gb2312";
  oMsg.HTMLBodyPart.Charset="gb2312"; 



  oMsg.Send();
  oMsg = null;
 }   
 catch (Exception e)
 {
  throw e;
 }
}
注意:由于Exchange2000的CDO组件cdoex.dll会更新原有的Windows2000的CDO组件cdosys.dll,所以如果您希望继续使用cdosys.dll,您必须先通过regsrv32.exe卸载掉cdoex.dll。



第三、使用Socket撰写邮件发送程序
  当然,如果您觉得SmtpMail不能满足您的需求,CDO又不够直截了当,那就只能自己动手了;其实如果您很熟悉Socket编程,自己写一个发送邮件的程序并不很难,以下就是一个例子。
首先,我们简单介绍一下带验证的SMTP服务器如何使用AUTH原语进行身份验证,其详细的定义可以参考RFC2554。
具体如下:
1)首先,需要使用EHLO而不是原先的HELO。
2)EHLO成功以后,客户端需要发送AUTH原语,与服务器就认证时用户名和密码的传递方式进行协商。
3)如果协商成功,服务器会返回以3开头的结果码,这是就可以把用户名和密码传给服务器。
4)最后,如果验证成功,就可以开始发信了。
下面是一个实际的例子,客户端在WinXP的Command窗口中通过"telnet smtp.263.NET 25"命令连接到263的smtp服务器发信:
220 Welcome to coremail System(With Anti-Spam) 2.1
EHLO 263.NET
250-192.168.30.29
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH LOGIN
250 8BITMIME
AUTH LOGIN
334 VXNlcm5hbWU6
bXlhY2NvdW50
334 UGFzc3dvcmQ6
bXlwYXNzd29yZA==
235 Authentication successful
MAIL FROM:myaccount@263.NET
250 Ok
RCPT TO:myaccount@263.NET
250 Ok
Data
354 End data with .
This is a testing email.
haha.
.
250 Ok: queued as AC5291D6406C4
QUIT
221 Bye



上面的内容就是发信的全过程。其中与身份验证有关的主要是第九到第十四行:
AUTH LOGIN "客户端输入
334 VXNlcm5hbWU6 "服务器提示“Username:="
bXlhY2NvdW50 "客户端输入“myaccount="的Base64编码
334 UGFzc3dvcmQ6 "服务器提示“Password:="
bXlwYXNzd29yZA== "客户端输入“mypassword="的Base64编码
235 Authentication successful "服务器端通过验证
从上面的分析可以看出,在这个身份验证过程中,服务器和客户端都直接通过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服务器发送邮件的功能。

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3

最新文章 微信3.6.0测试版更新了微信支付漏洞会造成哪 360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗

人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本