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

今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能。在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下:

1)         邮件基础理论知识

2)         邮件发送相关.NET类库

3)         介绍我开发的一个发送邮件的小组件(MailHelper)

4)         MailHelper组件的一个示例以及几种方式发邮件的优劣测试

示例及组件源码:(有几位园友反馈IE浏览器解析不出下载地址)

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

邮件基础理论知识                                                                                                    

什么业务需要邮件功能?

1.         服务提供方:需提供邮件收发客户端或Web服务。(eg:Outlook、QQ邮箱)。当然这些服务都是知名商提供。若是一般的小网站提供的邮件收发服务,不知道节操如何,谁敢用呢?就算你用了,别的知名商SMTP服务器也不认可从这小网站发出的邮件,出现SMTP服务器拒收来源邮件(视为恶意邮件或垃圾邮件)。

2.         安全性、机密性:比如某安全部门需要提供自己发邮件的SMTP服务器和收邮件POP3服务器以及相应的操作软件

3.         电子商务、论坛等会员机制社区:主家需要向会员发送通知信息,比如:密码重置、降价通知、留言通知、回复通知、订阅通知、会员间交流等等。主家保证邮箱有效性的办法常常是通过会员注册、更换邮箱时发送“激活邮件”。

4.         邮件营销:在大数据时代的现在,企业可以根据所掌握的数据预测客户的需求,来提供主动推送营销消息的功能(数据化运营);当然也有没有预测能力的小商家通过邮件群发器进行撒网式邮件营销。(邮件营销是:在恰当的时间传递合适的信息给需要的客户,目的是产生销售) ---- 比如“RichMail邮件营销平台”,外贸邮件营销技巧

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工作方式如图:

image

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状态,完成三次握手。

image

2.         四次挥手,关闭连接

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。

1)         客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。

2)         服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

3)         服务器B关闭与客户端A的连接,发送一个FIN给客户端A。

4)         客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

image

3.         为什么建立连接协议是三次握手,而关闭连接却是四次挥手呢?

建立连接时,服务端LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN放在一个报文里来发送。

关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以关闭连接的ACK报文和FIN报文多数情况下都是分开发送的。

常见的邮箱类型有哪些?

常见的邮箱类型有:免费邮箱、vip邮箱、域名邮箱、企业邮箱等等。

1.         免费邮箱

“免费邮箱”是邮件商家为任何人免费提供的电子邮件传输服务,作为交换,该网站上你请求电子邮件服务和一些个人信息的地方会显示广告。它更适合个人生活和娱乐的需要,却并非那么注重邮箱的安全和功能。

部分免费邮件SMTP服务器参考设置:

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

False

2.         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

获取用于存储附加到此电子邮件的数据的附件集合。

Headers

NameValueCollection

获取与此电子邮件一起传输的电子邮件标头。(例如用于:发送DKIM签名的邮件)

Subject

string

获取或设置此电子邮件的主题。

Body

string

获取或设置邮件正文。

AlternateViews

AlternateViewCollection

指定一个电子邮件不同格式显示的副本。(eg:发送HTML格式的邮件,可能希望同时提供邮件的纯文本格式,以防止一些收件人使用的电子邮件阅读程序无法显示html内容)

IsBodyHtml

bool

默认false。获取或设置指示邮件正文是否为 Html 格式的值。

Priority

MailPriority

默认Normal。获取或设置此电子邮件的优先级。(Normal | Low| High)

HeadersEncoding

Encoding

获取或设置此电子邮件的用户定义的自定义标题使用的编码。

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
15
[Flags]
public enum DeliveryNotificationOptions
{
// 没有通知。
None = 0,
// 通知传送是否成功。
OnSuccess = 1,
// 通知传送是否失败。
OnFailure = 2,
// 通知传送是否延迟
Delay = 4,
// 从不通知。
Never = 134217728,
}

不懂干嘛的,设置为OnSuccess,不会回复我发送成功。设置为Never,发送失败也会回复我。。。

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)         添加LinkedResource到AlternateView

4)         添加AlternateView到MailMessage

5)         设置SmtpClient,发送email

5.         发送DKIM签名的邮件(感谢@dudu提点)

DKIM(DomainKeys Identified Mail,域秘钥识别邮件)只是为了实现一定程度上的认证,而并不是为了提供一种强大的加密认证机制。因此DKIM的主要应用前景是在即使被攻击或认证失败也不会有很大损失的“反垃圾邮件等低危险性领域”。在反垃圾邮件方面,DKIM能够有效地限制垃圾邮件发送者盗用其他机构或域名的名义,为邮件过滤提供鉴别手段,并且能够在现有邮件体系下快速进行低成本的部署。(垃圾邮件发件人可以伪造邮件上的“发件人”地址,使垃圾邮件看起来好像来自您所在域中的某个用户。)

DKIM是基于域名的,而不是整个邮件地址。签名是由域名的管理者控制而不是单独的邮件用户(这也是与用户个体提供证书签名方式的明显区别)。

具体如何签名?如何创建DKIM密钥?如何使用开源库DKIM.Net.dll发送DKIM签名的邮件?我们跳转到dudu站长的博文:C#发送DKIM签名的邮件》

我开发的一个发送邮件的小组件(代码在博文开始处已给出下载地址)

为了简化邮件发送代码编写和SmtpClient实例的管理,我封装了一个发邮件的帮助类。

这个帮助类,包含如图几个文件:

image

两个主要类: SmtpHelper 和MailHelper

1.         SmtpHelper     

此类是为了简化构造SmtpClient实例所需的代码量。通过SmtpHelper构造函数设置好SMTP服务器、端口号、身份凭据,再通过链式操作快速设置SmtpClient其他不常使用的属性。

Eg

?
1
2
3
SmtpClient client = new SmtpHelper( host, port, false, userName, password)
.SetTimeout(60*1000)
.SmtpClient;

使用SmtpHelper类注意事项:

1)         非线程安全类.

2)         构造的SmtpClient 实例由外部进行Dispose()。SmtpHelper类只简单提供构造,不做释放操作。

3)         SmtpClient 没有提供 Finalize() 终结器,所以GC不会进行回收,只能由外部使用完后进行显示释放,否则会发生内存泄露问题.

2.         MailHelper

此类完成邮件的发送工作。需要结合MailInfoHelper静态类验证邮件信息的有效性。

1)         支持快捷添加附件、内嵌资源、地址信息、备用视图格式;

Eg:添加内嵌资源

?
1
2
3
// 邮件内容:"<a href=\"cid:MyPic\" target=\"_blank\">点击在新窗口打开图片</a>";
string picPath = Environment.CurrentDirectory + "\\附件\\PIC_Mail中文.png";
mail.AddInlineAttachment(picPath,"MyPic");

2)         支持在发送邮件前对邮件信息有效性进行检查;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dictionary<MailInfoType, string> dic = mail.CheckSendMail();
if (dic.Count > 0 && MailInfoHelper.ExistsError(dic))
{
// 反馈“错误+提示”信息
msg = MailInfoHelper.GetMailInfoStr(dic))
}
else
{
if (dic.Count > 0)
{
// 反馈“提示”信息,但还是可以发送邮件
msg = MailInfoHelper.GetMailInfoStr(dic);
}
// 发送邮件
}

3)         支持批量同步、异步发送邮件

a)         批量同步发送邮件:实际上只是 SmtpClient.Send() 同步发送邮件的一个封装。

b)         批量异步发送邮件

i.              待发送队列:因为一个SmtpClient一次只能发送一个MailMessage,不管是同步还是异步发送,所以 SmtpClient.SendAsync() 方法后必须阻塞线程直到上一封邮件发送完成,否则会抛出“正在发送邮件”的异常。所以,MailHelper为了避免调用线程的阻塞,将待发送邮件的信息都加入到队列中,内部启用一个线程去执行串行化发送任务。

ii.              限流:“异步”批量发送过程中,为了防止待发送队列无限制的增大,导致内存溢出,我们可以通过MailHelper的GetAwaitMailCountAsync()方法监控该队列的大小,适当的执行Thread.Sleep(time).

iii.              异步取消:可以通过MailHelper的SendAsyncCancel()方法,取消待发送队列中的邮件继续发送。

iv.              回调函数:异步发送完一封电子邮件后执行的回调函数。通过SendCompleted事件进行注册。但要注意其AsyncCompletedEventArgs参数的UserState对象被改写为了我定义的 MailUserState 对象 

