martes, 8 de mayo de 2012

Incrustar imagen en correo HTML

¡Vaya que esto de escribir es más difícil de lo que pensaba! Mis respetos para todos los bloggers que se dedican a esto.

Bien, directo al punto: Esta vez tuve la necesidad de encontrar una forma de insertar una imagen en el cuerpo de un mensaje de correo electrónico, pero, ésta no debe ser importada de otra ubicación y tampoco debe ser un adjunto del mensaje.

¿Cómo lograr esto?

Investigando un poco dí con este artículo en www.variablenotfound.com donde se muestra cómo se puede realizar esta azaña (jeje); cabe mencionar que el código que allí publicaron está hecho en C#, y yo me tomé la libertad de pasarlo a Visual Basic .NET.

El código es el siguiente:


' Necesitaremos estos namespaces...
Imports System.Net.Mail
Imports System.Net.Mime

Module Module1

   Sub Main()
   
  ' Crearé algunas variables aquí para facilitar las pruebas:
   Dim MiDireccionDeCorreo as String = ""
   Dim DireccionCorreoDestino as String = ""
   Dim DireccionSMTP as String = "" 'Puede ser una IP o una URL
   Dim PuertoSMTP = 25
   Dim Imagen as String = "" 'Ruta completa y nombre de la imagen.
  
       Try
           ' Montamos la estructura básica del mensaje...
           Dim mail As MailMessage = New MailMessage()
           mail.From = New MailAddress(MiDireccionDeCorreo)
           mail.To.Add(DireccionCorreoDestino)
           mail.Subject = "Mensaje con imagen"

           ' Creamos la vista para clientes que
           ' sólo pueden acceder a texto plano...

           Dim text As String = "Hola, ayer estuve disfrutando de " & _
                                   "un paisaje estupendo."

           Dim plainView As AlternateView = AlternateView.CreateAlternateViewFromString(text, System.Text.Encoding.UTF8, MediaTypeNames.Text.Plain)


           ' Ahora creamos la vista para clientes que
           ' pueden mostrar contenido HTML...

           Dim html As String = "<h2><b>¡¡¡Hola!!!</b> Mira dónde estuve ayer:</h2>" & _
                               "<img src='cid:wbtestimagenbg' />"

           Dim htmlView As AlternateView = AlternateView.CreateAlternateViewFromString(html, System.Text.Encoding.UTF8, MediaTypeNames.Text.Html)

           ' Creamos el recurso a incrustar. Observen
           ' que el ID que le asignamos (arbitrario) está
           ' referenciado desde el código HTML como origen
           ' de la imagen

           Dim img As LinkedResource = New LinkedResource(Imagen, MediaTypeNames.Image.Jpeg)
           img.ContentId = "wbtestimagenbg"

           ' Lo incrustamos en la vista HTML...

           htmlView.LinkedResources.Add(img)

           ' Por último, vinculamos ambas vistas al mensaje...

           mail.AlternateViews.Add(plainView)
           mail.AlternateViews.Add(htmlView)

           ' Y lo enviamos a través del servidor SMTP...
           Console.Out.WriteLine("Empiezo a crear el cliente smtp...")
           Dim smtp As SmtpClient = New SmtpClient(DireccionSMTP, PuertoSMTP)
           Console.Out.WriteLine("Y envio el correo...")
           smtp.Send(mail)
           Console.Out.WriteLine("Correo enviado")
       Catch ex As Exception
           Console.Out.WriteLine(ex.ToString)
           Threading.Thread.Sleep(60000)
       End Try
   End Sub

End Module


Este código me funcionó con un smtp que no requería autenticación. Si ya han hecho pruebas exitosas de envío de correo, se puede simplemente reemplazar la definición de mi cliente smtp con el que hayan utilizado.

Espero que sea de utilidad; saludos y hasta la próxima.