当前位置: 首页 > 编程语言 > C#

通过SmtpClient异步发送邮件的两种方式,结果不同分享

时间:2023-04-10 21:01:41 C#

通过SmtpClient异步发送邮件的两种方式,结果不同这里简单介绍一下概念。这适用于使用MVC3和EntityFramework4构建的网站。用户在网站上注册后,会向他们的电子邮件地址发送一封电子邮件。我首先使用SmtpClient.Send()实现了它并且运行良好。然后我想出了尝试异步发送电子邮件的方法。我遇到了我尝试过的两种异步方法的问题。第一次实施(来自这个未答复的帖子:https://stackoverflow.com/questions/7558582/how-to-dispose-using-smtpclient-send-and-asyncallback):publicboolEmailer(){。..使用(varsmtpClient=newSmtpClient()){smtpClient.EnableSsl=true;smtpClient.Host="smtp.gmail.com";smtpClient.Port=587;smtpClient.UseDefaultCredentials=false;smtpClient.Credentials=newNetworkCredential("myaddressgmail.com","mypassword");varsd=newSendEmailDelegate(smtpClient.Send);varcb=newAsyncCallback(SendEmailResponse);sd.BeginInvoke(消息,cb,sd);返回真;}}privatedelegatevoidSendEmailDelegate(System.Net.Mail.MailMessagem);privatestaticvoidSendEmailResponse(IAsyncResultar){try{SendEmailDelegatesd=(SendEmailDelegate)(ar.AsyncState);sd.EndInvoke(ar);//“无法访问处置对象”错误}catch(Exceptione){_logger.WarnException("ErroronEndInvoke.",e);这工作一半的时间。另一半我会在CallBack中收到“无法访问已处理的对象”错误。下一个实现(来自信誉良好的成员:WhatarethebestpracticesforusingSmtpClient,SendAsyncandDisposeunder.NET4.0):varsmtpClient=newSmtpClient();smtpClient.EnableSsl=true;smtpClient.Host="smtp.gmail.com";smtpClient.Port=587;smtpClient.UseDefaultCredentials=false;smtpClient.Credentials=newNetworkCredential("myaddress@gmail.com","mypassword");smtpClient.SendCompleted+=(s,e)=>{smtpClient.Dispose();消息.Dispose();};smtpClient.SendAsync(消息,空);通过这个实现,我没有收到任何错误,但是当smtpClient.SendAsync()执行时,在调试模式下会有明显更长的延迟(~5秒),这让我认为它不是异步发送的。问题:1)导致“处理对象”错误的第一种方法有什么问题?2)是不是第二种实现不让邮件异步发送的问题?延迟5秒没有意义吗?可能还值得注意的是,虽然该网站不需要支持发送大量电子邮件(仅限用户注册、选择加入时事通讯等),但我们预计未来会有大量用户,所以我已经决定异步发送电子邮件。谢谢。由于USING块,您的第一种方法不起作用。使用块结束后,将释放SmtpClient对象。因此,您不能在事件处理程序中访问它。提示:1-不要对MailMessage对象使用“useblock”,它会在发送邮件之前处理您的对象2在SmtpClient.SendCompleted事件上配置MailMessage对象:smtpClient.SendCompleted+=(s,e)=>{message.处置();};smtpClient对象的3组SendCompletedEventHandlersmtpClient.SendCompleted+=newSendCompletedEventHandler(SendCompletedCallback);4代码:privatestaticvoidSendCompletedCallback(objectsender,AsyncCompletedEventArgse){//获取asieruniqueforidousoperation.Stringtoken=(string)e.UserState;if(e.Cancelled){//在这里写你的代码}if(e.Error!=null){//在这里写你的代码}else//邮件已发送{//在这里写你的代码}mailSent=true;SmtpClient.SendAsync是异步电子邮件发送的首选方法,因为它使用专门为此目的设计的SmtpClient方法。它实施起来也更简单,并且已被证明可以工作数千次。您的5秒延迟很奇怪,表明存在需要修复的问题。第一段代码只是解决了问题,并没有消除它。如果您的交付方法不是SpecifiedPickupDirectory或PickupDirectoryFromIisSmtpClient.SendAsync实际上只会异步发送。在这些情况下,它会在返回之前将消息文件写入拾取文件夹。检查配置文件部分。我的猜测是您正在使用其中一种方法,而问题在于拾取文件夹。删除可能存在的旧文件,并检查问题是否出在您的防病毒软件上,它很可能会在每个新文件中搜索病毒。检查是否设置了加密或压缩属性。它也可能是别的东西。测试文件夹是否是问题根源的最佳方法是手动将电子邮件文件复制到其中。以上是C#学习教程:两种通过SmtpClient异步发送邮件的方式,结果不同。分享的所有内容,如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: