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 :P
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!