System.Net.Mail 详细讲解

System.Net.Mail命名空间是在.NET Framework中新增的,该命名空间提供了发送电子邮件的功能。通过对本章的学习,读者可以轻松地使用.NET Framework提供的类库来发送电子邮件。

本章的讲解 流程如图18-1所示。

 

图18-1  发送电子邮件的讲解流程

18.1  System.Net.Mail 简介

System.Net.Mail 命名空间包含用于将电子邮件发送到SMTP服务器的类,这些类需要结合Microsoft SMTP Server一起使用。

18.1.1  System.Net.Mail概述

System.Net.Mail 命名空间下有SmtpClient类用于发送邮件,可以完全代替SmtpMail类。利用SmtpClient类的Send方法可以完成发送电子邮件的传 输,也可以用SendAsync方法进行异步发送,后者发送完成后会产生一个SendCompleted 事件来通知发送结果。 Send方法可以接受MailMessage类的对象作为参数。通过MailMessage类可以设置邮件更多的内容和格式,例如,为 Attachment类设置添加附件的参数。

18.1.2  System.Net.Mail命名空间的类组成

SmtpClient 类与SMTP结合在一起,通过MailMessage类、MailAddress类、Attachment类来丰富电子邮件的内容和设置。图18-2展示 了用户通过System.Net.Mail命名空间下的类结合SMTP发送电子邮件的过程。

 

图18-2  System.Net.Mail命名空间的类组成

18.2  管理SMTP的类:SmtpClient类

SmtpClient 类封装了将电子邮件发送到SMTP服务器的方法和属性。本节将介绍如何使用SmtpClient类来发送电子邮件。

18.2.1  功能说明

SmtpClient 类用于让应用程序向SMTP服务器发送电子邮件,可以通过同步或异步的方法发送电子邮件。通过结合MailMessage类使用,还可以设置邮件的格式、 添加抄送人、添加附件等。

18.2.2  语法定义

SmtpClient类的语法定义如下:

public class SmtpClient

下面的代码演示如何创 建一个SmtpClient的实例。

SmtpClient  client = new SmtpClient (“smtp.Sina.com”); //直接通过构造函数设置SMTP 主机服务器

或:

SmtpClient  client = new SmtpClient ();

Client. Host =” smtp.Sina.com”; //通过Host属性来设置SMTP 主机服务器

18.2.3  方法详解

SmtpClient类主要使用SMTP来同步或异 步地发送电子邮件。其中最常用的方法及其说明如表18-1所示。

发送电子邮件时,只需简单地调用Send方法就可以了,其 中Send方法有两个重载:

public void Send (

     MailMessage message

)

表18-1  SmtpClient类的主要方法及其说明

   

   

Send

将电子邮件发送到 SMTP 服务器以便传递。主线程将在此方法传输邮 件的过程完成后再执行其他操作

SendAsync

异步发送电子邮件。此方法不会阻止调用线程

SendAsyncCancel

取消异步操作以发送电子邮件

其中,参数message 是MailMessage类的一个实例。

public void Send (

     string from,

     string recipients,

     string subject,

     string body

)

第二个重载有4个参数,其代表意义如下。

—  from:包含邮件发件人的地址信息。

—  recipients:包含邮件收件人的地址信息。

—  subject:包含邮件的主题行。

—  body:包含邮件的正文。

下面的代码演示了如何使用Send函数发送电子邮件:

static void Main(string[] args)

        {

        SmtpClient client = new SmtpClient();

        //此处省略了client 属性设置代码

        client.Send("FromMailBox@Sina.com", "ToMailBox@Sina.com", "电子邮件示例", "你好,收到了吗?");

        Console.WriteLine("邮件已经成功发送到{0}", "ToMailBox@Sina.com");

        }

技巧:如果不想 主线程等待传输电子邮件完成后再继续执行,可以使用异步SendAsync方法。SendAsync操作完成时会引发SendCompleted事件。

18.2.4  属性详解

SmtpClient类还有几个重要的属性,如表 18-2所示。

表18-2  SmtpClient类的主要属性及其说明

   

   

Host

获取或设置 SMTP 事 务的服务器名称或 IP 地址

Port

获取或设置 SMTP 事 务的端口

Credentials

获取或设置验证发件人身份的凭据

