2022-12-29 分类: 网站建设
今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能。在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下:
1) 邮件基础理论知识
2) 邮件发送相关.NET类库
3) 介绍我开发的一个发送邮件的小组件(MailHelper)
4) MailHelper组件的一个示例以及几种方式发邮件的优劣测试
示例及组件源码:
.NET开发邮件发送功能的全面教程(含邮件组件源码).rar
邮件基础理论知识
什么业务需要邮件功能?
1. 服务提供方:需提供邮件收发客户端或Web服务。(eg:Outlook、QQ邮箱)。当然这些服务都是知名商提供。若是一般的小网站提供的邮件收发服务,不知道节操如何,谁敢用呢?就算你用了,别的知名商SMTP服务器也不认可从这小网站发出的邮件,出现SMTP服务器拒收来源邮件(视为恶意邮件或垃圾邮件)。
2. 安全性、机密性:比如某安全部门需要提供自己发邮件的SMTP服务器和收邮件POP3服务器以及相应的操作软件
3. 电子商务、论坛等会员机制社区:主家需要向会员发送通知信息,比如:密码重置、降价通知、留言通知、回复通知、订阅通知、会员间交流等等。主家保证邮箱有效性的办法常常是通过会员注册、更换邮箱时发送“激活邮件”。
4. 邮件营销:在大数据时代的现在,企业可以根据所掌握的数据预测客户的需求,来提供主动推送营销消息的功能;当然也有没有预测能力的小商家通过邮件群发器进行撒网式邮件营销。
5. 等等
什么是电子邮件协议?
当前常用的电子邮件协议有SMTP、POP3、IMAP4,它们都隶属于TCP/IP协议簇。
1. SMTP
Simple Mail Transfer Protocol(即简单邮件传输协议),它是一组用于从源地址到目的地址传送邮件的规则,简单的说就是:From-->To的传送规则。由SMTP来控制信件中转的方式。SMTP属于TCP/IP家族中的一员,它帮助每一台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-Mail寄到收信人的服务器上。SMTP服务器则是遵循SMTP协议的邮件发送服务器,用来中转你发出的电子邮件。
SMTP目前已是事实上的E-Mail传输的标准。
2. POP3
Post Office Protocol 3(即邮局协议的第3个版本),负责从邮件服务器中检索电子邮件。它要求邮件服务器完成下面几种任务之一:从邮件服务器中检索邮件并从服务器中删除这个邮件;从邮件服务器中检索邮件但不删除它;不检索邮件,只是询问是否有新邮件到达。
POP3是因特网电子邮件的第一个离线协议标准。
3. IMAP4
Internet Message Access Protocol 4(即交互式数据消息访问协议第四个版本),提供脱机和联机访问功能。是一种优于POP的新协议,是美国斯坦福大学在1986年开始研发的多重邮箱电子邮件系统。和POP一样,IMAP也能下载邮件、从服务器中删除邮件或询问是否有新邮件,但IMAP克服了POP的一些缺点。例如,请求邮件服务器只下载所选中的邮件而不是全部邮件。客户机可先阅读邮件信息的标题和发送者的名字再决定是否下载这个邮件。通过用户的客户机电子邮件程序,IMAP可让用户在服务器上创建并管理邮件文件夹或邮箱、删除邮件、查询某封信的一部分或全部内容,完成所有这些工作时都不需要把邮件从服务器下载到用户的个人计算机上。
默认情况下,当 IMAP4 电子邮件应用程序将电子邮件下载到客户端计算机,下载邮件的副本会保留在电子邮件服务器上。正是由于用户的电子邮件副本保留在电子邮件服务器上,用户可以从多台计算机上访问相同的电子邮件。也可以实现电子邮件服务器上的多个文件夹与客户端计算机上的多个文件夹同步。
SMTP/POP3工作方式如图:
TCP的3次握手和4次挥手?
详细可见《TCP3次握手/4次握手》
在 TCP 数据段报头中,有六个包含控制信息的 1 bit字段,用于管理 TCP 进程。这些字段分别是:
URG —紧急指针
ACK —确认字段
PSH —推送功能
RST —重置连接
SYN —同步序列号
FIN —发送方已传输完所有数据
这些字段用作标志,由于它们都只有 1 bit大小,所以它们都只有两个值:1 或者 0。当值设为 1 时,表示数据段中包含控制信息。
1. 三次握手,建立连接
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
1) 建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
2) 服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
3) 客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。
2. 四次挥手,关闭连接
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。
1) 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
2) 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
3) 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
4) 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
3. 为什么建立连接协议是三次握手,而关闭连接却是四次挥手呢?
建立连接时,服务端LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN放在一个报文里来发送。
关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以关闭连接的ACK报文和FIN报文多数情况下都是分开发送的。
常见的邮箱类型有哪些?
常见的邮箱类型有:免费邮箱、vip邮箱、域名邮箱、企业邮箱等等。
1. 免费邮箱
“免费邮箱”是邮件商家为任何人免费提供的电子邮件传输服务,作为交换,该网站上你请求电子邮件服务和一些个人信息的地方会显示广告。它更适合个人生活和娱乐的需要,却并非那么注重邮箱的安全和功能。
部分免费邮件SMTP服务器参考设置:
span>Email类型 SMTP[Host]主服务器 Port[端口号] 是否可启用SSL Gmail(Google的网络邮件服务) smtp.gmail.com 587 True HotMail/Live smtp.live.com 25 True QQ/FoxMail(Foxmail被腾讯收购) smtp.qq.com 25 False 126(网易) smtp.126.com 25 False 163(网易) smtp.163.com 25 False Sina(新浪邮箱) smtp.sina.com 25 False Tom smtp.tom.com 25 False SoHu(搜狐邮箱) smtp.sohu.com 25 False Yahoo(雅虎邮箱)(已关闭) smtp.mail.yahoo.com 25 False2. vip邮箱
“vip邮箱”即邮件商家提供的收费版邮件服务,在速度、安全、稳定性、容量、附件大小限制、群发数等方面相对好些。其SMTP服务器设置就是多了个vip字符。eg:smtp.vip.qq.com。邮箱地址:369220123@vip.qq.com。
3. 域名邮箱
“域名邮箱”是个性化邮件服务,能让您用自己的域名做为后缀即“@自己的域名”,前提是你需要一个域名(通常域名要收费)。功能比免费邮箱要多:可分配单个邮箱、规划容量、更加的安全、更好的稳定性、个性化名称、邮件发送量更大、附件大小限制等等。
4. 企业邮箱
“企业邮箱”是域名邮箱,但通常是指通过付费方式获得更好服务的邮箱。eg:您公司域名为www.abc.com,则SMTP服务器为:mail.abc.com,邮箱地址:office@abc.com;
使用企业邮箱的优势:
1) 提升公司企业形象、邮箱稳定性、邮箱反垃圾反病毒性能、邮件收发速度;
2) 通过购买服务,能适应企业不断升级需求;
3) 为员工分配(域名)企业邮箱,便于将流动员工所有业务联系保留和延续下来;
4) 监控邮件(实际为邮件暗抄送功能),以防公司的机密和重要信息流失;
5) 获得高性能邮件海外转发功能,解决国际高效邮件收发、邮件营销有效投递等问题;
6) 出站电子邮件过滤,比如:敏感字过滤、基于政策邮件加密等等;
7) 等等。
邮件发送相关.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
不懂干嘛的,设置为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
PickupDirectoryLocation
string
获取或设置文件夹,应用程序在该文件夹中保存将由本地SMTP服务器处理的邮件。
?
下面属性想不到用在什么场景……请高人指出使用案例,谢谢!
TargetName
string
"SMTPSVC/" + this.host。获取或设置在使用扩展保护时用于身份验证的服务提供程序名称(SPN)。
ServicePoint
ServicePoint
获取用于传输电子邮件的网络连接。(应该会保存TCP连接,避免再次进行TCP的三次握手???)
3. 一个简单的邮件发送示例
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. this?part?is?in?bold"; ? 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路径字符串的替代即可。
代码如下:(详细见示例代
网站栏目:分享net网站开发中邮件发送功能
文章位置:https://www.cdcxhl.com/news/226271.html
成都网站建设公司_创新互联,为您提供App设计、品牌网站建设、Google、面包屑导航、自适应网站、响应式网站
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联
猜你还喜欢下面的内容