文章出处: http://book.csdn.net/bookfiles/694/10069421607.shtml
本章导读
System.Net.Mail 命名空间是在 .NET Framework 中新增的,该命名空间提供了发送电子邮件的功能。通过对本章的学习,读者可以轻松地使用 .NET Framework 提供的类库来发送电子邮件。
System.Net.Mail 简介
System.Net.Mail 命名空间包含用于将电子邮件发送到 SMTP 服务器的类,这些类需要结合 Microsoft SMTP Server 一起使用。
System.Net.Mail 概述
System.Net.Mail 命名空间下有 SmtpClient 类用于发送邮件,可以完全代替 SmtpMail 类。利用 SmtpClient 类的 Send 方法可以完成发送电子邮件的传输,也可以用 SendAsync 方法进行异步发送,后者发送完成后会产生一个 SendCompleted 事件来通知发送结果。 Send 方法可以接受 MailMessage 类的对象作为参数。通过 MailMessage 类可以设置邮件更多的内容和格式,例如,为 Attachment 类设置添加附件的参数。
System.Net.Mail 命名空间的类组成
SmtpClient 类与 SMTP 结合在一起,通过 MailMessage 类、 MailAddress 类、 Attachment 类来丰富电子邮件的内容和设置。图 18-2 展示了用户通过 System.Net.Mail 命名空间下的类结合 SMTP 发送电子邮件的过程。
管理 SMTP 的类: SmtpClient 类
SmtpClient 类封装了将电子邮件发送到 SMTP 服务器的方法和属性。本节将介绍如何使用 SmtpClient 类来发送电子邮件。
功能说明
SmtpClient 类用于让应用程序向 SMTP 服务器发送电子邮件,可以通过同步或异步的方法发送电子邮件。通过结合 MailMessage 类使用,还可以设置邮件的格式、添加抄送人、添加附件等。
语法定义
SmtpClient 类的语法定义如下:
public class SmtpClient
下面的代码演示如何创建一个 SmtpClient 的实例。
SmtpClient client = new SmtpClient ( “ smtp.Sina.com ” ); // 直接通过构造函数设置 SMTP 主机服务器
或:
SmtpClient client = new SmtpClient ();
Client. Host = ” smtp.Sina.com ” ; // 通过 Host 属性来设置 SMTP 主机服务器
方法详解
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("[email protected]", "[email protected]", " 电子邮件示例 ", " 你好 , 收到了吗 ?");
Console.WriteLine(" 邮件已经成功发送到 {0}", "[email protected]");
}
技巧:如果不想主线程等待传输电子邮件完成后再继续执行,可以使用异步 SendAsync 方法。 SendAsync 操作完成时会引发 SendCompleted 事件。
属性详解
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 账号 : 账号 密码 : *** 密码 **
典型应用:异步发送电子邮件
下面演示如何使用 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("[email protected] ", " 测试账号 ");
// 收件人地址
MailAddress to = new MailAddress("[email protected]", "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("[email protected]", "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();
}
管理电子邮件内容的类: MailMessage 类
MailMessage 类的实例表示一个电子邮件的所有内容,并用 SmtpClient 类来传输到 SMTP 服务器。若要指定电子邮件的发件人、收件人和内容,可以使用 MailMessage 类的关联属性。
功能说明
MailMessage 类是 .NET Framework 中管理邮件的专用类,表示可以使用 SmtpClient 类发送的电子邮件。该类提供了丰富的属性来创建电子邮件,例如可以用 Attachments 属性添加附件。当一个广告设计师需要以网页的形式向客户发送某产品的广告,还需要抄送给自己的上司时,则可以设置 MailMessage 类的 IsBodyHtml 属性为 true ,并在 CC 属性中添加其上司的电子邮箱地址来同时发送。
语法定义
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);
属性详解
MailMessage 类除了继承父类的方法外,没有提供其他方法。但其提供了丰富的属性,如表 18-3 所示。
AlternateViews
为了防止有些电子邮件阅读程序无法显示 HTML 内容,该属性存储了邮件正文的替代形式的附件集合
Attachments
包含了此电子邮件的所有附件
Bcc
包含了所有此电子邮件密件抄送的收件人地址
Body
邮件的正文
BodyEncoding
邮件正文的编码
CC
包含了所有此电子邮件抄送的收件人地址
DeliveryNotificationOptions
DeliveryNotificationOptions 枚举类型,确定此电子邮件的发送通知
From
电子邮件发信人的地址
Headers
电子邮件的标头
IsBodyHtml
Boolean 值,设置邮件正文是文本还是 Html 格式,默认为文本
Priority
电子邮件的优先级
ReplyTo
电子邮件的回复地址,一般与发信人地址相同
Sender
电子邮件的发件人地址
Subject
电子邮件的主题
SubjectEncoding
电子邮件的主题内容的编码
To
包含所有电子邮件的收件人的地址
典型应用:使用 MailMessage 类设置电子邮件的内容
下面通过设置 MailMessage 类的属性,丰富电子邮件的内容。代码如下:
static void Main(string[] args)
{
SmtpClient client = new SmtpClient();
// 此处省略 SmtpClient 类的其他属性设置
MailMessage message = new MailMessage();
// 添加密件抄送人 , 可以添加多个
message.Bcc.Add("[email protected]");
message.Bcc.Add("[email protected]");
message.Body = " 这是邮件的正文部分 ";
// 设置正文的编码形式 . 这里的设置为取系统默认编码
message.BodyEncoding = System.Text.Encoding.Default;
// 添加一般抄送人 , 可以添加多个
message.Bcc.Add("[email protected]");
message.Bcc.Add("[email protected]");
// 邮件传送通知选项
message.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
message.From =new MailAddress("[email protected]");
message.IsBodyHtml = false;
// 设置邮件的优先级为正常
message.Priority = MailPriority.Normal;
message.ReplyTo = new MailAddress("[email protected]");
message.Sender = new MailAddress("[email protected]");
message.Subject = " 这是邮件的主题 ";
// 设置主题的编码形式 . 这里的设置为取系统默认编码
message.SubjectEncoding = System.Text.Encoding.Default;
client.Send(message); // 发送邮件
Console.WriteLine(" 发送成功 !");
}
在上面的代码中用到了 DeliveryNotificationOptions 枚举类型。该类型有 5 个成员值,具体代表意义如下。
— Delay :通知传送是否延迟。
— Never :从不通知。
— None :没有通知。
— OnFailure :通知传送是否失败。
— OnSuccess :通知传送是否成功。
管理电子邮件地址的类: MailAddress 类
MailAddress 类表示电子邮件的地址。该类结合 SmtpClient 类或 MailMessage 类使用,其实例存储了电子邮件的地址信息。本节将介绍如何使用该类来设置电子邮件的地址。
功能说明
MailAddress 类是 .NET Framework 新增的类,可以设置电子邮件发件人或收件人的地址。通过该类的属性可以获取电子邮件地址的联系人的详细信息。例如邮件中显示联系人的名字和 SMTP 服务器上的用户名。
语法定义
MailAddress 类的语法定义如下:
public class MailAddress
该类的构造函数有三个重载,下面的代码演示如何创建其实例:
// 指定电子邮件的地址构造一个新实例
MailAddress FromMailBox = new MailAddress (“[email protected]”);
// 指定电子邮件的地址和显示名称构造一个新实例
MailAddress FromMailBox = new MailAddress ( “ [email protected] ” , ”显示名称” );
// 指定电子邮件的地址、显示名称和显示名称的编码构造一个新实例
MailAddress FromMailBox = new MailAddress ("[email protected]"," 显示名称 ",System.Text.Encoding.Default);
属性详解
MailAddress 类除了继承父类的方法外,没有提供其他方法。该类的主要属性及其说明如表
Address
获取电子邮件的地址
DisplayName
获取在电子邮件显示的名称
Host
获取服务器名称,也就是在电子邮件地址 @ 符号后的服务器名
User
获取用户名称,也就是在电子邮件地址 @ 符号前的用户名
典型应用:通过 MailAddress 类获取邮件地址信息
下面演示如何通过构造一个 MailAddress 类的实例,从其属性中获取电子邮件地址的信息。代码如下:
static void Main(string[] args)
{
MailAddress FromMailBox = new MailAddress ( “ [email protected] ” , ”张三” );
Console.WriteLine(" 电子邮箱地址是 :{0} 显示名 :{1} 服务器名 :{2} 用户名 :{3}", FromMailBox.Address,FromMailBox.DisplayName,FromMailBox.Host,FromMailBox. User);
}
上面的代码输出结果为:
电子邮箱地址是 : [email protected] 显示名 : 张三 服务器名 : Sina.com 用户名 : FromMailBox
表示电子邮件附件的类: Attachment 类
Attachment 类表示电子邮件的附件的集合。该类结合 MailMessage 类一起使用,可以为电子邮件添加附件。本节将介绍如何给电子邮件添加附件。
功能说明
Attachment 类与 MailMessage 类结合在一起使用,用于给电子邮件添加附件。该类可以使用字符类型( String )和数据流( Stream )的形式创建附件。支持数据流的形式就意味着能用任何的文件格式作为附件,例如 TXT 格式或 DOC 格式。
语法定义
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);
第二种情况,第一个参数以数据流的方式传入。数据流可以从文件中读出,也可以从数据库中读出。第二个参数跟上一种情况相同。
方法详解
除了通过 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("[email protected]");
message.IsBodyHtml = false;
message.ReplyTo = new MailAddress("[email protected]");
message.Sender = new MailAddress("[email protected]");
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 主要控件属性
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("[email protected] ", " 测试账号 ");
// 收件人地址
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("[email protected]");
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("[email protected]", "*****");
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 类可以为邮件添加附件。
通过对本章的学习,读者可以掌握发送电子邮件的技巧,还能为应用程序提供自动发送电子邮件的功能