问题:
调用 SmtpClient.SendAsync
,在 SendCompleted
的回调函数里面总是获取到 e.Cancelled
为 true
。
后来测试了一下,相同的代码,只是把 SmtpClient.SendAsync
改成 SmtpClient.Send
方法,邮件发送成功。
原因:
在发送邮件前把 SmtpClient
的实例释放了。因为 SendAsync
是一个异步的操作,调用了这个方法之后只是把邮件推送到了 SMTP 服务器,而发送的操作实际上还没完成,当 SmtpClient
实例被释放时,它会取消任何未完成的异步操作,所以这个邮件也被取消了。因此,正确的做法是把 SmtpClient
的实例放在SendCompleted
的回调函数里面再释放,MailMessage
实例也是一样,否则会报
System.Net.Mail.SmtpException: 发送邮件失败。 —> System.ObjectDisposedException: 无法访问已释放的对象。
的错误。
参考: