邮件发送相关.NET类库
在 .net1.1 ,用System.Web.Mail发送邮件。在.net2.0及之后版本,用System.Net.Mail发送邮件。主要用到了在.net2.0中新增的两个类,分别是System.Net.Mail.MailMessage和System.Net.Mail.SmtpClient两个类,在SMTP身份验证方面用到了System.Net.NetworkCredential类。
1. MailMessage 类表示邮件的内容。
MailMessage常用属性
|
From
|
MailAddress
|
获取或设置此电子邮件的发信人地址。
两者区别:當 Sender 與 From 都有設定時,Mail Server 會取用 Sender 的設定發信,但郵件上的名稱會使用 From 的設定,而若不需要 Sender 和 From 同時設定時,則 Sender 可以免設,但 From 一定要設。详细请看:《MailMessage 的 Sender 和 From? 傻傻分不清楚》
|
Sender
|
To
|
MailAddressCollection
|
获取包含此电子邮件的收件人的地址集合。
|
CC
|
MailAddressCollection
|
获取包含此电子邮件的抄送 (CC) 收件人的地址集合。
|
Bcc
|
MailAddressCollection
|
获取包含此电子邮件的密件抄送 (BCC) 收件人的地址集合。
|
Attachments
|
AttachmentCollection
|
获取用于存储附加到此电子邮件的数据的附件集合。
|
Subject
|
string
|
获取或设置此电子邮件的主题。
|
Body
|
string
|
获取或设置邮件正文。
|
AlternateViews
|
AlternateViewCollection
|
指定一个电子邮件不同格式显示的副本。(eg:发送HTML格式的邮件,可能希望同时提供邮件的纯文本格式,以防止一些收件人使用的电子邮件阅读程序无法显示html内容)
|
IsBodyHtml
|
bool
|
默认false。获取或设置指示邮件正文是否为 Html 格式的值。
|
Priority
|
MailPriority
|
默认Normal。获取或设置此电子邮件的优先级。(Normal | Low| High)
|
SubjectEncoding
|
Encoding
|
获取或设置此电子邮件的主题内容使用的编码。
|
BodyEncoding
|
Encoding
|
获取或设置用于邮件正文的编码。
|
ReplyToList
|
MailAddressCollection
|
设置接收方回复邮件时默认的接收地址,eg:你用一个邮箱发信,但却用另一个来收信。
(ReplyTo,表示单个回复地址,已过期,使用ReplyToList代替)
|
下面属性想不到用在什么场景……请高人指出使用案例,谢谢!
|
DeliveryNotificationOptions
|
DeliveryNotificationOptions
|
默认None。获取或设置此电子邮件的发送通知。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [Flags]
public enum DeliveryNotificationOptions
{
None = 0,
OnSuccess = 1,
OnFailure = 2,
Delay = 4,
Never = 134217728,
}
|
不懂干嘛的,设置为OnSuccess,不会回复我发送成功。设置为Never,发送失败也会回复我。。。
|
Headers
|
NameValueCollection
|
获取与此电子邮件一起传输的电子邮件标头。(什么时候需要自己去设置?)
|
HeadersEncoding
|
Encoding
|
获取或设置此电子邮件的用户定义的自定义标题使用的编码。
|
|
|
|
|
|
2. SmtpClient类用于将电子邮件发送到 SMTP 服务器以便传递。
SmtpClient常用属性
|
Host
|
string
|
获取或设置用于 SMTP 事务的主机的名称或 IP 地址。
|
Port
|
int
|
获取或设置用于 SMTP 事务的端口。
|
UseDefaultCredentials
|
bool
|
默认false。
若要使用默认网络凭据,可以将UseDefaultCredentials设置为 true,此时System.Net.CredentialCache.DefaultCredentials(应用程序系统凭证)会随请求一起发送。
如果UseDefaultCredentials属性设置为 false,则连接到服务器时会将 Credentials 属性中设置的值用作凭据。如果UseDefaultCredentials属性设置为 false 并且尚未设置 Credentials 属性,则将邮件以匿名方式发送到服务器。若SMTP 服务器要求在验证客户端的身份则会抛出异常。
|
Credentials
|
ICredentialsByHost
|
获取或设置用于验证发件人身份的凭据。
|
ClientCertificates
|
X509CertificateCollection
|
指定应该使用哪些证书来建立安全套接字层 (SSL) 连接。
|
EnableSsl
|
bool
|
默认false。指定SmtpClient是否使用安全套接字层 (SSL) 加密连接。
|
Timeout
|
int
|
默认100000.获取或设置一个值,该值指定同步重载:SmtpClient.Send()调用的超时时间。
|
自建本地SMTP服务器获取邮件时需要使用的属性:
|
DeliveryMethod
|
SmtpDeliveryMethod
|
默认NetworkCredential。
1 2 3 4 5 6 7 8 9 10 | public enum SmtpDeliveryMethod
{
Network = 0,
SpecifiedPickupDirectory = 1,
PickupDirectoryFromIis = 2,
}
|
|
PickupDirectoryLocation
|
string
|
获取或设置文件夹,应用程序在该文件夹中保存将由本地 SMTP 服务器处理的邮件。
|
下面属性想不到用在什么场景……请高人指出使用案例,谢谢!
|
TargetName
|
string
|
"SMTPSVC/" + this.host。获取或设置在使用扩展保护时用于身份验证的服务提供程序名称 (SPN)。
|
ServicePoint
|
ServicePoint
|
获取用于传输电子邮件的网络连接。(应该会保存TCP连接,避免再次进行TCP的三次握手???)
|
3. 一个简单的邮件发送示例
1 2 3 4 5 6 7 8 9 | MailMessage mail = new MailMessage();
mail.From = new MailAddress(From, FromDisplayName);
mail.To.Add( new MailAddress(To, ToDisplayName));
mail.Subject = "this is a test email." ;
mail.Body = "this is my test email body.<br><b>this part is in bold</b>" ;
mail.IsBodyHtml = true ;
SmtpClient smtp = new SmtpClient(host, port);
smtp.Credentials = new NetworkCredential(userName, password);
smtp.Send(mail);
|
4. 邮件扩展:如何发送内嵌资源(eg:图片、mp3等等)
详细请看:http://www.cnblogs.com/SkyD/archive/2009/05/11/1453868.html(斯克迪亚)
通过 ContentDisposition 类实现此功能,内嵌的资源只做为文件内容显示,不再在附件列表中出现。ContentDisposition 类表示 MIME 协议 Content-Disposition 标头。
对于文件附件,可以使用 ContentDisposition 的属性来设置文件大小、文件的创建日期、上次读取文件的日期以及上次修改文件的日期。对于所有附件,考虑到附件有可能会存储到接收计算机上,可以设置一个建议的文件名。显示电子邮件的软件可以使用 ContentDisposition 中的信息,按发件人预期的方式呈现电子邮件附件。
通过 ContentDisposition 实例的Inline属性实现邮件内嵌资源。如下:
1) 设置附件的ContentId属性为一个自定义名称。
2) 设置附件的ContentDisposition.Inline属性为true。
3) 在邮件的HTML格式正文中以“cid:自定义名称”的方式引用,比如ContentId设为“face”,那么正文中就以“cid:face”作为其URL路径字符串的替代即可。
代码如下:(详细见示例代码)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | string picPath = Environment.CurrentDirectory + "\\附件\\PIC_Mail中文.png" ;
Attachment attach_pic = new Attachment(picPath);
attach_pic.ContentId = "MyPic" ;
System.Net.Mime.ContentDisposition disposition = attach_pic.ContentDisposition;
disposition.Inline = true ;
FileInfo file = new FileInfo(picPath);
disposition.CreationDate = file.CreationTime;
disposition.ModificationDate = file.LastWriteTime;
disposition.ReadDate = file.LastAccessTime;
disposition.FileName = file.Name.ToString();
mail.AddAttachment(attach_pic);
|
另外,可使用AlternateView类和LinkedResource类来实现内嵌资源……
1) 创建一个MailMessage对象,同时指定发送人和接收人地址。
2) 创建AlternateView来接收文本内容,创建LinkedResource来接收要嵌入的图片或其他资源。
3) 添加LinkedResource到AlternateView
4) 添加AlternateView到MailMessage
5) 设置SmtpClient,发送email
|