incrustada - insertar imagen en correo c#
C#envía correos con imágenes en línea usando SmtpClient (6)
¿Qué hay de convertir imágenes en cadenas de Base64? AFAIK esto se puede incrustar fácilmente en el cuerpo del correo.
Echa un vistazo here .
SmtpClient () le permite agregar archivos adjuntos a sus correos, pero ¿qué sucede si desea hacer que aparezca una imagen cuando se abre el correo, en lugar de adjuntarlo?
Según recuerdo, se puede hacer con alrededor de 4 líneas de código, pero no recuerdo cómo y no puedo encontrarlo en el sitio de MSDN.
EDITAR: No estoy usando un sitio web ni nada, ni siquiera una dirección IP. Las imágenes están ubicadas en un disco duro. Cuando se envían, deben ser parte del correo. Entonces, supongo que podría querer usar una etiqueta ... pero no estoy muy seguro, ya que mi computadora no está transmitiendo.
Cuando dice 4 líneas de código, ¿se está refiriendo a this ?
System.Net.Mail.Attachment inline = new System.Net.Mail.Attachment(@"imagepath/filename.png");
inline.ContentDisposition.Inline = true;
El correo electrónico HTML y las imágenes son archivos adjuntos por lo que es solo un caso de referencia a la imagen (s) por sus identificaciones de contenido, es decir,
Dim A As System.Net.Mail.Attachment = New System.Net.Mail.Attachment(txtImagePath.Text)
Dim RGen As Random = New Random()
A.ContentId = RGen.Next(100000, 9999999).ToString()
EM.Body = "<img src=''cid:" + A.ContentId +"''>"
Parece que hay ejemplos completos aquí: Enviar correo electrónico con imágenes en línea
El proceso de hacer que una imagen aparezca en el cliente cuando se abre el correo es una función del cliente. Mientras el cliente sepa cómo renderizar la imagen y no haya bloqueado ningún contenido de imagen, la abrirá de inmediato. No tiene que hacer nada especial mientras envía el correo electrónico para abrirlo en el cliente, siempre y cuando haya especificado correctamente el tipo de archivo adjunto mime.
La solución ya publicada es la mejor que he encontrado, solo voy a completarla con, por ejemplo, si tienes varias imágenes.
string startupPath = AppDomain.CurrentDomain.RelativeSearchPath;
string path = Path.Combine(startupPath, "HtmlTemplates", "NotifyTemplate.html");
string body = File.ReadAllText(path);
//General tags replacement.
body = body.Replace("[NOMBRE_COMPLETO]", request.ToName);
body = body.Replace("[ASUNTO_MENSAJE]", request.Subject);
//Image List Used to replace into the template.
string[] imagesList = { "h1.gif", "left.gif", "right.gif", "tw.gif", "fb.gif" };
//Here we create link resources one for each image.
//Also the MIME type is obtained from the image name and not hardcoded.
List<LinkedResource> imgResourceList = new List<LinkedResource>();
foreach (var img in imagesList)
{
string imagePath = Path.Combine(startupPath, "Images", img);
var image = new LinkedResource(imagePath, "image/" + img.Split(''.'')[1]);
image.ContentId = Guid.NewGuid().ToString();
image.ContentType.Name = img;
imgResourceList.Add(image);
body = body.Replace("{" + Array.IndexOf(imagesList, img) + "}", image.ContentId);
}
//Altern view for managing images and html text is created.
var view = AlternateView.CreateAlternateViewFromString(body, null, "text/html");
//You need to add one by one each link resource to the created view
foreach (var imgResorce in imgResourceList)
{
view.LinkedResources.Add(imgResorce);
}
ThreadPool.QueueUserWorkItem(o =>
{
using (SmtpClient smtpClient = new SmtpClient(servidor, Puerto))
{
smtpClient.EnableSsl = true;
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.Timeout = 50000;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new System.Net.NetworkCredential()
{
UserName = UMail,
Password = password
};
using (MailMessage mailMessage = new MailMessage())
{
mailMessage.IsBodyHtml = true;
mailMessage.From = new MailAddress(UMail);
mailMessage.To.Add(request.ToEmail);
mailMessage.Subject = "[NAPNYL] " + request.Subject;
mailMessage.AlternateViews.Add(view);
smtpClient.Send(mailMessage);
}
}
});
Como puede ver, tiene una matriz de nombres de imágenes, es importante que las imágenes estén en la misma carpeta porque apunta a la misma carpeta de salida.
Finalmente, el correo electrónico se envía como una sincronización para que el usuario no tenga que esperar a que se envíe.
Una solución que se menciona a menudo es agregar la imagen como Attachment
al correo y luego hacer referencia a ella en el cuerpo del correo HTML utilizando un cid:
referencia.
Sin embargo, si utiliza la colección LinkedResources
lugar, las imágenes en línea seguirán apareciendo bien, pero no se mostrarán como archivos adjuntos adicionales al correo. Eso es lo que queremos que suceda , así que eso es lo que hago aquí:
using (var client = new SmtpClient())
{
MailMessage newMail = new MailMessage();
newMail.To.Add(new MailAddress("[email protected]"));
newMail.Subject = "Test Subject";
newMail.IsBodyHtml = true;
var inlineLogo = new LinkedResource(Server.MapPath("~/Path/To/YourImage.png"), "image/png");
inlineLogo.ContentId = Guid.NewGuid().ToString();
string body = string.Format(@"
<p>Lorum Ipsum Blah Blah</p>
<img src=""cid:{0}"" />
<p>Lorum Ipsum Blah Blah</p>
", inlineLogo.ContentId);
var view = AlternateView.CreateAlternateViewFromString(body, null, "text/html");
view.LinkedResources.Add(inlineLogo);
newMail.AlternateViews.Add(view);
client.Send(newMail);
}
NOTA: esta solución agrega una MailMessage
AlternateView
a su MailMessage
de tipo text/html
. Para completar, también debe agregar una AlternateView
de tipo text/plain
, que contenga una versión de texto sin formato del correo electrónico para clientes de correo que no sean HTML.