Pergunta

Estou tentando enviar e-mails de forma assíncrona e funciona bem, desde que não haja uma View alternativa anexada ao e-mail. Quando há uma visão alternativa, recebo o seguinte erro:

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)

Aqui está algum código de exemplo:

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

E o retorno de chamada .....

 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
Foi útil?

Solução

A razão pela qual isso não está funcionando é porque seu manipulador de suplemento está sendo chamado quando o método sendAsync () é concluído, mas isso parece estar antes que o SMTPClient tenha terminado de enviar fisicamente o e -mail pela rede (isso só acontecerá com a entrega da rede, no entanto, porém, porém, As entregas de arquivo são essencialmente síncronas com sendAsync ()).

Isso quase parece um bug no SMTPClient porque o Oncompleted só deve ser chamado apenas quando a mensagem for realmente enviada.

Outras dicas

Eu tive um problema muito semelhante. Mesma mensagem de erro, mas uma estrutura de código ligeiramente diferente. No meu caso, eu estava descartando o objeto MailMessage dentro da função principal. Quando o evento em conclusão foi executado, o objeto já havia desaparecido.

Olhe para o seu código após o SendAsync para ver se você está liberando o objeto MailMessage. Por exemplo, se você estiver criando dentro de uma instrução usando, ele será libertado antes que o evento assíncrono seja executado.

Você deve colocar seus dims no nível da aula se quiser acessá -los em seu retorno de chamada.

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

Meu palpite é que o AlternateViewViews.Add apenas adiciona uma referência do HAV, o objeto MSG precisa se dispor enquanto o HAV é descartado automaticamente pelo GC.

Felicidades

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top