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!