.NET中邮件发送服务

 由于做项目的时候要用到发送邮件的功能,所以就要用到了.NET中System.Web.Mail这个名空间,里面的类型可以在 ASP.NET 或任何托管应用程序使用。它里面有三个类:MailMessage、SmtpMail和一个附件类MailAttachment。MailMessage这个类提供了构造电子邮件的属性和方法,可以用它来设置电子邮件,如标题,发件人,收件人,邮件主题等等。SmtpMail是用来发送电子邮件的,可以以MailMessage为参数进行发送,也可以以收件人,发件人等等进行发送,它提供了使用 Windows 2000 的协作数据对象 (CDOSYS) 消息组件来发送消息的属性和方法。因此当你的邮件程序中有错误时(如服务器不存在,服务器需要认证,服务器返回错误,CDO异常),就会出现“不能访问“CDO.Message”对象。但是在程序中都没有使用CDO来发送电子邮件,为什么会出现这个错误呢?原因就是这个类使用 Windows 2000 的协作数据对象 (CDOSYS) 消息组件来发送的,所以尽管在程序中是用SmtpMail来发送的,也会出现这个错误。
 
    System.Web.Mail 在 . NET整个名空间中的层次结构如下:

System.Object
   System.ValueType
       System.Enum
          System.Web.Mail.MailEncodin
   System.Web.Mail.MailFormat
    System.Web.Mail.MailPriority
     System.Web.Mail.MailAttachment
      System.Web.Mail.MailMessage
       System.Web.Mail.SmtpMail


下面说明System.Web.Mail这个名空间里各类的用法:
 首先是System.Web.Mail.MailEncodin出场。这个名空间很简单,几乎没什么东西可讲,但却是很重要的一个,它是一个枚举:类,主要提供电子邮件编码的枚举值,只有两个,如下:
Base64         指定电子邮件使用 Base64 编码。
UUEncode       指定电子邮件使用 UUEncode 编码。

 接下来是System.Web.Mail.MailFormat名空间,顾名思义,一看就知道是个电子邮件格式的类,它同样也是个枚举类,主要提供电子邮件格式的枚举值。也同样只有两个,如下:


Html 指定电子邮件格式为 HTML 格式。
Text 指定电子邮件格式为纯文本格式。

紧接着,System.Web.Mail.MailPriority,还是个枚举类,呵呵,这个主要是指定电子邮件的优先级别。枚举值如下:


High 指定电子邮件具有高优先级。
Low 指定电子邮件具有低优先级。
Normal 指定电子邮件具有普通优先级。
这些枚举值都很好理解,看名字就可以知道它是怎么用的,就不说了。

再接着是一个电子邮件附件类System.Web.Mail.MailAttachment,附件在电子邮件中经常要用到,因此在 . NET开发人员也为它做了一个单独的类。它主要提供用于构成电子邮件附件的属性和方法,这个类并不复杂,很好用,呵呵,往下看。先看个例子可能会更容易理解点:

MailMessage mailObj=new MailMessage();   //先创建一个邮件编辑类
string attaches = @"g:\image\dida.jpg,c:\test.txt,d:\a.chm"; //这个邮件带三个附件,也可以分成//两个写,不过这样写方便,
char[] SplitFlag = new char[] {','};
foreach (string str in attaches.Split(SplitFlag))    //以逗号作为分隔符把三个附件拆开
{
   MailAttachment myAttachment = new MailAttachment(str); //这里以附件作为参数创建一
//个邮件附件类
   mailObj.Attachments.Add(myAttachment);   //将附件添加到邮件类里
}

它的用法就是这样,代码很简单,也都很容易理解。
这个类还提供了两个公共属性,如下表:

Encoding 获取电子邮件附件的编码类型。
Filename 获取附件文件的名称。

