介紹 C# 使用 SmtpClient.SendAsync 方法發送郵件失敗,總是返回 Cancelled 的原因以及解決辦法。 ...
問題:
調用 SmtpClient.SendAsync
,在 SendCompleted
的回調函數裡面總是獲取到 e.Cancelled
為 true
。
後來測試了一下,相同的代碼,只是把 SmtpClient.SendAsync
改成 SmtpClient.Send
方法,郵件發送成功。
原因:
在發送郵件前把 SmtpClient
的實例釋放了。因為 SendAsync
是一個非同步的操作,調用了這個方法之後只是把郵件推送到了 SMTP 伺服器,而發送的操作實際上還沒完成,當 SmtpClient
實例被釋放時,它會取消任何未完成的非同步操作,所以這個郵件也被取消了。因此,正確的做法是把 SmtpClient
的實例放在SendCompleted
的回調函數裡面再釋放,MailMessage
實例也是一樣,否則會報
System.Net.Mail.SmtpException: 發送郵件失敗。 ---> System.ObjectDisposedException: 無法訪問已釋放的對象。
的錯誤。
參考:
SmtpClient.SendAsync Calls are Automatically Cancelled
Dispose SmtpClient in SendComplete?