Visual Basic .NET - Enviar correos de forma asíncrona (SendAsync) con System.Net.Mail.SmtpClient

Written by lopezatienza on 12 Abril 2010 – 21:37 -

Hola a todos.

En este artículo voy a hablar del objeto System.Net.Mail.SmtpClient, y de cómo enviar correos de forma asíncrona (enviar correos en segundo plano), permitiendo que la aplicación quede libre para otras tareas.

Esta opción es indispensable si debemos enviar un gran número de correos, o si los Attachments del objeto MailMessage  tienen un peso considerable. He comprobado por experiencia que al realizar el envío por el método Send, si los Attachments tienen un peso alrededor de 5MB y 10MB, en ocasiones, incluso con una conexión a Internet óptima, salta una excepción de Timeout, no he llegado a probar con conexiones lentas, pero ya os vaticino que tendréis altas probabilidades de sufrir esta excepción.

Por ello, para enviar un mensaje y continuar la ejecución en el subproceso de la aplicación, utilizaremos el método SendAsync.

Añadimos el código para el envío de

Dim mSmtp As System.Net.Mail.SmtpClient = Nothing

Dim mEmail As System.Net.Mail.MailMessage = Nothing

Try

' Configuramos el correo

mEmail = New System.Net.Mail.MailMessage()

mEmail.From = New System.Net.Mail.MailAddress("emisor@dominio.com")

mEmail.To.Add(New System.Net.Mail.MailAddress("receptor01@dominio.com"))

mEmail.To.Add(New System.Net.Mail.MailAddress("receptor02@dominio.com"))

mEmail.To.Add(New System.Net.Mail.MailAddress("receptor03@dominio.com"))

mEmail.CC.Add(New System.Net.Mail.MailAddress("receptorCopiaCarbon@dominio.com"))

mEmail.Bcc.Add(New System.Net.Mail.MailAddress("receptorCopiaCarbonOculta@dominio.com"))

mEmail.Subject = "Correo de Prueba"

mEmail.Sender = New System.Net.Mail.MailAddress("emisor@dominio.com")

mEmail.ReplyTo = New System.Net.Mail.MailAddress("emisor@dominio.com")

mEmail.Body = "Cuerpo del correo."

mEmail.Attachments.Add(New System.Net.Mail.Attachment("C:\Archivo.txt"))

' Configuramos el servidor smtp

mSmtp = New System.Net.Mail.SmtpClient()

mSmtp.Host = "mail.dominio.com"

mSmtp.Port = 587

mSmtp.EnableSsl = True

mSmtp.DeliveryMethod = Net.Mail.SmtpDeliveryMethod.Network

mSmtp.Timeout = 10000

mSmtp.UseDefaultCredentials = False

mSmtp.Credentials = New System.Net.NetworkCredential("usuario", "password")

' Añadimos el manejador de evento

AddHandler mSmtp.SendCompleted, AddressOf SmtpClient_OnCompleted

mSmtp.SendAsync(mEmail, mEmail)

Catch ex As Exception

MessageBox.Show("Ha ocurrido un error: " & ex.Message & vbCrLf & ex.StackTrace)

Finally

mSmtp = Nothing

If Not mEmail Is Nothing Then mEmail.Dispose()

End Try

 

Ahora añadimos la función que se activa al finalizar el envío asíncrono del correo:

 

Public Sub SmtpClient_OnCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)

Try

'Tomamos el objeto original

Dim mail As Net.Mail.MailMessage = CType(e.UserState, Net.Mail.MailMessage)

'Guardamos el subject

Dim subject As String = mail.Subject

If e.Cancelled Then

MessageBox.Show("Correo cancelado para el correo con asunto '" & subject & "'")

End If

If Not (e.Error Is Nothing) Then

MessageBox.Show("Ocurrió un error: " & e.Error.ToString() & ", al enviar el correo con asunto '" & subject & "'")

Else

MessageBox.Show("Correo '" & subject & "' enviado.")

End If

Catch ex As Exception

MessageBox.Show("Excepción controlada. " & ex.Message)

End Try

End Sub

La función SmtpCliente_OnCompleted se llamará una vez se haya enviado el correo de forma correcta.

Un saludo y espero os sirva de ayuda.


Tags:
Posted in Visual Basic .NET |

Leave a Comment

RSS