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