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
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: Visual Basic
Posted in Visual Basic .NET |
