Crear un email con imágenes embebidas

Cuando creamos un email desde .NET solemos intentar que el formato del mismo sea bastante aceptable… O deberíamos 😛

En ocasiones, es necesario incluir imágenes en el mismo y aquí es donde comienzan los problemas: Si referenciamos una imagen que está en un servidor concreto puede que ese servidor deje de existir, o eliminen la imagen, cambien la ruta, etcétera.

Por ello, creo que lo mejor es embeber estas imágenes dentro del correo y hacer referencia a las mismas. ¡Vamos a verlo!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;
using System.IO;

namespace EmailAndImages
{
public class Email
{
public static void EnviarMail(MyEmail email)
{

MailMessage mailMessage = new MailMessage();

mailMessage.From = new MailAddress(email.sender);

foreach (string addressee in email.addressees)
mailMessage.To.Add(addressee);

mailMessage.Subject = email.subject;

AlternateView alternateView = AlternateView.CreateAlternateViewFromString("<img id='header' alt='header' src='cid:idImage'/><p>Hello <strong>world</strong></p>", null, "text/html");

LinkedResource linkedResource;

using (WebClient webClient = new WebClient())
{
webClient.UseDefaultCredentials = true;
byte[] buf = webClient.DownloadData(email.imgURI);
MemoryStream memoryStream = new MemoryStream(buf);
linkedResource = new LinkedResource(memoryStream);
}

linkedResource.ContentId = "idImage";

alternateView.LinkedResources.Add(linkedResource);
mailMessage.AlternateViews.Add(alternateView);

SmtpClient smtpClient = new SmtpClient("10.10.10.50");

smtpClient.Send(mailMessage);
}
}
}

Un dato muy importante a tener en cuenta es que LinkedResource no soporta URIs, por lo que tuve que hacer uso de WebClient para recuperar la imagen en un MemoryStream y posteriormente adjuntarla.

Espero que sea de utilidad.

 ¡Saludos!

7 comentarios en “Crear un email con imágenes embebidas”

  1. Un pequeño consejo, deberias comprobar los parametros antes del envio del mensaje y devolver el estado del metodo send para comprobar si la operación se ha realizado correctamente. Quizas olvidastes el test unitario ???

    Un saludo.

  2. Hola Anónimo,

    Soy consciente de que hay que realizar ese tipo de comprobaciones. De hecho, para que quede más elegante, esa funcionalidad no debería estar en este método. Se podría utilizar tanto Data Annotations, IDataErrorInfo, etcétera 🙂

    La idea de este post es mostrar cómo se pueden embeber imágenes dentro de un email de la forma más simple posible.

    Tampoco olvidé las pruebas unitarias 🙂 Es cuestión de simplificar una funcionalidad en concreto.

    Gracias por tu comentario.

    ¡Saludos!

Deja un comentario

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