System.Net.Mail命名空间是在.NET Framework中新增的,该命名空间提供了发送电子邮件的功能。System.Net.Mail命名空间包含用于将电子邮件发送到SMTP服务器的类,这些类需要结合Microsoft STMP Server一起使用。
概述
System.Net.Mail命名空间下有StmpClient类用于发送邮件,可以完全替代SmtpMail类。利用SmtpClient类的Send方法可以完成发送电子邮件的传输,也可以用SendAsync方法进行异步发送,后者发送完成后产生一个SendCompleted事件来通知发送结束。Send方法可以接受MailMessage类的对象作为参数。通过MailMessage类可以设置邮件更多的内容和格式,例如,为Attachment类设置添加附件的参数。
System.Net.Mail命名空间的类组成
SmtpClient类与SMTP结合在一起,通过MailMessage类、MailAddress类、Attachment类来丰富电子邮件的内容和设置。下面展示了用户通过System.Net.Mail命名空间下的类结合SMTP发送电子邮件的过程。
管理SMTP的类:SmtpClient类
SmtpClient类封装了将电子邮件发送到SMTP服务器的方法和属性。
SmtpCleint类用于让应用程序向Smtp服务器发送电子邮件,可以通过同步或者异步的方法发送电子邮件。通过结合MailMessage类使用,还可以设置邮件的格式、添加抄送人、添加附件等。
语法定义:
SmtpClient类的语法定义如下:
public class SmtpClient
下面的代码演示如何创建一个SmtpClient的实例
SmtpClient client = new SmtpClient("smpt.Sina.com"); //直接通过构造函数设置SMTP主机服务器
或:
SmtpClient client = new SmtpClient();
Client.Host = "smtp.Sina.com"; // 通过Host属性来设置SMTP主机服务器
方法详解:
SmtpClient类主要使用SMTP来同步或异步地发送电子邮件。其中最常用的方法及其说明如下:
发送电子邮件时,只要简单地调用Send方法就可以了,其中Send方法有两个重载:
public void Send(MailMessage message) 其中,参数message是MailMessage类的一个实例。
public void Send(string from ,string recipients,string subject,string body) ,第二个有四个参数,其代表意义如下:
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事件。
管理电子邮件内容的类:MailMessage类
MailMessage类的实例表示一个电子邮件的所有内容,并用SmtpClient类来传输到SMTP服务器。若要指定电子邮件的发件人、收件人和内容,可以是使用MailMessage类的相关属性。
MailMessage类是.NET Framework中管理邮件的专用类,表示可以使用SmtpClient类发送的电子邮件。该类提供了丰富的属性来创建电子邮件,例如可以用Attachments属性添加附件。当一个广告设计师要以网页的形式向客户发送某产品的广告,还需要抄送自己的上司时,则可以设置MailMessage类的IsBodyHtml属性为true,并在CC属性中添加其上司的电子邮箱地址来同时发送。
语法定义
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 类除了继承父类的方法外,没有提供其他方法。但其提供了丰富的属性如下:
属性:
AlternateViews : 为了防止有些电子邮件阅读程序无法显示HTML内容,该属性存储了邮件正文的替代形式的附件集合。
Attachments : 包含了此电子邮件的所有附件
Bcc : 包含此电子邮件密件抄送的收件人地址
Body: 邮件的正文
BodyEncoding : 邮件正文编码
CC :包含了所有此电子邮件抄送的收件人地址
DeliveryNotificationOptions : DeliveryNotificaionOptions枚举类型,确定此电子邮件的发送通知
From : 电子邮件发信人的地址
Headers : 电子邮件的标头
IsBodyHtml : Boolean值,设置邮件正文是文本还是Html格式,默认为文本
Priority : 电子邮件的优先级
ReplyTo : 电子邮件的回复地址,一般与发信人地址相同
Sender : 电子邮件发件人地址
Subject : 电子邮件的主题
SubjectEncoding : 电子邮件的主题内容的编码
To : 包含所有电子邮件的收件人的地址
例子: 使用MailMessage类设置电子邮件的内容
static void Main(string[] args)
{
SmptClient client = new SmptClient();
//此处省略SmtpClient类的其他属性设置
MailMessage message = new MailMessage();
//添加密件抄送人,可以添加多个
message.Bcc.Add("First@domian.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 : 通知传送是否成功
管理电子邮件地址类: MailAddress类
MailAddress 类表示电子邮件的地址。该类结合SmtpClient类或MailAddress类使用,其实例存储了电子邮件的地址信息。MailAddress类是.NET Framwork新增的类,可以设置电子邮件发件人或收件人的地址。通过该类的属性可以获取电子邮件地址的联系人的详细信息。例如电子邮件中显示联系人的名字和SMPT服务器上的用户名。
语法定义
该类的构造函数有三个重载,下面的代码演示了如何创建其实例:
//指定电子邮件的地址构造一个新实例
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);
属性详解
Address: 获取电子邮件的地址
DisplayName : 获取在电子邮件显示的名称
Host : 获取服务器名称,也就是在电子邮件地址@符号后的服务器名称
User : 获取用户名称,也就是在电子邮件地址@符号前的用户名
static void Main(string[] args)
{
MailAddress FromMailBox = new MailMessage("FromMailBox@sina.com","张三");
Console.WriteLine("电子邮件地址是:{0} 显示名:{1} 服务器名:{2} 用户名:{3}",
FromMailBox.Address,FromMailBox.DisplayName,FromMailBox.Host,FromMailBox.User):
}
输出结果: 电子邮件地址是:FromMailBox@sina.com 显示名:张三 服务器名:sina.com 用户名:FromMailBox
表示电子邮件附件的类: Attachment类
Attachment类表示电子邮件的附件集合。该类结合了MailMessage类一起使用,可以为电子邮件添加附件。该类可以使用字符类型和数据流(Stream)的形式创建附件。支持数据流的形式就意味着能用任何的文件格式作为附件,例如TXT格式或DOC格式。
语法定义
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);
属性详解:
Attachment类通过一些属性来访问附件的内容,其中几个重要的属性及其说明如下:
ContentDisposition : 附件的MIME内容处置
ContentStream : 附件的数据流
ContentType : 附件内容的类型
Name : 附件内容的类型名称
下面用例子说明Attachment类属性的用法:
static void Main(string[] args)
{
Attachment content = new Attachment(@"c:\附件.txt",MediaTypeNames.Text.Plain);
ContentDisposition dispositioin = content.ContentDispositioin;
disposition.FileName= “文本附件”;
Console.WriteLine("附件内容名称:{0} 类型名称:{1} 附件文件:{2}",content.Name,content.ContentType.MediaType,content.ContentDisposition.FileName);
}
上面的代码输出结果为: 附件内容名称:附件.txt 类型名称:text/plain 附件文件:文本附件
典型应用:使用Attahment类添加电子邮件的附件
下面演示如何使用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("发送成功!");
}