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类可以为邮件添加附件。
通过对本章的学习,读者可以掌握发送电子邮件的技 巧,还能为应用程序提供自动发送电子邮件的功能。