Encoding属性,默认情况下为 UUEncode,另一个编辑类型是Base64。

     OK,介绍完成以上类,接下来就是主角出场了。

  System.Web.Mail.MailMessage这个类主要提供用来构造电子邮件的属性和方法。这个类很丰富哦,呵呵。先看看它提供有哪些属性。
1.Attachments 属性:指定随电子邮件一起传送的附件集合,属性值为MailAttachment 对象的 IList 集合。用法如上面代码。

2.Bcc 属性:获取或设置以分号分隔的电子邮件地址列表如收件人的电子邮件地址或者是在通讯簿中显示的名称,这些地址接收电子邮件的匿名密件副本 (BCC)。

例:MailMessage mailObj = new MailMessage();
mailObj.Bcc = "xxxx@xxx.com";

3.Body 属性:同HTML里的BODY,为设置电子邮件的正文部分。

4.BodyEncoding 属性:获取或设置电子邮件正文的编码类型,属性值为Encoding 值(如上文提到)之一。

例:MailMessage mailObj = new MailMessage();
mailObj.BodyEncoding = Encoding.ASCII;

5.BodyFormat 属性:获取或设置电子邮件正文部分的内容类型,属性值为MailFormat 值之一。例:MailMessage mailObj = new MailMessage();
mailObj.BodyFormat = MailFormat.Html;

6.Cc 属性:获取或设置以分号分隔的电子邮件地址列表,这些地址接收电子邮件的抄   送副本 (CC)。以分号分隔的列表中的收件人可以是电子邮件地址,也可以是通讯簿中显示的名称。

例:MailMessage mailObj = new MailMessage();
mailObj.Cc = "xxxxxx@xxx.com";

7.Fields 属性:顾名思义,字段属性,可以用此来达到身份验证的效果哦,下面会演示.在.NET Framework 1.1中才有的属性。

8.From 属性:获取或设置发件人的电子邮件地址,
例:MailMessage mailObj = new MailMessage();
mailObj.From = "xxxxxx@xxx.com";

9.Headers 属性:指定随电子邮件一起传送的自定义标头。属性值为 IDictionary 集合

10.Priority 属性:获取或设置电子邮件的优先级。
例:MailMessage mailObj = new MailMessage();
mailObj.Priority = MailPriority.Low;

11.Subject 属性:获取或设置电子邮件的主题。

12.To 属性:获取或设置以分号分隔的收件人电子邮件地址列表。

13.UrlContentBase 属性:获取或设置 Content-Base HTTP 标头,即在 HTML 编码的电子邮件正文中使用的所有相对 URL 的 URL 基。例:MailMessage mailObj = new MailMessage();
mailObj.UrlContentBase="http://www.pconline.com.cn/News";

14.UrlContentLocation 属性:获取或设置电子邮件的 Content-Location HTTP 标头。
 
     以上是System.Web.Mail.MailMessage提供的所有属性。它还提供有一些方法,都是从Object类继承出来的,如Equals、ToString等等这些。下面看个例子:

    先结合最后一个要讲的SmtpMail类解释一下。因为SmtpMail默认是以纯文本的方式来发送的,所以如果想要以HTML的格式来发送的话,可以按照下面去做。使用HtmlTextWriter类来形式一个HTML格式,要使用这个类,必须先创建一个StringWriter类的对象,这个类是代表数据作为字符串来写入的一个流类,用法如下:

首先要导入System.Web.Mail这个名空间

   MailMessage mailObj=new MailMessage();
   StringWriter sWriter=new StringWriter();
   HtmlTextWriter htmlWriter=new HtmlTextWriter(sWriter); //以这个流类作为参数来进//行传输数据。
   htmlWriter.RenderBeginTag("html");//将HTML的开始标志写入流
   htmlWriter.RenderBeginTag("head");
   htmlWriter.RenderBeginTag("title");
   htmlWriter.Write("Hello"); //这里是写在title标签之间的内容
   htmlWriter.RenderEndTag(); //结束head
   htmlWriter.RenderEndTag();//结束title
   htmlWriter.RenderBeginTag("body");
   htmlWriter.Write("Welcome to Pconline"); //这里是写在Body标签之间的内容
   htmlWriter.RenderEndTag();//结束body
   htmlWriter.RenderEndTag();//结束html

   mailObj.From="xxxxx@xxx.com"; //发信人的邮件地址
   mailObj.To="xxxx@xxx.com";   //收信人的邮件地址
   mailObj.Bcc="xxxx@xxx.com";  //收取密件副件人的地址
   mailObj.Subject="xxxxxx@xxx.com";  //邮件的主题
   mailObj.Body=sWriter.ToString();  //将流类的内容作为邮件的正文部分
   mailObj.BodyFormat=MailFormat.Html;  //格式化为html格式
   try
   {
    SmtpMail.Send(mailObj); //调用SmtpMail类来发送邮件
   }
   catch(Exception pp)
{
Response.Write(pp.Message);
}

以上程序在Windows2000 Server +SMTP服务器+Miscrosoft .NET Framework 1.1+VS2003+C#上运行成功.在XP下运行可能会发送不成功,原因在上面开头部分有讲到.

    OK,剩余最后一个主要类SmtpMail,这个类主要负责邮件的发送和服务器的设置等,它主要提供用于使用 Windows 2000 的协作数据对象 (CDOSYS) 消息组件来发送消息的属性和方法。而邮件的发送可以通过 Microsoft Windows 2000 中内置的 SMTP 邮件服务或其它SMTP 服务器来做到。

   同样地,对于SmtpMail的属性,它只提供了一个,就是SmtpServer 属性. 主要是用来获取或设置要用于发送电子邮件的 SMTP 中继邮件服务器的名称。如果没有设置,则使用本地 SMTP 服务器的名称。例:SmtpMail.SmtpServer= "RelayServer.Contoso.com";如果没有设置 SmtpServer 属性,则默认情况下,邮件将在 Windows 2000 系统中进行排队,从而确保调用程序不会阻塞网络通信。如果设置了 SmtpServer 属性,则邮件将被直接传送到指定的服务器。
如果本地 SMTP 服务器(包括在 Windows 2000 和 Windows Server 2003 中)位于阻塞任何直接 SMTP 通信量(通过端口 25)的防火墙之后,则需要查找网络上是否有可用的智能主机(一个 SMTP 服务器,它能够中转从内部 SMTP 服务器直接发送到 Internet 的外出电子邮件。它应能同时连接到内部网络和 Internet,以用作电子邮件网关)能用来中转发往 Internet 的 SMTP 消息。关于SmtpServer属性就讲这么多, SmtpMail类还提供了一个Send方法,用法如上面代码,它使用在 MailMessage 类的属性中提供的参数发送电子邮件。还可以这么写.

例:string from = "xxxx@xxxxx.com";
string to = "xxxx@xxxxxxx.com";
string subject = "Hello";
string body = "Hello – Welcome To Mail Program";
SmtpMail.SmtpServer = "MyMailServer";
SmtpMail.Send(from, to, subject, body);

利用这小段代码同样可以达到发送邮件的目的.

   使用SmtpMail有缺点,就是不能通过需要认证的SMTP服务器来发送邮件等。刚好文章开头提到的CDO解决了这个问题. 但它同样也有缺点,就是系统开销较大.

CDO是Collaboration Data Objects的简称,它是一组高层的COM对象集合,现在在Windows2000和Exchange2000中使用的都是CDO的升级版本(分别为cdosys.dll和cdoex.dll),它是一个数据对象模型。CDOSYS构建在SMTP协议和NNTP协议之上,作为组件被安装在Windows2000 Server,可以在系统目录(如c:\winnt)的system32子目录中找到它(cdosys.dll)。
CDO组件比SmtpMail功能更先进,它提供了一些SmtpMail类没有的功能,如通过需要认证的SMTP服务器来发送邮件, 检查入站的消息是否有病毒,检测和丢弃不适当的新闻组邮件, 用 SMTP 和 NNTP 协议创建和发送消息等等一系列功能.
 下面看一段CDO实现发送邮件并且经过身份验证的程序,对于以下程序,你可能需要添加对CDO COM组件的引用.

public void SendMailWithCDO()
{
 try
    
  CDO.Message cdoOj = new CDO.Message(); 
  cdoOj.From = "hello@hello.com"; //假设
  cdoOj.To = "xxxxxxx@xxxxx.com";
  cdoOj.Subject = "xxxxxx";
   cdoOj.HTMLBody = "Hello";
  CDO.IConfiguration iCfg = cdoOj.Configuration;
  ADODB.Fields flds = iCfg.Fields;
          
flds ["http://schemas.microsoft.com/cdo/configuration/sendusing"].Value=2;
flds ["http://schemas.microsoft.com/cdo/configuration/sendemailaddress"]
 .Value=" hello@hello.com "; //sender mail
flds ["http://schemas.microsoft.com/cdo/configuration/smtpaccountname"]
 .Value=" hello@hello.com "; //email account
flds ["http://schemas.microsoft.com/cdo/configuration/sendusername"]
 .Value="username";
flds ["http://schemas.microsoft.com/cdo/configuration/sendpassword"]
 .Value="password"; 
flds ["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"]
 .Value=1;
//value=0 代表匿名验证方式(不需要验证)
//value=1 代表Basic验证方式(使用basic (clear-text) authentication.
//Value=2 代表NTLM验证方式(Secure Password Authentication in Microsoft Outlook Express)
flds["http://schemas.microsoft.com/cdo/configuration/languagecode"]

.Value=0x0804;
flds ["http://schemas.microsoft.com/cdo/configuration/smtpserver"]

.Value="smtp.hello.com"; //假设


  flds.Update();
  cdoOj.BodyPart.Charset="gb2312";
  cdoOj.HTMLBodyPart.Charset="gb2312";
  cdoOj.Send();
   
 catch (Exception exp)
 {
  MessageBox.Show(exp.Message);
 }
}

以上代码很简单,也很容易理解,跟SMTP发送邮件很相似,只是在中间加了段身份验证的.
下面来看用SMTP通过身份验证发送邮件的代码:

public void SendMailWithSMTP(string username,string password,string from,string to ,string subject,string msg)
{
  try
{
  MailMessage mailObj=new MailMessage();
 mailObj.From=from;
 mailObj.To=to;
 mailObj.Subject=subject;
 mailObj.Body=msg;
 if(username!=null && password!=null)
 {
   mailObj.Fields.Add(“http://schemas.microsoft.com/cdo/configuration/smtpauthenticate”,1”);
mailObj.Fields.Add(“http://schemas.microsoft.com/cdo/configuration/sendusername”,”username”);
mailObj.Fields.Add(“http://schemas.microsoft.com/cdo/configuration/sendpassword”,”password”);  //就是这里完成与CDO一样的身份验证
}
SmtpMail.SmtpServer=”MySmtpServer”; //这里要更改成你的SMTP SERVER
SmtpMail.Send(mailObj); //发送,搞定
}
catch(Exception exp){MessageBox.Show(exp.Message);}
}

以上程序在Windows2000 Server +SMTP服务器+Miscrosoft .NET Framework 1.1+VS2003+C#上运行成功.在XP下运行可能会发送不成功,原因在文章开头部分有讲到.

在.NET中还可以用SOCKET来进行邮件发送,这里就不说了.
    总结:在.NET中提供的邮件发送服务下可以很方便地进行邮件的发送,但需要SMTP服务器的支持.CDO是一个COM组件,太耗系统资源,建议不使用,不过目前已有新版本,可以试试.

文章引用自:http://wuxh.blogdriver.com/wuxh/465524.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值