文章出处: 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, " 测试 ");
marg