Creación de un complemento de Outlook de cifrado

Implemente la funcionalidad de cifrado y descifrado personalizada en un complemento de Outlook para proteger las comunicaciones por correo electrónico. El OnMessageDecrypt evento permite que el complemento identifique automáticamente los mensajes cifrados y controle el descifrado, la visualización del contenido y las notificaciones de error.

Introducción a los flujos de trabajo de cifrado y descifrado

Sugerencia

  • Los flujos de trabajo de cifrado y descifrado implementan la característica de activación basada en eventos. Si no está familiarizado con la activación basada en eventos en complementos de Outlook, se recomienda que primero obtenga información sobre la característica y su implementación. Para más información, consulte Activación de complementos con eventos.
  • El conjunto de requisitos mínimo y las plataformas admitidas pueden variar para cada API recomendada en esta sección. Se recomienda comprobar los requisitos de los conjuntos de requisitos de la API de JavaScript de Outlook y complementarlo con documentación para la API específica.

En la tabla siguiente se proporciona información general sobre los flujos de trabajo de cifrado y descifrado de un complemento de Outlook. También identifica si un paso requiere una solución personalizada o si es compatible con la biblioteca de API de JavaScript (Office.js) de Office.

Paso Implementación
El usuario redacta un mensaje y usa el complemento para aplicar reglas de cifrado Debe implementar su propio protocolo de cifrado para que el complemento pueda proteger el contenido del mensaje y sus datos adjuntos.
El usuario envía el mensaje Implemente un controlador para el evento OnMessageSend para que el complemento pueda ejecutar automáticamente el protocolo de cifrado cuando el usuario seleccione Enviar.

Para identificar un mensaje cifrado mediante el complemento durante el proceso de descifrado, use las API de encabezados de Internet para agregar un encabezado a un mensaje. La clave de encabezado debe coincidir con el valor especificado en el HeaderName atributo del <elemento LaunchEvent> para el evento OnMessageDecrypt en el manifiesto del complemento. Para obtener más información, consulte Implementación del descifrado mediante la activación basada en eventos.
El destinatario recibe el mensaje cifrado y lo abre. Si el destinatario tiene el mismo complemento que se usó para cifrar el mensaje instalado en Outlook, el complemento comprueba si la clave de encabezado incluida en el mensaje coincide con el valor especificado para el OnMessageDecrypt evento en el manifiesto. Esta operación la realiza automáticamente un complemento que controla el OnMessageDecrypt evento, de modo que no tenga que implementar manualmente la comprobación. Si los encabezados coinciden, se produce el OnMessageDecrypt evento y se ejecuta su controlador. Para obtener más información, consulte Implementación del descifrado mediante la activación basada en eventos.
El complemento descifra el mensaje Debe implementar su propio protocolo de descifrado en el controlador de OnMessageDecrypt eventos. Mientras el complemento descifra el mensaje y sus datos adjuntos, se muestra una notificación al usuario para avisarle de que el complemento está procesando su mensaje. Este complemento muestra automáticamente esta notificación que controla el OnMessageDecrypt evento, de modo que no tenga que crear uno manualmente.
El destinatario ve el mensaje descifrado y sus datos adjuntos, si los hay Una vez completada la operación de descifrado, se muestra automáticamente una notificación al usuario para avisarle de que el complemento ha terminado de procesar el mensaje. En el OnMessageDecrypt controlador, llame al método event.completed y páselo un objeto MessageDecryptEventCompletedOptions . Con el MessageDecryptEventCompletedOptions objeto , puede especificar si desea mostrar el contenido descifrado al destinatario. Para obtener más información, consulte Implementación del control de eventos.

Prueba de un complemento completado

Para ver inmediatamente un complemento de cifrado completado en acción, pruebe el ejemplo Cifrar y descifrar mensajes en Outlook.

Implementación del descifrado mediante la activación basada en eventos

Debe implementar sus propios protocolos de cifrado y descifrado. El complemento también debe configurarse para controlar el OnMessageDecrypt evento a fin de determinar convenientemente cuándo el complemento puede descifrar un mensaje y mostrar el contenido descifrado. Para implementar el OnMessageDecrypt evento, debe:

  1. Configure el manifiesto del complemento.
  2. Implemente el control de eventos.

