1

我正在尝试异步发送电子邮件,只要电子邮件没有附加 AlternateView,它就可以正常工作。当有备用视图时,我收到以下错误:

Cannot access a disposed object. Object name: 'System.Net.Mail.AlternateView'
System.Net.Mail.SmtpException: Failure sending mail. ---> System.ObjectDisposedException: Cannot access a disposed object.

Object name: 'System.Net.Mail.AlternateView'.
   at System.Net.Mail.AlternateView.get_LinkedResources()
   at System.Net.Mail.MailMessage.SetContent()
   at System.Net.Mail.MailMessage.BeginSend(BaseWriter writer, Boolean sendEnvelope, AsyncCallback callback, Object state)
   at System.Net.Mail.SmtpClient.SendMailCallback(IAsyncResult result)

这是一些示例代码:

Dim msg As New System.Net.Mail.MailMessage
msg.From = New System.Net.Mail.MailAddress("me@example.com", "My Name")
msg.Subject = "email subject goes here"

'add the message bodies to the mail message
Dim hAV As System.Net.Mail.AlternateView = System.Net.Mail.AlternateView.CreateAlternateViewFromString(textBody.ToString, Nothing, "text/plain")
hAV.TransferEncoding = Net.Mime.TransferEncoding.QuotedPrintable
msg.AlternateViews.Add(hAV)

Dim tAV As System.Net.Mail.AlternateView = System.Net.Mail.AlternateView.CreateAlternateViewFromString(htmlBody.ToString, Nothing, "text/html")
tAV.TransferEncoding = Net.Mime.TransferEncoding.QuotedPrintable
msg.AlternateViews.Add(tAV)

Dim userState As Object = msg
Dim smtp As New System.Net.Mail.SmtpClient("emailServer")

'wire up the event for when the Async send is completed
 AddHandler smtp.SendCompleted, AddressOf SmtpClient_OnCompleted

 Try
     smtp.SendAsync(msg, userState)
 Catch '.... perform exception handling, etc...
 End Try

和回调......

 Public Sub SmtpClient_OnCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
    If e.Cancelled Then
      'Log the cancelled error
    End If
    If Not IsNothing(e.Error) Then
        'Log a real error....
        ' this is where the error is getting picked up
    End If

    'dispose the message
    Dim msg As System.Net.Mail.MailMessage = DirectCast(e.UserState, System.Net.Mail.MailMessage)
    msg.Dispose()

End Sub
4

3 回答 3

2

这不起作用的原因是因为您的 OnCompleted 处理程序在 SendAsync() 方法完成时被调用,但这似乎是在 SmtpClient 完成通过网络物理发送电子邮件之前(虽然这只会发生在网络传递中,文件传递本质上与 SendAsync()) 同步。

这几乎看起来像是 SmtpClient 中的一个错误,因为 OnCompleted 应该只在真正发送消息时才被调用。

于 2009-04-23T23:33:24.243 回答
0

我有一个非常相似的问题。相同的错误消息,但代码结构略有不同。就我而言,我正在处理 main 函数中的 mailmessage 对象。到 OnCompleted 事件运行时,对象已经消失了。

在 SendAsync 之后查看您的代码,看看您是否正在释放 mailmessage 对象。例如,如果您在 using 语句中创建它,那么它将在异步事件运行之前被释放。

于 2009-04-25T02:56:06.310 回答
0

如果你想在你的回调中访问它们,你应该把你的 dims 放在类级别。

private msg As System.Net.Mail.MailMessage
private hAV As System.Net.Mail.AlternateView 

private sub yoursub
  msg = new System.Net.Mail.MailMessage(..
  hAV = new ...
end sub

我的猜测是 AlternateViews.Add 只是添加了 hAV 的引用,msg 对象需要处置,而 hAV 由 GC 自动处置。

干杯

于 2011-07-27T06:56:22.787 回答