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!