Entornos admitidos

El OnMessageDecrypt evento se admite en la superficie Lectura de mensajes. La compatibilidad varía según el cliente y el entorno de Exchange, como se muestra en la tabla siguiente.

Cliente Exchange en línea Exchange Subscription Edition (SE) Exchange Server 2019 Exchange Server 2016
Explorador web Compatible No disponible No disponible No disponible
Windows (nuevo) Compatible No disponible No disponible No disponible
Windows (clásico)
Versión 2602 (compilación 19725.20126) y versiones posteriores
Compatible No disponible No disponible No disponible
Mac No disponible No disponible No disponible No disponible
Android No disponible No disponible No disponible No disponible
iOS No disponible No disponible No disponible No disponible

Configuración del manifiesto

Nota:

El OnMessageDecrypt evento y "extensions.autoRunEvents.events.options.headerName" la propiedad están en versión preliminar con el manifiesto unificado. No use la característica de descifrado con el manifiesto unificado en un complemento de producción.

En el archivo manifest.json del complemento, debe configurar la "extensions.runtimes" matriz y agregarla para habilitar la "extensions.autoRunEvents" activación basada en eventos en el complemento.

  1. Agregue el siguiente objeto a la matriz "extensions.runtimes". Tenga en cuenta lo siguiente sobre este marcado.

    • del "id" entorno de ejecución se establece en el nombre "autorun_runtime"descriptivo .
    • La "code" propiedad tiene una propiedad secundaria "page" establecida en un archivo HTML y una propiedad secundaria "script" establecida en un archivo JavaScript. Office usa uno de estos valores en función de la plataforma.
      • Outlook en la Web y el nuevo Outlook en Windows ejecutan el controlador en un tiempo de ejecución del explorador, que carga un archivo HTML. Ese archivo, a su vez, contiene una <script> etiqueta que carga el archivo JavaScript.
      • Outlook clásico en Windows ejecuta el controlador de eventos en un entorno de ejecución solo de JavaScript, que carga un archivo JavaScript directamente. Para obtener más información, vea Runtimes in Complementos de Office.
    • La "lifetime" propiedad se establece en "short", lo que significa que el tiempo de ejecución se inicia cuando se desencadena el evento y se cierra cuando se completa el controlador.
    • Las acciones asignan controladores de JavaScript a los OnMessageSend eventos y OnMessageDecrypt .
    "runtimes": [
        {
            "requirements": {
                "capabilities": [
                    {
                        "name": "Mailbox",
                        "minVersion": "1.16"
                    }
                ]
            },
            "id": "autorun_runtime",
            "type": "general",
            "code": {
                "page": "https://localhost:3000/launchevents.html",
                "script": "https://localhost:3000/launchevents.js"
            },
            "lifetime": "short",
            "actions": [
                {
                    "id": "onMessageSendHandler",
                    "type": "executeFunction"
                },
                {
                    "id": "onMessageDecryptHandler",
                    "type": "executeFunction"
                }
            ]
        }
    ],
    
  2. Agregue la siguiente "autoRunEvents" matriz como propiedad del objeto en la "extensions" matriz. Tenga en cuenta lo siguiente sobre este marcado.

    • Se crea un objeto de evento para cada evento que controla el complemento. En este ejemplo, se crea un objeto de evento para OnMessageSend y otro para OnMessageDecrypt. Ambos eventos usan su nombre "messageSending" de evento de manifiesto unificado y "messageDecrypt", como se describe en la tabla de eventos admitidos.
    • Para asegurarse de que el controlador adecuado se ejecuta cuando se produce un evento, el nombre de función proporcionado en "actionId" debe coincidir con el nombre usado en la "id" propiedad del objeto aplicable en la "runtimes.actions" matriz de un paso anterior.
    • La propiedad "options" proporciona una configuración adicional para los OnMessageSend eventos y OnMessageDecrypt .
      • Para OnMessageSend, la opción "sendMode" especifica si un usuario puede enviar su mensaje si no cumple las condiciones de un complemento. En este ejemplo, se especifica la "softBlock" opción . Para obtener más información sobre las opciones de modo de envío, vea la sección "Opciones de modo de envío disponibles" de Control de eventos OnMessageSend y OnAppointmentSend en el complemento de Outlook con alertas inteligentes.
      • Para OnMessageDecrypt, la opción "headerName" especifica el nombre de encabezado de Internet que se usa para identificar si el complemento cifró un mensaje. El mismo encabezado se agrega a un mensaje cifrado por el complemento.
    "autoRunEvents": [
        {
            "events": [
              {
                  "type": "messageSending",
                  "actionId": "onMessageSendHandler",
                  "options": {
                      "sendMode": "softBlock"
                  }
              },
              {
                  "type": "messageDecrypt",
                  "actionId": "onMessageDecryptHandler",
                  "options": {
                      "headerName": "contoso-encrypted"
                  }
              }
            ]
        }
    ]
    

Implementación del control de eventos

El OnMessageDecrypt controlador de eventos se usa para ejecutar la operación de descifrado y determinar si se debe mostrar el contenido descifrado de un mensaje.

  • Para asegurarse de que el controlador se ejecuta cuando se produce el OnMessageDecrypt evento, llame a Office.actions.associate en el archivo JavaScript donde se implementa el controlador. Esto asigna el nombre del controlador especificado en el FunctionName atributo del <LaunchEvent> elemento del manifiesto a su homólogo de JavaScript.
  • Una vez finalizada la operación de descifrado, debe llamar event.completed a para indicar al cliente que el complemento ha completado el procesamiento del OnMessageDecrypt evento. Para mostrar el contenido descifrado de un mensaje y sus datos adjuntos, pase un objeto MessageDecryptEventCompletedOptions a la event.completed llamada y establezca su propiedad allowEvent en true. A continuación, especifique el contenido descifrado del mensaje en las propiedades emailBody y attachments del objeto. También puede especificar los datos que el complemento pueda necesitar para su procesamiento en la propiedad contextData . Por ejemplo, puede almacenar encabezados de Internet personalizados para descifrar mensajes en escenarios de respuesta y reenvío.

Nota:

Tenga en cuenta lo siguiente al crear un complemento basado en eventos para Outlook clásico en Windows.

  • Las importaciones no se admiten actualmente en el archivo JavaScript que contiene el controlador de eventos.
  • Cuando la función de JavaScript especificada en el manifiesto para controlar un evento se ejecuta, el código de Office.onReady() y Office.initialize no se ejecuta. Se recomienda agregar cualquier lógica de inicio necesaria para el controlador de eventos, como comprobar la versión de Outlook del usuario, al controlador de eventos en su lugar.

A continuación se muestra un ejemplo de un OnMessageDecrypt controlador de eventos.

function onMessageDecryptHandler(event) {
    // Your code to decrypt the contents of a message would appear here.
    ...

    // Use the results from your decryption process to display the decrypted contents of the message body and attachments.
    const decryptedBodyContent = "<p>Please find attached the recent report and its supporting documentation.</p>";
    const decryptedBody = {
        coercionType: Office.CoercionType.Html,
        content: decryptedBodyContent
    };

    // Decrypted content and properties of a file attachment.
    const decryptedPdfFile = "JVBERi0xLjQKJeLjz9MKNCAwIG9i...";
    const pdfFileName = "Fabrikam_Report_202509";

    // Decrypted properties of a cloud attachment.
    const cloudFilePath = "https://contosostorage.com/reports/weekly_forecast.xlsx";
    const cloudFileName = "weekly_forecast.xlsx";

    // Decrypted content and properties of an inline image.
    const decryptedImageFile = "iVBORw0KGgoAAAANSUhEUgAA...";
    const imageFileName = "banner.png";
    const imageContentId = "image001.png@01DC1DD9.1A4AA300";

    const decryptedAttachments = [
        {
            attachmentType: Office.MailboxEnums.AttachmentType.File,
            content: decryptedPdfFile,
            isInline: false,
            name: pdfFileName
        },
        {
            attachmentType: Office.MailboxEnums.AttachmentType.Cloud,
            isInline: false,
            name: cloudFileName,
            path: cloudFilePath
        },
        {
            attachmentType: Office.MailboxEnums.AttachmentType.File,
            content: decryptedImageFile,
            contentId: imageContentId,
            isInline: true,
            name: imageFileName
        }
    ];

    event.completed({
        allowEvent: true,
        emailBody: decryptedBody,
        attachments: decryptedAttachments,
        contextData: { messageType: "ReplyFromDecryptedMessage" }
    });
}

// IMPORTANT: To ensure your add-in is supported in Outlook, remember to map the event handler name specified in the manifest to its JavaScript counterpart.
Office.actions.associate("onMessageDecryptHandler", onMessageDecryptHandler);

Sugerencia

Cuando se agregan imágenes a un mensaje como datos adjuntos insertados, se les asigna automáticamente un identificador de contenido. En el cuerpo de un mensaje, el identificador de contenido de un archivo adjunto insertado se especifica en el src atributo del <img> elemento similar al ejemplo siguiente.

<img width=96 height=96 id="Picture_1" src="cid:image001.png@01DC1E6F.FC7C7410">

Para identificar y proporcionar fácilmente estos datos adjuntos insertados durante el descifrado, se recomienda guardar los identificadores de contenido de los datos adjuntos insertados en el encabezado del mensaje durante el cifrado. Llame a Office.context.mailbox.item.getAttachmentsAsync para obtener el identificador de contenido de los datos adjuntos insertados. A continuación, llame a Office.context.mailbox.item.internetHeaders.setAsync para guardar el identificador en el encabezado del mensaje.

Descifrar datos adjuntos de elementos de Outlook (versión preliminar)

La compatibilidad con el descifrado de datos adjuntos de elementos de Outlook (Office.MailboxEnums.AttachmentType.Item), especialmente los datos adjuntos de correo electrónico, está disponible para la versión preliminar en Outlook en la Web y en Windows (nuevo y clásico). Para obtener una vista previa de esta característica en Outlook clásico en Windows, debe instalar la versión 2606 (compilación 20114.15110) o posterior. A continuación, únase al programa Microsoft 365 Insider y seleccione la opción Canal beta para acceder a las compilaciones beta de Office. Para probar esta característica con el código de ejemplo de este artículo, actualice la onMessageDecryptHandler función con el código siguiente.

    // Decrypted content and properties of an email attachment.
    const decryptedEmailFile = "VGhpcyBpcyBhIHRleHQgZmlsZS4=...";
    const emailFileName = "Fabrikam_Report_202508.eml";

    const decryptedAttachments = [
        ...
        {
            attachmentType: Office.MailboxEnums.AttachmentType.Item,
            content: decryptedEmailFile,
            name: emailFileName
        }
    ];
    ...

Personalización de mensajes de error para la operación de descifrado (versión preliminar)

Los mensajes de error personalizados para las operaciones de descifrado con errores están disponibles para la versión preliminar en Outlook en la Web y en Windows (nuevo y clásico). Para obtener una vista previa de esta característica en Outlook clásico en Windows, debe instalar la versión 2606 (compilación 20114.15110) o posterior. A continuación, únase al programa Microsoft 365 Insider y seleccione la opción Canal beta para acceder a las compilaciones beta de Office.

Si se produce un error en la operación de descifrado, la allowEvent propiedad de la event.completed llamada se establece falseen y Outlook muestra la siguiente notificación predeterminada al usuario: "<El nombre> del complemento no pudo procesar el mensaje". Para especificar un mensaje de error personalizado, establezca la propiedad errorMessage de la llamada del event.completed complemento. El mensaje personalizado tiene el prefijo "Error del nombre> del <complemento:". Si no se puede mostrar el mensaje personalizado, se muestra la notificación predeterminada en su lugar.

En el ejemplo de código siguiente se muestra cómo especificar un mensaje de error personalizado para el complemento de descifrado.

