Enviar mensajes con imágenes incrustadas desde .NET

Es habitual que las aplicaciones que desarrollamos necesiten enviar emails: alertas, notificaciones automáticas, formularios de contacto, o envíos masivos de información, entre otros, son ejemplos de utilización muy habituales.

Y en estos casos la inclusión de imágenes incrustadas suele ser un requisito fundamental cuando se trata de enviar contenidos con formato HTML, de forma que, aunque normalmente se incrementa de forma notable el tamaño del paquete a enviar, se evita que los clientes tengan que descargar estos recursos adicionales desde sus equipos, cosa que además suele estar bloqueada por defecto.

.NET framework nos ofrece varias vías para hacerlo usando las clases provistas en System.Net.Mail, pero vamos a utilizar una que nos ofrece dos ventajas importantes. La primera es que las imágenes enviadas no se muestran como adjuntos (evitando, por ejemplo, el curioso efecto presente en Outlook Express, que repite las imágenes a continuación del texto del mensaje) y la segunda es que permite especificar distintas vistas dentro desde el mismo mensaje, para que el cliente de correo utilice la que sea más apropiada.

El siguiente código muestra una forma de montar un mensaje con dos vistas: la primera será utilizada por aquellos agentes de usuario (clientes de correo) que únicamente pueden mostrar texto plano, mientras que en la segunda utilizará HTML para maquetar el contenido, incluyendo una imagen que aparecerá totalmente integrada en el cuerpo del mensaje, sin mostrarse como elemento adjunto del mismo.

Podréis observar que aunque en el ejemplo muestro un código muy rígido, es fácilmente generalizable para poder utilizarlo en cualquier escenario. Como en otras ocasiones, está en C#, mi lenguaje favorito, pero sería fácilmente portable a VB.NET, por ejemplo.


// Necesitaremos estos namespaces…
using System.Net.Mail;
using System.Net.Mime;


// Montamos la estructura básica del mensaje…
MailMessage mail = new MailMessage();
mail.From = new MailAddress(«origen@miservidor.com»);
mail.To.Add(«destinatario@miservidor.com»);
mail.Subject = «Mensaje con imagen»;

// Creamos la vista para clientes que
// sólo pueden acceder a texto plano…


string text = «Hola, ayer estuve disfrutando de «+
«un paisaje estupendo.»;

AlternateView plainView =
AlternateView.CreateAlternateViewFromString(text,
Encoding.UTF8,
MediaTypeNames.Text.Plain);


// Ahora creamos la vista para clientes que
// pueden mostrar contenido HTML…


string html = «<h2>Hola, mira dónde estuve ayer:</h2>» +
«<img src=’cid:imagen‘ />»;

AlternateView htmlView =
AlternateView.CreateAlternateViewFromString(html,
Encoding.UTF8,
MediaTypeNames.Text.Html);

// Creamos el recurso a incrustar. Observad
// que el ID que le asignamos (arbitrario) está
// referenciado desde el código HTML como origen
// de la imagen (resaltado en amarillo)…


LinkedResource img =
new LinkedResource(@»C:paisaje.jpg»,
MediaTypeNames.Image.Jpeg);
img.ContentId = «imagen«;

// 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…

SmtpClient smtp = new SmtpClient(«smtp.miservidor.com»);
smtp.Send(mail);



La siguiente imagen muestra una captura de pantalla del mismo mensaje leído desde un cliente con capacidad HTML como Outlook Express y uno que no la tiene, en este caso basado en web:

El mismo mensaje visto desde dos agentes de usuario distintos. Pulsa para ampliar.


Publicado en: www.variablenotfound.com.

2 comentarios sobre “Enviar mensajes con imágenes incrustadas desde .NET”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *