Performancing Metrics

Crear un email con imágenes embebidas - Return(GiS);

Return(GiS);

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!

Posted: 19/4/2010 19:08 por Gisela | con 7 comment(s)
Archivado en:
Comparte este post:

Comentarios

Anónimo ha opinado:

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.

# April 19, 2010 8:34 PM

Gisela ha opinado:

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!

# April 19, 2010 10:35 PM

tu follower ha opinado:

Excelente como siempre.

Tenia tiempo con esta duda.

# April 19, 2010 10:55 PM

Ricardo Sanchez ha opinado:

hola, buen post! sobretodo para los usuarios que piden correos masivos(mkt).

Saludos

# April 19, 2010 11:21 PM

Gisela ha opinado:

Muchas gracias por vuestros comentarios :)

¡Saludos!

# April 20, 2010 9:53 AM

preguntoncojonero ha opinado:

Muy útil, grz sra.

por curiosidad, ¿qué plugin utiliza para WLW para escribir código fuente formateado ?

salu2&grz

# April 20, 2010 9:56 AM

Gisela ha opinado:

Hola preguntoncojonero :)

No es un plugin para WLW, es una librería llamada

SyntaxHighlighter.

¡Saludos!

# April 22, 2010 12:08 PM