event.completed({
    allowEvent: false,
    errorMessage: "This message couldn't be decrypted. Contact the Contoso IT team for further assistance."
});

Administración de la distribución de contenido descifrado (versión preliminar)

Para ayudar a evitar la distribución no autorizada de contenido descifrado, las opciones de control de acceso están disponibles para la versión preliminar en Outlook en la Web y en Windows (nuevo y clásico). Para obtener una vista previa de esta característica en Outlook clásico en Windows, debe instalar la versión 2606 (compilación 20114.15110) o posterior. A continuación, únase al programa Microsoft 365 Insider y seleccione la opción Canal beta para acceder a las compilaciones beta de Office.

Para limitar la impresión, copia o guardado del contenido descifrado, incluya la propiedad accessControls de la event.completed llamada. A continuación, establezca las propiedades allowPrint, allowCopyPaste y allowSave en false. Si no se especifica la accessControls propiedad , los controles de acceso tienen como valor predeterminado true.

Para probar esta característica con el código de ejemplo de este artículo, actualice la event.completed llamada de la onMessageDecryptHandler función con el código siguiente.

    event.completed({
        allowEvent: true,
        emailBody: decryptedBody,
        attachments: decryptedAttachments,
        contextData: { messageType: "ReplyFromDecryptedMessage" },
        accessControls: {
            allowPrint: false,
            allowCopyPaste: false,
            allowSave: false
        }
    });

Nota:

  • En Outlook en la Web, establecer la allowCopyPaste propiedad en también impide que false los usuarios capturen su pantalla en forma de capturas de pantalla o grabaciones. La directiva de captura de pantalla permanece en vigor hasta que el usuario vuelve a cargar la pestaña del explorador de Outlook.
  • En Outlook en la Web y el nuevo Outlook en Windows, al establecer la allowPrint propiedad false en se deshabilita el menú contextual (que proporciona opciones como Copiar, Seleccionar todo e Imprimir). Si la allowCopyPaste propiedad está establecida trueen , el usuario puede seguir copiando contenido presionando Ctrl+C, pero la opción Copiar del menú contextual no está disponible.

Comportamiento y limitaciones

  • Tenga en cuenta los comportamientos y las limitaciones de los complementos basados en eventos. Para más información, consulte Activación de complementos con eventos.

  • Dado que cada complemento usa su propio protocolo de cifrado, el mismo complemento que lo cifró solo puede descifrar un mensaje. Cuando un usuario no tiene instalado el complemento necesario para descifrar un mensaje, una notificación le avisa de que el mensaje está cifrado. Para guiar al usuario a través del proceso de descifrado, personalice un mensaje de marcador de posición para el cuerpo del mensaje cifrado. El mensaje de marcador de posición puede incluir información sobre cómo instalar el complemento. Para establecer el cuerpo del mensaje durante el proceso de cifrado, llame a Office.context.mailbox.item.body.setAsync.

    Mensaje de marcador de posición de ejemplo de un mensaje cifrado.

  • Para garantizar la seguridad y confidencialidad de los datos, el contenido descifrado no se almacena en el cliente de Outlook. El contenido de un mensaje cifrado se descifra cada vez que un usuario lo abre.

  • Primero se debe descifrar un mensaje cifrado para que un usuario pueda responderlo o reenviarlo. Un usuario no puede responder ni reenviar un mensaje cifrado mientras se está descifrando.

  • Si un usuario navega a otro elemento de correo mientras se descifra un mensaje cifrado, el proceso de descifrado deja de ejecutarse. El usuario debe seleccionar o volver a abrir el mensaje para activar el proceso de descifrado.

  • Al responder o reenviar mensajes cifrados, los borradores se guardan sin cifrar en la carpeta Borradores .

  • La attachments propiedad del event.completed método no admite datos adjuntos de tipo Office.MailboxEnums.AttachmentType.Item, excepto la versión preliminar en Outlook en la Web y en Windows (nuevo y clásico). Para obtener más información, vea Descifrado de datos adjuntos de elementos de Outlook (versión preliminar).

  • Los complementos de cifrado personalizados no pueden cifrar los mensajes que ya están protegidos por DRM o S/MIME.

  • En Outlook en la Web y el nuevo Outlook en Windows, cuando los mensajes cifrados se agrupan por conversación, solo se descifra el mensaje seleccionado actualmente del subproceso de conversación. Los demás mensajes del subproceso de conversación permanecen cifrados hasta que se seleccionan.

  • En Outlook en la Web y el nuevo Outlook en Windows, los usuarios solo pueden descargar un mensaje descifrado en el formato EML. La opción para descargar en formato MSG no está disponible.

Notificaciones de descifrado

Los complementos que controlan el OnMessageDecrypt evento muestran automáticamente notificaciones en determinados escenarios de descifrado, como se describe en la tabla siguiente.

Notificación Escenario
<El nombre> del complemento no está disponible y no puede procesar el mensaje en este momento. Solo se aplica a Outlook clásico en Windows. Esta notificación se muestra cuando el complemento no se puede cargar porque un error impidió que se cargara el complemento o el cliente o la máquina del usuario está sin conexión.
<El nombre> del complemento no pudo procesar el mensaje. Se encontró un error mientras el complemento descifraba el mensaje. Para volver a intentar la operación de descifrado, el destinatario debe cambiar a otro mensaje y, a continuación, volver a abrir el mensaje cifrado para invocar el OnMessageDecrypt evento.
<El complemento de nombre> de complemento está descifrando el mensaje. El complemento controla el OnMessageDecrypt evento para descifrar el mensaje.
Este mensaje se cifra mediante <el complemento de nombre> de complemento. Esta notificación se muestra a los destinatarios que no tienen instalado el complemento de cifrado necesario. Para proporcionar instrucciones sobre cómo descifrar el mensaje, incluya un mensaje de marcador de posición en el cuerpo del mensaje cifrado. Para obtener más información, consulte Comportamiento y limitaciones.
<El complemento de nombre> de complemento ha descifrado el mensaje. El complemento descifra correctamente el contenido del mensaje. El usuario ahora puede ver el mensaje y sus datos adjuntos.
<El nombre> del complemento tarda más de lo esperado en procesar el mensaje. El complemento se ha estado ejecutando durante más de cinco segundos, pero menos de cinco minutos.
<Se agotó el tiempo de espera del nombre> del complemento. Para volver a intentarlo, seleccione otro correo electrónico y vuelva a este mensaje. El complemento agota el tiempo de espera después de ejecutarse durante cinco minutos. Para volver a intentar la operación de descifrado, el destinatario debe cambiar a otro mensaje y, a continuación, volver a abrir el mensaje cifrado para invocar el OnMessageDecrypt evento.
<Se agotó el tiempo de espera del nombre> del complemento. (versión preliminar) El complemento agota el tiempo de espera después de ejecutarse durante cinco minutos. Esta notificación incluye una acción Reintentar para que el destinatario pueda reintentar la operación de descifrado sin cambiar a otro mensaje. Esta característica de reintento está disponible para la versión preliminar en Outlook en la Web y en Windows (nuevo y clásico). Para obtener una vista previa de esta característica en Outlook clásico en Windows, debe instalar la versión 2606 (compilación 20114.15110) o posterior. A continuación, únase al programa Microsoft 365 Insider y seleccione la opción Canal beta para acceder a las compilaciones beta de Office.
<El nombre> del complemento no puede procesar este mensaje porque está protegido por una característica de seguridad integrada. El complemento intenta procesar un mensaje que ya está protegido por DRM o S/MIME.
Mensaje de error personalizado (versión preliminar) Se encontró un error mientras el complemento descifraba el mensaje. Para volver a intentar la operación de descifrado, el destinatario debe cambiar a otro mensaje y, a continuación, volver a abrir el mensaje cifrado para invocar el OnMessageDecrypt evento. Para obtener instrucciones sobre cómo personalizar un mensaje de error para la operación de descifrado, consulte Personalización de mensajes de error para la operación de descifrado (versión preliminar).

Vea también