MailUserState定义如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/// <summary>
/// 异步发送邮件时保存的信息,用于释放和传递数据
/// </summary>
public class MailUserState
{
#region 由MailHelper内部的SendCompleted注册的事件使用
// 用于释放 MailMessage 和 SmtpClient
public MailMessage CurMailMessage { get; set; }
public bool AutoReleaseSmtp { get; set; }
public SmtpClient CurSmtpClient { get; set; }
// 只发送单封邮件的时候使用此进行判断释放 
public bool IsSmpleMail { get; set; }
#endregion
/// <summary>
/// 用户传递的状态对象
/// </summary>
public object UserState { get; set; }
/// <summary>
/// 当异步发送报错时可通过此标识是否已经处理该异常
/// </summary>
public bool IsErrorHandle { get; set; }
}

批量异步发送示例(注意回调函数的用户信息):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 设置SmtpClient的回调函数
client.SendCompleted +=(send,args) =>
{
AsyncCompletedEventArgs arg = args;
MailUserState userState = arg.UserState as MailUserState;
}
// 在MailHelper的构造函数中决定是同步发送还是异步发送邮件
MailHelper mail = new MailHelper(client,true,isAsync);
for (long i = 1; i <= mailCount; i++)
{
if(mail.GetAwaitMailCountAsync()>1000)
{
// 当待发送队列大于1000时,线程休眠1秒
Thread.Sleep(1000);
}
// 设置 MailHelper 发送信息
// ……
// 设置每封电子邮件发送完执行回调函数的UserState
mail.AsyncUserState = “你传递的对象信息”;
// 执行批量发送邮件
mail.SendBatchMail();
}
mail.SetBatchMailCount(count);

4)         批量发送邮件中,每调用一次发送方法,要使用MailHelper的Reset()对邮件内容进行重置。

注意:

a)         不重置SmtpClient。SmtpClient根据 m_autoDisposeSmtp 参数自动释放或由外部主动释放

b)         不重置:异步待发送队列及队列计数、AutoResetEvent实例、执行异步发送线程变量、是否启用异步发送标识变量

5)         支持自动释放SmtpClient实例

在平常邮件开发中,当在异步批量发送邮件时,我们没办法掌握何时释放我们重用的SmtpClient实例。

但,我们使用MailHelper类,可以不用关心SmtpClient的释放问题。我们通过构造函数中指定自动释放SmtpClient的参数为true,并且统计好批量邮件发送量之后调用 SetBatchMailCount(long preCount) 方法,MailHelper就会在(批量)同步、(批量)异步邮件全部发送完之后自动释放SmtpClient实例。

a)         为什么要“重用”同一个SmtpClient实例

因为,每次发送一封电子邮件,都必须经过TCP的三次握手与服务器建立连接,这个连接信息就保存在SmtpClient实例中,所以当进行大批量的电子邮件发送时(前提是发件地址是相同的,当然大部分场景下发件地址都是相同的),有必要重用SmtpClient实例,避免TCP不断地发生“三次握手和四次挥手”。

b)         为什么要“显示释放”SmtpClient实例

SmtpClient类没有 Finalize (终结器)方法,因此应用程序"必须"调用 Dispose 来显式释放资源。 Dispose  方法在所有建立到 Host 属性中指定的 SMTP 服务器的连接中循环,并发送 QUIT 消息,其后平稳断开 TCP 连接。

MailHelper组件的一个示例以及几种方式发邮件的优劣测试

示例(博文开始处已给出链接下载)包含四次实验方案和两组复选框,如图:

image

示例代码下载后注意,请先修改如Config.cs文件的几处红色标识信息(如下图),你才能正常发送邮件。

QQ邮箱发件的注意啦,要在“设置”-“账户”中将“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”服务都开启才能正常发送邮件。如图:

image

实验一:单条邮件同步和异步发送(可通过添加大附件来观察同步异步效果)

观察:通过大附件观察下同步发送邮件和异步发送邮件的效果,查看下单封邮件发送MailHelper类是如何使用的。

实验二:批量邮件同步和异步发送(单个线程,单个SmtpClient实例,SendAsync())

观察:观察下MailHelper类中批量异步发送使用队列方式实现的高响应性,以及批量操作如何自动释放SmtpClient实例。

在数量较大的批量邮件发送场景中,我们可以使用多个SmtpClient实例来并行发送,以提高整体发件效率。即实验三 + 实验四(不清楚并行类库的,请看 《异步编程:.NET4.X 数据并行》

实验三:批量邮件同步和异步发送(平行类库Parallel(自动分区),每个分区一个MailHelper、SmtpClient实例)

观察:现在通过Parallel.For的自动分区 + 每个分区一个MailHelper 和SmtpClient实例来提高整体效率。但是,有个问题就是自动分区又.NET内部根据资源负载均衡自动分区,分区的效果非常不好,总会开启过多的分区导致MailHelper和SmtpClient实例偏多,并且效率不高。

实验四:批量邮件同步和异步发送(平行类库Parallel(手动分区),每个分区一个MailHelper、SmtpClient实例)

观察:在通过Parallel.Foreach的手动分区 + 每个分区一个MailHelper 和SmtpClient实例来提高整体效率。我们自己根据业务场景和Environment.ProcessorCount内核数来决定分区数,这样可以根据需要创建MailHelper和SmtpClient实例,并且效率非常高。

另外:重用SmtpClient复选款的测试结果:如果只是简单的纯文本邮件发送(即,没有耗时的附件内容),重用SmtpClient可提升50%的效率。(注意:需要使用批量同步方式发送进行测试。因为异步方式会使用多个SmtpClient进行并行发送所以测试不出效率提升)

来个整个示例截图:

image

有园友反馈报如下错误:

clip_image001

我当时弄测试的时候偶尔出现就没注意这个问题了,现在也不知道具体原因,猜测是邮箱服务器的一些限制吧!换个其他邮箱就可以了;或则注释掉下面内嵌图片:

clip_image002

另外解决方案,调整代码如下:

?
1
2
3
4
5
6
7
foreach (string filePath in FilePaths)
{
//会出现 在邮件标头中找到无效的字符:“周”的错误,改为如下写法
//mail.AddAttachment(filePath);
Attachment fileAttachment = new Attachment(filePath, MediaTypeNames.Application.Octet);
mail.AddAttachment(fileAttachment);
}

本邮件发送功能分享到此结束,如果你看后觉得对你有帮助的,还请多帮推荐……推荐……如果内容有误的,还请帮忙指出,谢谢!

相关阅读:

C#实现SMTP服务器,使用TCP命令实现,功能比较完善》

《如何:在 IIS 中安装和配置 SMTP 虚拟服务器》

《使用应用程序配置文件<mailSettings>节点配置SMTP服务器参数》

邮差网》

《哪些许可邮件容易被ISP屏蔽》       ------  ISP(Internet Service Provider),互联网服务提供商,即向广大用户综合提供互联网接入业务、信息业务、和增值业务的电信运营商。ISP是经国家主管部门批准的正式运营企业,享受国家法律保护

《邮件中容易被ISP检索的敏感字眼》

                   安全:《C#发送DKIM签名的邮件》

           SMTP错误码/建议解决方法

           聊聊HTTPS和SSL/TLS协议

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 【DIY】用Scratch简易做出国民老公王校长“热狗”游戏(+源代码+素材)

    文章目录01-模式02-素材03-逻辑04-编程05-效果查看帮助单人模式双人模式变态模式06-网盘链接被IG刷朋友圈后,王校长吃热狗的配图瞬间火爆,民间鬼才多,各个领域都在画王校长的配图,有配图就想做点什么…那就开始吧。01-模式根据王校长当时的背景,王校长吃热狗,随后IG获胜,…...

    2024/4/17 17:13:17
  2. 解决JAVA字符串长度与数据库字符串长度不一致问题

    我先说下场景,数据库定义的长度是VARCHAR2(100),文件数据有一个字段有40个字符,UTF-8编码的非英文字符,如果在插入数据库的时候如果使用String的length()方法去获取长度大小肯定是40.这里40长度肯定是小于数据库大小100,通过了验证,但是插入数据库会出现,值过大。这里是我…...

    2024/4/19 23:41:36
  3. TCP三次握手分析以及SYN,ACK,Seq含义

    一、TCP协议传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。二、TCP协议中的标识位(位码)SYN (synchronous建立联机)ACK (acknowledgement 确认)PSH (push传送)FIN (finish结束)RST (reset…...

    2024/5/7 14:56:03
  4. 【作品】多人贪吃蛇

    【下载地址】稍后上传 【以下内容摘自试验报告,可能狗屁不通,尽情谅解】 一. 需求分析: 贪吃蛇是众所周知的益智类小游戏,但是传统的贪吃蛇通常是一个人玩的,不仅枯燥,而且玩多了就觉得没有乐趣。这也是我开发“多人贪吃蛇的目的之一”,本游戏可以选择单人模式,也可以…...

    2024/4/21 14:55:57
  5. 反垃圾邮件技术解析

    1、概述 电子邮件是最常用的网络应用之一,已经成为网络交流沟通的重要途径。但是,垃圾邮件(spam)烦恼着大多数人,近来的调查显示,93%的被调查者都对他们接收到的大量垃圾邮件非常不满。一些简单的垃圾邮件事件也造成了很有影响的安全问题。日益增加的垃圾邮件现在会造…...

    2024/5/7 19:02:19
  6. Java堆外内存:堆外内存回收方法

    一、JVM内存的分配及垃圾回收对于JVM的内存规则,应该是老生常谈的东西了,这里我就简单的说下:新生代:一般来说新创建的对象都分配在这里。年老代:经过几次垃圾回收,新生代的对象就会放在年老代里面。年老代中的对象保存的时间更久。永久代:这里面存放的是class相关的信息…...

    2024/5/7 21:14:31
  7. Appgamekit制作消消乐小游戏(附代码)# 4

    废话 突然,在一个弥漫着病毒的温馨下午,我,Xresking,放下了手中的手柄,电脑屏幕上大大的红色楷体死字像是黑暗中的血月,随着苇明弦一郎的刀光,切向我的Zn头。我惊讶的发现,我摸鱼好久了… 我闲了这么多天,也不是没有收获的,比如,我通关了只狼… 好了废话不多说,我知…...

    2024/4/17 17:13:05
  8. TCP三次握手及释放连接详解

    本文整理自: http://blog.csdn.net/oney139/article/details/8103223 http://blog.csdn.net/webnumen/article/details/1541330 一、TCP头部简介ACK :即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。TCP报文格式中的控制位…...

    2024/4/14 18:51:27
  9. Flash内存清理、建议以及查找内存泄露的方法

    转自:http://binary-house.spaces.live.com/blog/cns!A2B1EFCF718495C4!269.entry一、Flash内存清理Flash Player的garbage collection(GC)分两种运行方式,一种是“引用计数法”(Reference Counting),一种是“标记-清除法”(Mark Sweeping)。1>、引用计数法是通过计…...

    2024/5/3 23:30:44
  10. TCP协议详解(TCP报文、三次握手、四次挥手、TIME_WAIT状态、滑动窗口、拥塞控制、粘包问题、状态转换图)

    文章目录一、TCP报文(标准长度20字节)二、三次握手1、半连接、半打开、半关闭状态2、SYN flood攻击3、为什么需要三次握手?4、在三次握手过程中,如果服务器一直收不到客户端的ack会发生什么?5、初始序列号Seq为什么要随机初始化?三、四次挥手1、为什么建立连接是三次握手…...

    2024/5/7 1:41:13
  11. 【示例代码】超萌的休闲HTML5小游戏——打地鼠

    打地鼠小游戏是位HTML5达人用10天时间完成的,他总结了在研发过程中的教训和不足:1.在5种地鼠的随机产生过程中,本不应该是同等概率出现的,但我还是同概率的。应该,甚至是一关出现几只都是计算好的。 2.框架这方面,由于之前的例子是用键盘事件的,而由于我的打地鼠游戏是鼠…...

    2024/4/18 17:42:36
  12. abap 中文字符串提取和字节长度计算

    abap 中对于字符串长度的计算一般用 strlen 函数实现。但此函数只能算出字符的个数无法计算字符串的长度,例如 ABC你好用此函数计算得到的值为5,显然它不是我们想要的,它的字节长度为7 。经过研究,我写了一个函数可以实现功能代码如下: FUNCTION YGET_CNCHAR_CHARLE.*&quo…...

    2024/4/20 5:12:24
  13. 有关POP3邮件接收服务的介绍

    Win 2003配置邮件服务器 http://www.sina.com.cn 2008年09月26日 14:31 IT168.com大家知道,邮件服务器系统由POP3服务、简单邮件传输协议(SMTP)服务以及电子邮件客户端三个组件组成。其中的POP3服务与SMTP服务一起使用,POP3为用户提供邮件下载服务,而SMTP则用于发送邮件以…...

    2024/4/25 17:59:42
  14. Android之内存泄露、内存溢出、内存抖动分析

    内存JAVA是在JVM所虚拟出的内存环境中运行的,内存分为三个区:堆、栈和方法区。 栈(stack):是简单的数据结构,程序运行时系统自动分配,使用完毕后自动释放。优点:速度快。 堆(heap):用于存放由new创建的对象和数组。在堆中分配的内存,一方面由java虚拟机自动垃圾回收器来…...

    2024/5/5 6:11:07
  15. 智能贪吃蛇的实现方法介绍

    小小贪吃蛇游戏本身倒是不难,而想要实现贪吃蛇智能化却是相当困难。下面将简单介绍实现智能贪吃蛇的两种方法。Hamilton(哈密顿)这个方法就是我上个博客想要实现智能考虑的方法,平均步数要比第二种方法多,但成功率是100%啊!(1000次实验)。一个回路,若它通过图的每一个…...

    2024/4/18 11:29:24
  16. Linux网络编程中connect()、listen()和accept()与TCP三次握手的关系

    Linux网络编程开发分为服务器端和客户端两个部分:对于服务器端的流程——类似于接电话过程socket()[找到一个可以通话的手机]----->bind()[插入一个固定号码]------>listen()[随时准备接听]-------> accept------->recv()------->send()------>close();对于…...

    2024/4/20 14:58:10
  17. jira的发邮件配置

    1. 先登录jira,然后在配置里面的系统,找到收发邮件设置; 2.我测试了好几个邮箱,qq,163,阿里邮箱,感觉就163没出错,不用配置什么,其他的好像都要配置一些设置的,所有我选择用163网易的; 3.大体设置如下图:(服务器地址:smtp.163.com)4.配置好之后,点击测试,一般用户名密码正确都能…...

    2024/4/11 18:44:47
  18. 用jstl截取字符串

    jstl以前在jsp页面截取字符串时都是用Java表达式,感觉在jsp页面用多了Java表达式不是很好(那时主要是不知道jstl标签怎么去截取字符串,所以就只能用Java表达式了)。今天在网上找了些相关资料,原来jstl标签是可以截取字符串的,主要有两种方法: 一、用jstl原有的标签库中方…...

    2024/5/5 16:13:29
  19. Qt的内存管理

    在QT的程序中经常会看到只有new而不delete的情况,其实是因为QT有一套回收内存的机制,主要的规则如下: 1.所有继承自QOBJECT类的类,如果在new的时候指定了父亲,那么它的清理时在父亲被delete的时候delete的,所以如果一个程序中,所有的QOBJECT类都指定了父亲,那么他们是会…...

    2024/5/5 12:56:58
  20. Java贪吃蛇游戏(坐标方法)

    最近研究一个大大的贪吃蛇代码,自己开始试着写了写,已经对贪吃蛇的移动及规则方面的算法了解,主要是绘图方面有很大的困难,因为贪吃蛇的代码中将蛇的身体定义成多个坐标点,所以在绘图的过程中就必须要把这样的点给放大,与此同时蛇的移动范围又要在panel面板尺寸的基础上进…...

    2024/4/13 20:57:22

最新文章

  1. SGP.22-V.3.1-安全1

    有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题&#xff0c;欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot). 2.6.4.4 Command TLV MACing and Encryption 在提供的文件 "RSP Technical Specification Version 3.1 Final" 中&a…...

    2024/5/8 5:47:11
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. datalist是什么,有什么作用?

    <datalist>标签用于定义一个预定义选项列表&#xff0c;它可以与文本输入框&#xff08;<input type"text">&#xff09;一起使用&#xff0c;提供一组可选的值供用户选择或输入。<datalist>标签中的选项可以通过<option>标签来定义。 <…...

    2024/5/7 12:28:10
  4. vscode安装通义灵码

    作为vscode的插件&#xff0c;直接使用 通义灵码-灵动指间&#xff0c;快码加编&#xff0c;你的智能编码助手 通义灵码&#xff0c;是一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研…...

    2024/5/6 2:26:42
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/7 5:50:09
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/7 9:45:25
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/7 14:25:14
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/6 21:42:42
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57