UseDefaultCredentials

获取或设置 Boolean 值, 该值控制 DefaultCredentials 是否随请求一起发送。如果使用默认凭据,则为 true , 否则为 false 。默认值为 false

若要使用 SmtpClient发送电子邮件,Host, Port, Credentials这三个属性是必须设置的。Host属性在前面已经介绍过。Port属性设置用于SMTP事务的端口,该属性的默认值为25。 Credentials属性是一个IcredentialsByHost类型。下面的代码演示了如何使用这些属性:

static void Main(string[] args)

 {

     SmtpClient client = new SmtpClient();

     client.Host = "smtp.Sina.com";

     client.Port = 25;

     client.Credentials =  new System.Net.NetworkCredential("账号", "***密码**");

     Console.WriteLine(" SMTP 事务的主机:{0} 端口:{1} 账号:{2} 密码:{3}", client.Host,client. Port,

        ((System.Net.NetworkCredential)client.Credentials).UserName,

        ((System.Net.NetworkCredential)client.Credentials).Password);

}

上面的代码输出结果 为:

SMTP 事务的主机: smtp.Sina.com 端口:25 账号: 账号 密码: ***密码**

18.2.5  典型应用:异步发送电子邮件

下面演示如何使用 SmtpClient类异步发送电子邮件,代码如下:

   static bool mailSent = false;//标志邮件是否发送成功

   public static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)

            {

                String token = (string)e.UserState;

                if (e.Cancelled)

                {

                    Console.WriteLine("取消发送" + token);

                }

                if (e.Error != null)

                {

                    Console.WriteLine(e.Error.ToString());

                }

                else

                {

                    Console.WriteLine("邮件已经发送");

                }

                mailSent = true;

            }

            public static void Main(string[] args)

            {

               MailAddress from = new MailAddress("applehuang2000@Sina.com ", "测试账号");

               //收件人地址

               MailAddress to = new MailAddress("h.gp@163.com", "hello");

               MailMessage message = new MailMessage(from, to);

               message.Subject = "标题"; // 设置邮件的标题

               message.Body = "发送邮件的正文";

               message.BodyEncoding = System.Text.Encoding.Default;

               //创建一个SmtpClient 类的新实例,并初始化实例的SMTP 事务的服务器

               SmtpClient client = new SmtpClient(@"smtp.Sina.com");

               client.DeliveryMethod = SmtpDeliveryMethod.Network;

               client.UseDefaultCredentials = false;

               client.EnableSsl = false;

               //身份认证

               client.Credentials = new

System.Net.NetworkCredential("applehuang2000@Sina.com", "123456");

               client.SendCompleted += new

               SendCompletedEventHandler(SendCompletedCallback);

               client.SendAsync(message, "测试");

               Console.WriteLine("输入字母C取消发送");

               string answer = Console.ReadLine();

               if (answer.StartsWith("c") && mailSent == false)

               {

                   client.SendAsyncCancel();//取消发送

               }

               message.Dispose();

            }

18.3  管理电子邮件内容的类:MailMessage类

MailMessage 类的实例表示一个电子邮件的所有内容,并用SmtpClient类来传输到SMTP服务器。若要指定电子邮件的发件人、收件人和内容,可以使用 MailMessage类的关联属性。

18.3.1  功能说明

MailMessage类是.NET Framework中管理邮件的专用类,表示可以使用SmtpClient类发送的电子邮件。该类提供了丰富的属性来创建电子邮件,例如可以用 Attachments属性添加附件。当一个广告设计师需要以网页的形式向客户发送某产品的广告,还需要抄送给自己的上司时,则可以设置 MailMessage类的IsBodyHtml属性为true,并在CC属性中添加其上司的电子邮箱地址来同时发送。

18.3.2  语法定义

MailMessage类的语法定义如下:

public class MailMessage :IDisposable

该类的构造函数有三个重载。下面的代码演示如何创建一个 MailMessage类的实例:

MailMessage message = new MailMessage ();//无参数

//通过构造函数设置SMTP 主机服务器      

MailMessage message = new MailMessage (“smtp.Sina.com”);    

//通过构造函数设置SMTP 主机服务器 和端口      

MailMessage message = new MailMessage (“smtp.Sina.com”,25);  

18.3.3  属性详解

MailMessage类除了继承父类的方法外,没 有提供其他方法。但其提供了丰富的属性,如表18-3所示。

表18-3  MailMessage类的主要属性及其说明

   

   

AlternateViews

为了防止 有些电子邮件阅读程序无法显示 HTML 内容,该属性存储了邮件正文的替代形式的附件集合

Attachments

包含了此 电子邮件的所有附件

Bcc

包含了所 有此电子邮件密件抄送的收件人地址

Body

邮件的正 文

BodyEncoding

邮件正文 的编码

CC

包含了所 有此电子邮件抄送的收件人地址

DeliveryNotificationOptions

DeliveryNotificationOptions 枚 举类型,确定此电子邮件的发送通知

From

电子邮件 发信人的地址

Headers

电子邮件 的标头

IsBodyHtml

Boolean 值, 设置邮件正文是文本还是 Html 格式,默认为文本

Priority

电子邮件 的优先级

ReplyTo

电子邮件 的回复地址,一般与发信人地址相同

Sender

电子邮件 的发件人地址

Subject

电子邮件 的主题

SubjectEncoding

电子邮件 的主题内容的编码

To

包含所有 电子邮件的收件人的地址

18.3.4  典型应用:使用MailMessage类设置电子邮件的内容

下面通过设置 MailMessage类的属性,丰富电子邮件的内容。代码如下:

static void Main(string[] args)

        {

            SmtpClient client = new SmtpClient();

            //此处省略 SmtpClient 类的其他属性设置

            MailMessage message = new MailMessage();

            //添加密件抄送人,可以添加多个

            message.Bcc.Add("First@domain.com");

            message.Bcc.Add("Second@domain.com");

            message.Body = "这是邮件的正文部分";

            //设置正文的编码形式.这里的设置为取系统默认编码

            message.BodyEncoding = System.Text.Encoding.Default;

            //添加一般抄送人,可以添加多个

            message.Bcc.Add("First@domain.com");

            message.Bcc.Add("Second@domain.com");

            //邮件传送通知选项

            message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;

            message.From =new MailAddress("FromMailBox@Sina.com");

            message.IsBodyHtml = false;

            //设置邮件的优先级为正常

            message.Priority = MailPriority.Normal;

            message.ReplyTo = new MailAddress("FromMailBox@Sina.com");

            message.Sender = new MailAddress("FromMailBox@Sina.com");

            message.Subject = "这是邮件的主题";

            //设置主题的编码形式.这里的设置为取系统默认编码

            message.SubjectEncoding = System.Text.Encoding.Default;

            client.Send(message); //发送邮件

            Console.WriteLine("发送成功!");

}

在上面的代码中用 到了DeliveryNotificationOptions枚举类型。该类型有5个成员值,具体代表意义如下。

—  Delay:通知传送是否延迟。

—  Never:从不通知。

—  None:没有通知。

—  OnFailure:通知传送是否失败。

—  OnSuccess:通知传送是否成功。

18.4  管理电子邮件地址的类:MailAddress类

MailAddress类表示电子邮件的地址。该类 结合SmtpClient类或MailMessage类使用,其实例存储了电子邮件的地址信息。本节将介绍如何使用该类来设置电子邮件的地址。

18.4.1  功能说明

MailAddress类是.NET Framework新增的类,可以设置电子邮件发件人或收件人的地址。通过该类的属性可以获取电子邮件地址的联系人的详细信息。例如邮件中显示联系人的名 字和SMTP服务器上的用户名。

18.4.2  语法定义

MailAddress类 的语法定义如下:

public class MailAddress

该类的构造函数有三个重载,下面的代码演示如何创建其实例:

//指定电子邮件的地址构造一个新实例

MailAddress FromMailBox = new MailAddress (“FromMailBox@Sina.com”);

//指定电子邮件的地址和显示名称构造一个新实例  

MailAddress FromMailBox = new MailAddress (“FromMailBox@Sina.com”,”显示名称”);    

//指定电子邮件的地址、显示名称和显示名称的编码构造一个新实例

MailAddress FromMailBox = new MailAddress ("FromMailBox@Sina.com","显示名称",System.Text.Encoding.Default);

18.4.3  属性详解

MailAddress类除了继承父类的方法外,没 有提供其他方法。该类的主要属性及其说明如表18-4所示。

