C# 使用 SmtpClient.SendAsync 方法傳送郵件失敗,總是返回 Cancelled
阿新 • • 發佈:2019-02-17
問題:
呼叫 SmtpClient.SendAsync
,在 SendCompleted
的回撥函式裡面總是獲取到 e.Cancelled
為 true
。
後來測試了一下,相同的程式碼,只是把 SmtpClient.SendAsync
改成 SmtpClient.Send
方法,郵件傳送成功。
原因:
在傳送郵件前把 SmtpClient
的例項釋放了。因為 SendAsync
是一個非同步的操作,呼叫了這個方法之後只是把郵件推送到了 SMTP 伺服器,而傳送的操作實際上還沒完成,當 SmtpClient
例項被釋放時,它會取消任何未完成的非同步操作,所以這個郵件也被取消了。因此,正確的做法是把 SmtpClient
SendCompleted
的回撥函式裡面再釋放,MailMessage
例項也是一樣,否則會報
System.Net.Mail.SmtpException: 傳送郵件失敗。 —> System.ObjectDisposedException: 無法訪問已釋放的物件。
的錯誤。
參考: