Outlook web añadir con Graph API - Imágenes en línea que no se muestran al enviar el elemento actual como un archivo de Outlook Item

Soy capaz de enviar mi artículo actual como un apego , pero estoy corriendo en un problema donde si hay alguna imagen en línea dentro de mi artículo actual, Estos no se muestran correctamente cuando abro mi artículo actual como un apego de mi correo recién enviado / recibido. Entiendo que el src de la imagen es incorrecto después de enviar mi correo electrónico original como un adjunto, pero no estoy seguro de cómo rectificar esto o si esto es comportamiento esperado porque he perdido algo.

Mi objetivo es enviar mi artículo/email actual como aparece, como un punto de vista al buzón de correo de los destinatarios.

Me pregunto si hay un error en cómo he establecido mi json que publique en la API de Gráfico para enviar correo ? Lo publicaré abajo en caso de que todo salga mal. ¡Gracias por adelantado!

  var email = client.api('/me/messages/' + restID).get();

    var attachments = client.api('/me/messages/' + restID + '/attachments').get()

    const sendMail = {
        message: {
            subject:  'This contains my original email',// forwardMailSubject,
            body: {
                contentType: "Text",
                content: 'Test' // forwardMailBody
            },
            toRecipients: [
                {
                    emailAddress: {
                        address: '[email protected]' //forwardMailbox
                    }
                }
            ],
            attachments: [
                {
                    '@odata.type': "#microsoft.graph.itemAttachment",
                    'name': "attachment",
                    'contentType': "html",
                    'item': {
                        "@odata.type": "#microsoft.graph.message",
                        "id": email.id,
                        "createdDateTime": email.createdDateTime,
                        "lastModifiedDateTime": email.lastModifiedDateTime,
                        "receivedDateTime": email.receivedDateTime,
                        "sentDateTime": email.sentDateTime,
                        "hasAttachments": true,
                        "internetMessageId": email.internetMessageId,
                        "subject": "Reminder - please bring laptop",
                        "importance": "normal",
                        "conversationId": email.conversationId,
                        "isDeliveryReceiptRequested": false,
                        "isReadReceiptRequested": false,
                        "isRead": false,
                        "isDraft": false,
                        "webLink": email.webLink,
                        "body": email.body,
                        "sender": email.sender,
                        "from": email.from,
                        "toRecipients": email.toRecipients,
                        "attachments": attachments
                    }
                }
            ]
        }
    };

    client.api('/me/sendMail')
        .post(sendMail);

Pregunta hecha hace 3 años, 4 meses, 28 días - Por techinnovator


2 Respuestas:

  • El problema que estás experimentando se debe a que al enviar tu artículo/email actual como un adjunto, las imágenes en línea no se muestran correctamente debido a que el origen de las imágenes no es accesible para el destinatario del correo.

    Para solucionar esto, en lugar de adjuntar el mensaje completo como un ítem, puedes extraer y adjuntar solo el contenido HTML del mensaje. Asegúrate de reemplazar los enlaces de las imágenes en línea por enlaces a archivos adjuntos en el mensaje.

    Aquí te dejo un ejemplo de cómo podrías modificar tu código para lograr esto:

    javascript
    var email = client.api('/me/messages/' + restID).get();
    
    // Extraer el contenido HTML del mensaje
    var htmlContent = email.body.content;
    
    // Buscar y reemplazar las URL de las imágenes en línea por enlaces a archivos adjuntos
    var images = htmlContent.match(/?src="'["']/g);
    if (images) {
        images.forEach(function(img) {
            var src = img.match(/src="'["']/)[1];
            var attachment = {
                '@odata.type': "microsoft.graph.fileAttachment",            'name': "image" + src.substring(src.lastIndexOf('/') + 1),
                'contentBytes': "", // Aquí deberías incluir el contenido binario de la imagen en formato base64
            };
            // Adjuntar la imagen al correo
            sendMail.message.attachments.push(attachment);
            // Reemplazar la URL de la imagen por un enlace al archivo adjunto
            htmlContent = htmlContent.replace(src, "cid:" + attachment.name);
        });
    }
    
    const sendMail = {
        message: {
            subject:  'This contains my original email',
            body: {
                contentType: "html",
                content: htmlContent
            },
            // Resto de tu código para enviar el correo
        }
    };
    
    client.api('/me/sendMail')
        .post(sendMail);
    

    Esto debería permitir que las imágenes en línea se muestren correctamente cuando se envíe el artículo/email como un adjunto en el correo. Asegúrate de ajustar el código según tus necesidades y de incluir el contenido binario de las imágenes en formato base64 en el campo contentBytes de cada archivo adjunto.

    Respondida el Dec 18, 2020 a las 15:06 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema que describes probablemente se deba a que las imágenes en línea en tu correo electrónico original hacen referencia a ubicaciones en línea y no están incluidas en el archivo adjunto de Outlook Item. Cuando envías el elemento actual como un archivo adjunto, las imágenes en línea ya no podrán acceder a sus ubicaciones originales y, por lo tanto, no se mostrarán correctamente.

    Para resolver este problema, puedes intentar convertir las imágenes en línea en imágenes incrustadas utilizando la API de Gráfico. Esto implica cargar las imágenes en línea en OneDrive y luego vincularlas en el cuerpo del correo electrónico utilizando HTML o Markdown. Aquí tienes un ejemplo de cómo puedes hacerlo:

    
    // Carga las imágenes en línea en OneDrive
    var images = [];
    for (var i = 0; i < email.body.content.length; i++) {
      if (email.body.content[i].type === "Image") {
        var image = await client.api('/me/drive/root/children').post({
          name: 'image' + i + '.png',
          '@odata.type': 'microsoft.graph.file',      file: {
            '@odata.type': 'microsoft.graph.fileContent',        contentBytes: email.body.content[i].contentBytes
          }
        });
        images.push(image);
      }
    }
    
    // Actualiza el cuerpo del correo electrónico con imágenes incrustadas
    email.body.content = [];
    for (var i = 0; i < email.body.content.length; i++) {
      if (email.body.content[i].type === "Image") {
        email.body.content.push({
          type: "Image",
          src: 'cid:' + images[i].id
        });
      } else {
        email.body.content.push(email.body.content[i]);
      }
    }
    

    Después de actualizar el cuerpo del correo electrónico con imágenes incrustadas, puedes enviarlo como un archivo adjunto utilizando el código que proporcionaste anteriormente. Las imágenes deberían mostrarse correctamente en el correo electrónico recibido.

    Ten en cuenta que este enfoque requiere que tengas permisos para cargar archivos en OneDrive. Además, el número máximo de imágenes que puedes cargar en un solo correo electrónico es de 10.

    Respondida el Dec 18, 2020 a las 15:19 - por Gemini

    Votos positivos: 0 | Votos negativos: 0