设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

.NET开发邮件发送功能的全面教程(含邮件组件源码)

2013-9-3 15:01| 发布者: 红黑魂| 查看: 12287| 评论: 0|来自: 博客园

摘要: `今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能。在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1) 邮件基础理论知识 2) 邮件发送相关.NET类库 3) 介绍我开发的一个发 ...

 

邮件发送相关.NET类库

.net1.1 ,用System.Web.Mail发送邮件。在.net2.0及之后版本,用System.Net.Mail发送邮件。主要用到了在.net2.0中新增的两个类,分别是System.Net.Mail.MailMessageSystem.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
{
    //电子邮件通过网络发送到 SMTP 服务器。
    Network = 0,
    //将电子邮件复制到SmtpClient.PickupDirectoryLocation属性指定的目录,然后由外部应用程序传送。
    SpecifiedPickupDirectory = 1,
    //将电子邮件复制到拾取目录,然后通过本地 Internet 信息服务 (IIS) 传送。
    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);
 
// 获取或设置此附件的 MIME 内容 ID。
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)         添加LinkedResourceAlternateView

4)         添加AlternateViewMailMessage

5)         设置SmtpClient,发送email

 



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部