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

これが機能しない理由は、SendAsync() メソッドが完了したときに OnCompleted ハンドラーが呼び出されているためですが、それは SmtpClient がネットワーク経由でメールを物理的に送信し終える前のようです (これはネットワーク配信でのみ発生しますが、ファイル配信は基本的に SendAsync() と同期します)。

OnCompleted は、メッセージが本当に送信された場合にのみ呼び出される必要があるため、これは SmtpClient のバグのように思えます。

于 2009-04-23T23:33:24.243 に答える
0

コールバックでそれらにアクセスする場合は、クラス レベルで Dim を配置する必要があります。

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 の参照を追加するだけで、hAV は GC によって自動的に破棄されますが、msg オブジェクトは破棄する必要があります。

乾杯

于 2011-07-27T06:56:22.787 に答える
0

私は非常によく似た問題を抱えていました。同じエラー メッセージですが、コード構造が少し異なります。私の場合、メイン関数内でメールメッセージ オブジェクトを破棄していました。OnCompleted イベントが実行されるまでに、オブジェクトは既になくなっていました。

SendAsync の後のコードを見て、mailmessage オブジェクトを解放しているかどうかを確認してください。たとえば、using ステートメント内で作成している場合、非同期イベントが実行される前に解放されます。

于 2009-04-25T02:56:06.310 に答える