表18-4  MailAddress类的主要属性及其说明

   

   

Address

获取电子邮件的地址

DisplayName

获取在电子邮件显示的名称

Host

获取服务器名称,也就是在电子邮件地址 @ 符 号后的服务器名

User

获取用户名称,也就是在电子邮件地址 @ 符 号前的用户名

18.4.4  典型应用:通过MailAddress类获取邮件地址信息

下面演示如 何通过构造一个MailAddress类的实例,从其属性中获取电子邮件地址的信息。代码如下:

static void Main(string[] args)

        {

           MailAddress FromMailBox = new MailAddress (“FromMailBox@Sina.com”,”张三”);  

           Console.WriteLine("电子邮箱地址是:{0} 显示名:{1} 服务器名:{2} 用户名:{3}", FromMailBox.Address,FromMailBox.DisplayName,FromMailBox.Host,FromMailBox. User);

        }

上面的代码输出结果为:

电子邮箱地址是: FromMailBox@Sina.com 显示名:张三 服务器名: Sina.com 用户名: FromMailBox

18.5  表示电子邮件附件的类:Attachment类

Attachment类表示电子邮件的附件的集合。 该类结合MailMessage类一起使用,可以为电子邮件添加附件。本节将介绍如何给电子邮件添加附件。

18.5.1  功能说明

Attachment类与MailMessage类 结合在一起使用,用于给电子邮件添加附件。该类可以使用字符类型(String)和数据流(Stream)的形式创建附件。支持数据流的形式就意味着能用 任何的文件格式作为附件,例如TXT格式或DOC格式。

18.5.2  语法定义

Attachment类的 语法定义如下:

public class Attachment : AttachmentBase

该类的构造函数有6个重载,下面演示创建一个Attachment 类的实例的两种常用方式。

Attachment Item = new Attachment (@“c:/附件.txt”, MediaTypeNames.Text.Plain);

以上这种情况,第一个参数为附件的路径,第二个参数为附件的 MIME内容标头信息,简单来说就是标明文件的格式。

System.IO.FileInfo file =new System.IO.FileInfo(@"C:/附件.txt");

System.IO.FileStream stream = file.OpenRead();

Attachment item = new Attachment(stream, MediaTypeNames.Text.Plain);

第二种情况,第一 个参数以数据流的方式传入。数据流可以从文件中读出,也可以从数据库中读出。第二个参数跟上一种情况相同。

18.5.3  方法详解

除了通过new关键字实例 化一个Attachment类对象外,还可以用Attachment类提供的静态方法CreateAttachmentFromString来创建该类的 一个实例。下面的代码演示了如何使用CreateAttachmentFromString方法:

Attachment Item =Attachment.CreateAttachmentFromString(@“c:/附件.txt”, MediaTypeNames.Text.Plain);

18.5.4  属性详解

Attachment类通过一些属性来访问附件的内 容,其中几个重要属性及其说明如表18-5所示。

表18-5  Attachment类的主要属性及其说明

   

   

   

   

ContentDisposition

附件的 MIME 内容处置

ContentType

附件内容的类型

ContentStream

附件的流数据

Name

附件内容的类型名称

下面用例子来说明Attachment类属性的用法。

static void Main(string[] args)

   {

       Attachment content = new Attachment(@"c:/附件.txt", MediaTypeNames.Text.Plain);

       ContentDisposition disposition = content.ContentDisposition;

       disposition.FileName = "文本附件";

       Console.WriteLine("附件内容名称:{0} 类型名称:{1} 附件文件名: {2}",content.Name,content.ContentType.MediaType,content.ContentDisposition.FileName);}

上面的代码输出结果为:

附件内容名称:附件.txt 类型名称:text/plain 附件文件名:文本附件

18.5.5  典型应用:使用Attachment类添加电子邮件的附件

下面演示如何使用Attachment类为电子邮件添加一个文本附 件,代码如下:

static void Main(string[] args)

      {

          SmtpClient client = new SmtpClient();

          //此处省略 SmtpClient 类的其他属性设置

          MailMessage message = new MailMessage();

          message.Body = "这是邮件的正文部分";

          //设置正文的编码形式.这里的设置为取系统默认编码

          message.BodyEncoding = System.Text.Encoding.Default;

          message.From = new MailAddress("FromMailBox@Sina.com");

          message.IsBodyHtml = false;

          message.ReplyTo = new MailAddress("FromMailBox@Sina.com");

          message.Sender = new MailAddress("FromMailBox@Sina.com");

          message.Subject = "这是邮件的主题";

          //添加附件

          Attachment content = new Attachment(@"c:/附件.txt", MediaTypeNames.Text.Plain);

          message.Attachments.Add(content);

          //设置主题的编码形式.这里的设置为取系统默认编码

          message.SubjectEncoding = System.Text.Encoding.Default;

          client.Send(message); //发送邮件

          Console.WriteLine("发送成功!");

      }

18.6  应用实例:发送电子邮件程序

结合本章学习的内容,下面将实现一个电子邮件发送程 序,详细步骤如下。

*      在VS2005中创建一个Windows应用程序,命名为 “SendMail”。

*      打开默认生成的Form1的设计界面。从工具箱中选择控 件,把界面设计成图18-3所示的样式。

图18-3  示例界面设计

*      设置控件的属性,其中主要控件的属性设置如表18-6所 示。

表18-6  主要控件属性

   

   

Name 属 性

   

TextBox

收件人地址

txtAddress

 

TextBox

标题

txtTitle

 

TextBox

内容

txtContent

Mutiline 属性为 True

TextBox

附件

txtAttachment

ReadOnly 属性为 True

Button

发送

btSend

 

Button

添加附件

btAddAttachment

 

*      双击“发送”按钮,打开代码视图,在代码窗口的顶部添加对 命名空间的引用,代码如下:

using System.Net.Mail;

     在“发送”按钮的Click事件中,添加对 SendMail函数的调用,代码如下:

private void btSend_Click(object sender, EventArgs e)

{

    if (SendMail())

    {

        MessageBox.Show("发送成功");

    }

}

   编写SendMail函数,代码如下:

//发送电子邮件成功返回True,失败返回False

private bool SendMail()

{

    MailAddress from = new MailAddress("FromMailBox@Sina.com ", "测试账号");

    //收件人地址

    MailAddress to = new MailAddress(this.txtAddress.Text, "hello");

    MailMessage message = new MailMessage(from, to);

    //添加附件,判断文件存在就添加

    if(System.IO.File.Exists(this.txtAttachment.Text))

    {

       Attachment item =new Attachment(this.txtAttachment.Text, MediaTypeNames.Text.Plain);

        message.Attachments.Add(item);

    }

    message.Subject = this.txtTitle.Text; // 设置邮件的标题

    message.Body = this.txtContent.Text; //发送邮件的正文

    message.BodyEncoding = System.Text.Encoding.Default;

    MailAddress other = new MailAddress("otherPerson@163.com");

    message.CC.Add(other); //添加抄送人

    //创建一个SmtpClient 类的新实例,并初始化实例的SMTP 事务的服务器

    SmtpClient client = new SmtpClient(@"smtp.Sina.com");

    client.DeliveryMethod = SmtpDeliveryMethod.Network;

    client.UseDefaultCredentials = false;

    client.EnableSsl = false;

    //身份认证

    client.Credentials = new System.Net.NetworkCredential("FromMailBox@Sina.com", "*****");

    bool ret =true; //返回值

    try

    {

        client.Send(message);

     }

    catch (SmtpException ex)

    {

        MessageBox.Show(ex.Message);

        ret =false;

    }

    catch(Exception ex2)

    {

        MessageBox.Show(ex2.Message);

        ret = false;

    }

    return ret;

}

   按F5键运行程序,测试邮件的发送功能。

技巧:为了简化程序,上列中用于发送邮件的地址 HardCode(硬代码)了,读者可以增加输入框来录入发送地址、密码和SMTP服务器等信息,让程序变得更灵活。

18.7  小结

本章主要介绍了如何使用 System.Net.Mail命名空间下的类。其中,SmtpClient类可以发送电子邮件,MailMessage类可以丰富电子邮件的内 容,MailAddress类可以设置电子邮件的收件人或发件人的电子邮件地址,Attachment类可以为邮件添加附件。

通过对本章的学习,读者可以掌握发送电子邮件的技 巧,还能为应用程序提供自动发送电子邮件的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值