1. 程式人生 > >C# 使用 SmtpClient.SendAsync 方法傳送郵件失敗,總是返回 Cancelled

C# 使用 SmtpClient.SendAsync 方法傳送郵件失敗,總是返回 Cancelled

問題:

呼叫 SmtpClient.SendAsync,在 SendCompleted 的回撥函式裡面總是獲取到 e.Cancelledtrue
後來測試了一下,相同的程式碼,只是把 SmtpClient.SendAsync 改成 SmtpClient.Send 方法,郵件傳送成功。

原因:

在傳送郵件前把 SmtpClient 的例項釋放了。因為 SendAsync 是一個非同步的操作,呼叫了這個方法之後只是把郵件推送到了 SMTP 伺服器,而傳送的操作實際上還沒完成,當 SmtpClient 例項被釋放時,它會取消任何未完成的非同步操作,所以這個郵件也被取消了。因此,正確的做法是把 SmtpClient

的例項放在SendCompleted 的回撥函式裡面再釋放,MailMessage 例項也是一樣,否則會報

System.Net.Mail.SmtpException: 傳送郵件失敗。 —> System.ObjectDisposedException: 無法訪問已釋放的物件。

的錯誤。

參考: