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!
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.
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!
Excelente como siempre.
Tenia tiempo con esta duda.
hola, buen post! sobretodo para los usuarios que piden correos masivos(mkt).
Saludos
Muchas gracias por vuestros comentarios 🙂
¡Saludos!
Muy útil, grz sra.
por curiosidad, ¿qué plugin utiliza para WLW para escribir código fuente formateado ?
salu2&grz
Hola preguntoncojonero 🙂
No es un plugin para WLW, es una librería llamada
SyntaxHighlighter.
¡Saludos!