es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

MailMessage produce una estructura de origen de correo incorrecta que rompe las imágenes incrustadas en múltiples clientes.

Resumen: esencialmente, pregunto cómo hacer esto en .NET Core 3.1. Tengo esta jerarquía:

multipart / related
    ├── multipart / alternative
    │   ├── text / plain
    │   └── text / html
    └── image / png

Versión completa:
Construyo un correo electrónico:

using (var mailMessage = new MailMessage (new MailAddress (“from@from.com”), new MailAddress (“to@to.com”))) {
    mailMessage.Subject = mailContent.Subject;
    var htmlView = AlternateView.CreateAlternateViewFromString (mailContent.Html, Encoding.UTF8, “text / html”);

    htmlView.TransferEncoding = System.Net.Mime.TransferEncoding.SevenBit;

    htmlView.LinkedResources.Add (new LinkedResource (“image.png”)
    {
        ContentId = “imagecid”,
    });

    var plainView = AlternateView.CreateAlternateViewFromString (mailContent.Plain, Encoding.UTF8, “text / plain”);
    plainView.TransferEncoding = System.Net.Mime.TransferEncoding.SevenBit;
    mailMessage.AlternateViews.Add (plainView);
    mailMessage.AlternateViews.Add (htmlView);

    usando (var smtpServiceClient = …))
    smtpServiceClient.SendMessage (mailMessage);
}

La estructura que obtengo es:

Content-Type: multipart / alternative; boundary = -boundary_0_fe9da24c-3c5d-468a-bffb-388a6002a995
Fecha: 1 de diciembre de 2021 21:51:56 +0100
De: “xxx” <xxx.com>
Versión MIME: 1.0
Mensaje-ID: MQaSQxMTAs-VLocCm64ESW0i6DCc73eLuc9GUY9Fpbs = @ mailhog.example
Recibido: de xxxx por mailhog.example (MailHog)
          id MQaSQxMTAs-VLocCm64ESW0i6DCc73eLuc9GUY9Fpbs = @ mailhog.example; Mié, 01 de dic de 2021 20:51:59 +0000
Return-Path: <xxx.com>
Asunto: xxx
Para: test1@test12.com

—- boundary_0_fe9da24c-3c5d-468a-bffb-388a6002a995
Content-Type: text / plain; charset = utf-8
Content-Transfer-Encoding: 7 bits

PLAIN_TEXT_REPRESENTATION_HERE
—- boundary_0_fe9da24c-3c5d-468a-bffb-388a6002a995
Content-Type: multipart / relacionado; tipo = “texto / html”;;
 boundary = -boundary_1_4199b4eb-25b8-4c45-b11e-15b97d6ca815

—- boundary_1_4199b4eb-25b8-4c45-b11e-15b97d6ca815
Content-Type: text / html; charset = utf-8
Content-Transfer-Encoding: 7 bits

HTML_REPRESENATION_HERE
—- boundary_1_4199b4eb-25b8-4c45-b11e-15b97d6ca815
Content-Type: image / png
Content-Transfer-Encoding: base64
Content-ID:

base64_REPRESENTATION_HERE
—- boundary_1_4199b4eb-25b8-4c45-b11e-15b97d6ca815 —

—- boundary_0_fe9da24c-3c5d-468a-bffb-388a6002a995 —

lo que hace que algunos clientes no puedan representar imágenes incrustadas.

Lo que debería tener es:

multipart / related
    ├── multipart / alternative
    │   ├── text / plain
    │   └── text / html
    └── image / png

pero no tengo control sobre él usando la clase MailMessage.

¿Cómo solucionarlo? Aquí hay alguien que tiene exactamente la misma estructura: https://github.com/mailhog/MailHog/issues/206#issuecomment-596502425</xxx.com></xxx.com>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr la estructura deseada del correo electrónico, es posible crear la estructura MIME manualmente utilizando la biblioteca “MimeKit” en lugar de utilizar la clase “MailMessage”. Aquí hay un ejemplo de cómo puede crear la estructura MIME con la jerarquía deseada:

    using MimeKit;
    using MailKit.Net.Smtp;
    using System.Threading.Tasks;
    
    public async Task SendEmailAsync()
    {
        var message = new MimeMessage();
    
        message.From.Add(new MailboxAddress("Nombre del remitente", "from@example.com"));
        message.To.Add(new MailboxAddress("Nombre del destinatario", "to@example.com"));
        message.Subject = "Asunto";
    
        var bodyBuilder = new BodyBuilder();
    
        // Agregar la vista de texto plano
        bodyBuilder.TextBody = "Representación de texto plano aquí";
    
        // Agregar la vista HTML
        var vistaHtml = new TextPart("html")
        {
            Text = "REPRESENTACIÓN_HTML_AQUÍ"
        };
    
        // Agregar la imagen
        var imagen = new MimePart("image", "png")
        {
            Content = new MimeContent(@"C:\path\to\image.png", ContentEncoding.Default),
            ContentDisposition = new ContentDisposition(ContentDisposition.Inline),
            ContentTransferEncoding = ContentEncoding.Base64,
            ContentId = "<imagecid>"
        };
    
        // Construir la parte multipart/related
        var relacionado = new Multipart("related");
        relacionado.Add(vistaHtml);
        relacionado.Add(imagen);
    
        // Construir la parte multipart/alternative
        var alternativo = new Multipart("alternative");
        alternativo.Add(new TextPart("plain") { Text = "REPRESENTACIÓN_TEXTO_PLANO_AQUÍ" });
        alternativo.Add(relacionado);
    
        // Agregar la parte multipart/alternative al cuerpo del mensaje
        bodyBuilder.HtmlBody = alternativo.ToString();
    
        message.Body = bodyBuilder.ToMessageBody();
    
        using (var client = new SmtpClient())
        {
            await client.ConnectAsync("smtp.example.com", 587, false);
            await client.AuthenticateAsync("nombre de usuario", "contraseña");
            await client.SendAsync(message);
            await client.DisconnectAsync(true);
        }
    }
    

    Esto debería crear la estructura deseada del correo electrónico con “multipart/related” en el nivel superior, seguido de “multipart/alternative” y “image/png”.

Comments are closed.