SmtpClient() le permite añadir archivos adjuntos a los correos, pero si lo que quieres es hacer aparecer una imagen cuando el correo se abre, en lugar de sujetarlo?

Yo recuerde, se puede hacer con cerca de 4 líneas de código, pero no recuerdo cómo y no la puedo encontrar en el sitio de MSDN.

EDIT: no estoy usando un sitio web o de cualquier cosa, ni siquiera una dirección IP. La imagen(s) se encuentran en una unidad de disco duro. Cuando se envían, deben ser parte de el correo. Así que, supongo que podría quiere utilizar una etiqueta… pero no estoy muy seguro, ya que mi equipo no es de radiodifusión.

  • Debo de haber perdido todo ese tiempo atrás. Actualizado
  • Revise este enlace. se ha preparado para utilizar el método de múltiples datos adjuntos en línea para png filestream, así como para general adjunto pdf/excel filestream. stackoverflow.com/questions/33665280/…
InformationsquelleAutor KdgDev | 2009-07-31

6 Comentarios

  1. 80

    Una solución en la que se menciona a menudo es agregar la imagen como un Attachment para el correo y, a continuación, hacer referencia a ella en el HTML mailbody el uso de un cid: de referencia.

    Sin embargo, si usted utiliza el LinkedResources colección en su lugar, las imágenes en línea todavía parecen bien, pero no se muestran como datos adjuntos adicionales para el correo. Que es lo que queremos que ocurra, así que lo 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 añade un AlternateView a su MailMessage de tipo text/html. Para completar, también debe agregar una AlternateView de tipo text/plain, que contiene una versión de texto del correo electrónico para que no sean HTML, los clientes de correo.

    • Muy interesante, pero ¿cómo presentar a un cliente de correo que sólo presenta el texto? Son las imágenes disponibles como archivos adjuntos? Yo pregunto por curiosidad, nunca lo he intentado, que a mí mismo.
    • La mejor práctica es incluir 2 AlternateViews en el correo, el primero es de tipo «text/plain», que contiene un texto cuerpo del correo. El segundo punto de Vista sería la «text/html» Ver he detallado anteriormente.
    • Esto funciona muy bien. Necesita alguna ligera modificación con el fin de utilizar las imágenes incluidas en el proyecto y un archivo html que contiene el contenido con marcadores de posición para el cid.
    • USTED ES UN PROTECTOR. después de 2 días de búsqueda …¡
    • Esta es una gran solución. Gracias por la adición. También me gustaría sugerir la adición de cómo hacerlo con un elemento de la Imagen. He conseguido que el uso de un MemoryStream con LinkedResource. Funcionaba de maravilla, … una vez que reinicio el .La posición de la propiedad después de llegar a un Arroyo!
    • ¿Cómo se usa: Servidor.MapPath() en Powershell?
    • Que fue sólo un ejemplo, ¿por qué no utilizar la ruta de acceso completa al archivo como argumento para LinkedResource() en su lugar.
    • Servidor.MapPath -> Donde es «Servidor» se define?
    • No se supone que para deshacerse newMail, así? Quiero decir, el SMTPClient se elimina debido a la instrucción de uso, pero ¿dónde está el MailMessage eliminados?
    • En fin para mí para hacer este trabajo, he tenido que incluir el contenido MIME en la creación de LinkedResource(«image/png»). Yo uso .Net 4.5
    • No funciona para mí(NET 4.0). Envía mi imagen como archivo adjunto y mostrando marco vacío en lugar de la imagen dentro de mi contenido de correo ..
    • Cómo utilizar esta solución con MailNotification clase y plantilla html para correo electrónico. Esta línea de código «NewMail.AlternateViews.Agregar(ver);» reemplaza el código html de la plantilla que se define tiró de la propiedad BodyFileName de la MailNotification objeto. Como resultado, sólo la imagen se muestra en el correo, y no el html de la plantilla.
    • Guardó mis esfuerzos !! Sin configuración tipo mime mientras creado LinkedResource, viene como archivo adjunto ATT0001.BIN en algunos de cliente de Windows como la APLICACIÓN de Correo en Windows 10… Gracias 🙂
    • lo que si hay son 3 logos en el correo ¿qué hacer entonces ?

  2. 13

    El Correo electrónico HTML y las imágenes son adjuntos, así que es sólo un caso de hacer referencia a la imagen(s) por su contenido los identificadores, 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 ser exhaustivos, los ejemplos aquí: Enviar Correo electrónico con imágenes en línea

    • Esto funciona y la imagen no aparece en el lugar correcto en el cuerpo del correo, pero supongo que el OP no quiere que la imagen aparezca en la lista de datos adjuntos. Creo que la respuesta correcta es utilizar un LinkedResource – ver mi respuesta.
    • ¿qué es el cid? Qué necesitamos para establecer algunos ajustes en el mailmessage objeto de ser capaz de utilizar MIME? También, ¿por qué usar un número aleatorio entre 100000, 9999999 para el id de contenido? Estoy usando el código en powershell, pero la imagen se muestra como una cruz roja.
    • Usted no debería usar un generador de números aleatorios cuando se requiere un id exclusivo. Utilizar los Guid o algo que se es garantizado para ser único.
    • No necesita ser global único pero es sólo una cuestión de sabor en la final. Esto es sólo un ejemplo de lo que no se entiende como la producción de código.
    • Si su contenido de la disposición es «en línea» en lugar de «apego» no va a aparecer en los clientes de correo de los archivos adjuntos (no en outlook).
    • Lázaro; un millón de gracias por esto. Estado tratando de solucionar este problema para los días y todo lo que faltaba era esta referencia a contentid. Este funciona a la perfección.

  3. 12

    Cuando dices 4 líneas de código, se refiere a este?

    System.Net.Mail.Attachment inline = new System.Net.Mail.Attachment(@"imagepath\filename.png");
    inline.ContentDisposition.Inline = true;
    • Que se parece a él… pero no fue más que eso creo…
    • su enlace en la respuesta no está activa durante más tiempo?
  4. 2

    ¿Qué acerca de la conversión de imágenes en Base64 cadenas? AFAIK esto puede ser fácilmente integrada dentro del cuerpo del correo.

    Echar un vistazo aquí.

    • Todavía estoy convencido de que esto tiene que ser considerado como una opción.. sweeting.org/mark/blog/2005/07/12/…
    • La imagen será codificado en base64 de todos modos, que nada tiene que ver con lo que hace aparecer dentro de un HTML de correo electrónico. El -1 no era de mí, pero la respuesta es un poco amplia de la marca.
    • Todo lo que quiero decir es que si quieres insertar una imagen dentro de un documento HTML, usted puede. Sólo codificar en base64 y lugar, la cadena resultante en el interior del atributo src de la etiqueta img. Echa un vistazo aquí: tekasarts.com/stuff/base_64_img.html Lo que hice fue: – gradiente-rellenar un gif en photoshop Convertir.ToBase64String() de la imagen bytes – pegar en un documento HTML tal y Como yo lo entiendo, esto no puede ser una solución preferida pero es en el tema y en cierto modo una solución bastante buena.
    • ¿Por qué votó en contra? Es correcto. Usted puede embedd imágenes en una url con los datos.
    • Hay algunas limitaciones (por ejemplo, tamaño) con respecto a las imágenes en Base64 cadenas creo.
    • La pregunta es acerca del correo electrónico, no en HTML. Muchos de los más populares clientes de correo (por ejemplo, todas las versiones de Outlook) no se muestran en Base64 imágenes.

  5. 0

    La solución ya publicado es el mejor que he encontrado, voy a completarlo 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 se puede ver tiene una matriz de nombres de imagen, es importante que las imágenes están en la misma carpeta, ya que está apuntando a la misma carpeta de salida.

    Finalmente el mensaje es enviado como async para que el usuario no tenga que esperar a ser enviados.

  6. -2

    El proceso de hacer que la imagen aparezca en el cliente cuando el correo se abre es una función de cliente. Siempre que el cliente sabe cómo procesar la imagen & no se ha bloqueado cualquier contenido de la imagen se abrirá de inmediato. Usted no tiene que hacer nada especial al enviar el correo electrónico para hacer que se abra en el cliente como han especificado correctamente la imagen mime tipo de archivo adjunto.

    • Alguien de cuidado, para explicar la razón por la downvote?
    • Leer de nuevo la cuestión. Él quiere adjuntar la imagen y se mostrará en el cuerpo.
    • Este es realmente el mejor colocado como un comentario a la aceptación de la respuesta.

Dejar respuesta

Please enter your comment!
Please enter your name here