From 65a856d0d37ba1436aab908311232656944bbd94 Mon Sep 17 00:00:00 2001 From: Sam Ramon <15154970+samantharamon@users.noreply.github.com> Date: Fri, 5 Sep 2025 17:55:01 -0700 Subject: [PATCH 1/8] Draft encryption article --- docs/develop/event-based-activation.md | 39 ++-- ...outlook-encryption-placeholder-message.png | Bin 0 -> 19498 bytes docs/outlook/encryption-decryption.md | 221 ++++++++++++++++++ docs/outlook/one-outlook.md | 4 +- 4 files changed, 243 insertions(+), 21 deletions(-) create mode 100644 docs/images/outlook-encryption-placeholder-message.png create mode 100644 docs/outlook/encryption-decryption.md diff --git a/docs/develop/event-based-activation.md b/docs/develop/event-based-activation.md index a09f5a459..81bd7381b 100644 --- a/docs/develop/event-based-activation.md +++ b/docs/develop/event-based-activation.md @@ -1,7 +1,7 @@ --- title: Activate add-ins with events description: Learn how to develop an Office Add-in that implements event-based activation. -ms.date: 08/01/2025 +ms.date: 09/11/2025 ms.topic: concept-article ms.localizationpriority: medium --- @@ -54,24 +54,25 @@ Support for this feature in Outlook was introduced in [requirement set 1.10](/ja |Event canonical name
and add-in only manifest name|Unified manifest for Microsoft 365 name|Description|Minimum requirement set and supported clients| |---|---|---|---| -|`OnNewMessageCompose`| newMessageComposeCreated |On composing a new message (includes reply, reply all, and forward) but not on editing, for example, a draft.|[1.10](/javascript/api/requirement-sets/outlook/requirement-set-1.10/outlook-requirement-set-1.10)
| -|`OnNewAppointmentOrganizer`|newAppointmentOrganizerCreated|On creating a new appointment but not on editing an existing one.|[1.10](/javascript/api/requirement-sets/outlook/requirement-set-1.10/outlook-requirement-set-1.10)
| -|`OnMessageAttachmentsChanged`|messageAttachmentsChanged|On adding or removing attachments while composing a message.

Event-specific data object: [AttachmentsChangedEventArgs](/javascript/api/outlook/office.attachmentschangedeventargs?view=outlook-js-1.11&preserve-view=true)|[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)
| -|`OnAppointmentAttachmentsChanged`|appointmentAttachmentsChanged|On adding or removing attachments while composing an appointment.

Event-specific data object: [AttachmentsChangedEventArgs](/javascript/api/outlook/office.attachmentschangedeventargs?view=outlook-js-1.11&preserve-view=true)|[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)
| -|`OnMessageRecipientsChanged`|messageRecipientsChanged|On adding or removing recipients while composing a message.

Event-specific data object: [RecipientsChangedEventArgs](/javascript/api/outlook/office.recipientschangedeventargs?view=outlook-js-1.11&preserve-view=true)|[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)
| -|`OnAppointmentAttendeesChanged`|appointmentAttendeesChanged|On adding or removing attendees while composing an appointment.

Event-specific data object: [RecipientsChangedEventArgs](/javascript/api/outlook/office.recipientschangedeventargs?view=outlook-js-1.11&preserve-view=true)|[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)
| -|`OnAppointmentTimeChanged`|appointmentTimeChanged|On changing date/time while composing an appointment.

Event-specific data object: [AppointmentTimeChangedEventArgs](/javascript/api/outlook/office.appointmenttimechangedeventargs?view=outlook-js-1.11&preserve-view=true)

**Important**: If you drag and drop an appointment to a different date/time slot on the calendar, the `OnAppointmentTimeChanged` event doesn't occur. It only occurs when the date/time is directly changed from an appointment. |[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)
| -|`OnAppointmentRecurrenceChanged`|appointmentRecurrenceChanged|On adding, changing, or removing the recurrence details while composing an appointment. If the date/time is changed, the `OnAppointmentTimeChanged` event also occurs.

Event-specific data object: [RecurrenceChangedEventArgs](/javascript/api/outlook/office.recurrencechangedeventargs?view=outlook-js-1.11&preserve-view=true)|[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)
| -|`OnInfoBarDismissClicked`|infoBarDismissClicked|On dismissing a notification while composing a message or appointment item. Only the add-in that added the notification will be notified.

Event-specific data object: [InfobarClickedEventArgs](/javascript/api/outlook/office.infobarclickedeventargs?view=outlook-js-1.11&preserve-view=true)|[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)
| -|`OnMessageSend`|messageSending|On sending a message item. To learn more, try the [Smart Alerts walkthrough](../outlook/smart-alerts-onmessagesend-walkthrough.md).|[1.12](/javascript/api/requirement-sets/outlook/requirement-set-1.12/outlook-requirement-set-1.12)
| -|`OnAppointmentSend`|appointmentSending|On sending an appointment item. To learn more, see [Handle OnMessageSend and OnAppointmentSend events in your Outlook add-in with Smart Alerts](../outlook/onmessagesend-onappointmentsend-events.md).|[1.12](/javascript/api/requirement-sets/outlook/requirement-set-1.12/outlook-requirement-set-1.12)
| -|`OnMessageCompose`|messageComposeOpened|On composing a new message (includes reply, reply all, and forward) or editing a draft.|[1.12](/javascript/api/requirement-sets/outlook/requirement-set-1.12/outlook-requirement-set-1.12)
| -|`OnAppointmentOrganizer`|appointmentOrganizerOpened|On creating a new appointment or editing an existing one.|[1.12](/javascript/api/requirement-sets/outlook/requirement-set-1.12/outlook-requirement-set-1.12)
| -|`OnMessageFromChanged`|messageFromChanged|On changing the mail account in the **From** field of a message being composed. To learn more, see [Automatically update your signature when switching between Exchange accounts](../outlook/onmessagefromchanged-onappointmentfromchanged-events.md).|[1.13](/javascript/api/requirement-sets/outlook/requirement-set-1.13/outlook-requirement-set-1.13)
| -|`OnAppointmentFromChanged`|appointmentFromChanged|On changing the mail account in the organizer field of an appointment being composed. To learn more, see [Automatically update your signature when switching between Exchange accounts](../outlook/onmessagefromchanged-onappointmentfromchanged-events.md).|[1.13](/javascript/api/requirement-sets/outlook/requirement-set-1.13/outlook-requirement-set-1.13)
| -|`OnSensitivityLabelChanged`|sensitivityLabelChanged|On changing the sensitivity label while composing a message or appointment. To learn how to manage the sensitivity label of a mail item, see [Manage the sensitivity label of your message or appointment in compose mode](../outlook/sensitivity-label.md).

Event-specific data object: [SensitivityLabelChangedEventArgs](/javascript/api/outlook/office.sensitivitylabelchangedeventargs?view=outlook-js-preview&preserve-view=true)|[1.13](/javascript/api/requirement-sets/outlook/requirement-set-1.13/outlook-requirement-set-1.13)
| -|`OnMessageReadWithCustomAttachment`|Not available|On opening a message that contains a specific attachment type in read mode.|[Preview](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview)5
| -|`OnMessageReadWithCustomHeader`|Not available|On opening a message that contains a specific internet header name in read mode.|[Preview](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview)5
| +|`OnNewMessageCompose`| newMessageComposeCreated |On composing a new message (includes reply, reply all, and forward) but not on editing, for example, a draft.|[1.10](/javascript/api/requirement-sets/outlook/requirement-set-1.10/outlook-requirement-set-1.10)| +|`OnNewAppointmentOrganizer`|newAppointmentOrganizerCreated|On creating a new appointment but not on editing an existing one.|[1.10](/javascript/api/requirement-sets/outlook/requirement-set-1.10/outlook-requirement-set-1.10)| +|`OnMessageAttachmentsChanged`|messageAttachmentsChanged|On adding or removing attachments while composing a message.

Event-specific data object: [AttachmentsChangedEventArgs](/javascript/api/outlook/office.attachmentschangedeventargs?view=outlook-js-1.11&preserve-view=true)|[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)| +|`OnAppointmentAttachmentsChanged`|appointmentAttachmentsChanged|On adding or removing attachments while composing an appointment.

Event-specific data object: [AttachmentsChangedEventArgs](/javascript/api/outlook/office.attachmentschangedeventargs?view=outlook-js-1.11&preserve-view=true)|[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)| +|`OnMessageRecipientsChanged`|messageRecipientsChanged|On adding or removing recipients while composing a message.

Event-specific data object: [RecipientsChangedEventArgs](/javascript/api/outlook/office.recipientschangedeventargs?view=outlook-js-1.11&preserve-view=true)|[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)| +|`OnAppointmentAttendeesChanged`|appointmentAttendeesChanged|On adding or removing attendees while composing an appointment.

Event-specific data object: [RecipientsChangedEventArgs](/javascript/api/outlook/office.recipientschangedeventargs?view=outlook-js-1.11&preserve-view=true)|[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)| +|`OnAppointmentTimeChanged`|appointmentTimeChanged|On changing date/time while composing an appointment.

Event-specific data object: [AppointmentTimeChangedEventArgs](/javascript/api/outlook/office.appointmenttimechangedeventargs?view=outlook-js-1.11&preserve-view=true)

**Important**: If you drag and drop an appointment to a different date/time slot on the calendar, the `OnAppointmentTimeChanged` event doesn't occur. It only occurs when the date/time is directly changed from an appointment. |[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)| +|`OnAppointmentRecurrenceChanged`|appointmentRecurrenceChanged|On adding, changing, or removing the recurrence details while composing an appointment. If the date/time is changed, the `OnAppointmentTimeChanged` event also occurs.

Event-specific data object: [RecurrenceChangedEventArgs](/javascript/api/outlook/office.recurrencechangedeventargs?view=outlook-js-1.11&preserve-view=true)|[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)| +|`OnInfoBarDismissClicked`|infoBarDismissClicked|On dismissing a notification while composing a message or appointment item. Only the add-in that added the notification will be notified.

Event-specific data object: [InfobarClickedEventArgs](/javascript/api/outlook/office.infobarclickedeventargs?view=outlook-js-1.11&preserve-view=true)|[1.11](/javascript/api/requirement-sets/outlook/requirement-set-1.11/outlook-requirement-set-1.11)| +|`OnMessageSend`|messageSending|On sending a message item. To learn more, try the [Smart Alerts walkthrough](../outlook/smart-alerts-onmessagesend-walkthrough.md).|[1.12](/javascript/api/requirement-sets/outlook/requirement-set-1.12/outlook-requirement-set-1.12)| +|`OnAppointmentSend`|appointmentSending|On sending an appointment item. To learn more, see [Handle OnMessageSend and OnAppointmentSend events in your Outlook add-in with Smart Alerts](../outlook/onmessagesend-onappointmentsend-events.md).|[1.12](/javascript/api/requirement-sets/outlook/requirement-set-1.12/outlook-requirement-set-1.12)| +|`OnMessageCompose`|messageComposeOpened|On composing a new message (includes reply, reply all, and forward) or editing a draft.|[1.12](/javascript/api/requirement-sets/outlook/requirement-set-1.12/outlook-requirement-set-1.12)| +|`OnAppointmentOrganizer`|appointmentOrganizerOpened|On creating a new appointment or editing an existing one.|[1.12](/javascript/api/requirement-sets/outlook/requirement-set-1.12/outlook-requirement-set-1.12)| +|`OnMessageFromChanged`|messageFromChanged|On changing the mail account in the **From** field of a message being composed. To learn more, see [Automatically update your signature when switching between Exchange accounts](../outlook/onmessagefromchanged-onappointmentfromchanged-events.md).|[1.13](/javascript/api/requirement-sets/outlook/requirement-set-1.13/outlook-requirement-set-1.13)| +|`OnAppointmentFromChanged`|appointmentFromChanged|On changing the mail account in the organizer field of an appointment being composed. To learn more, see [Automatically update your signature when switching between Exchange accounts](../outlook/onmessagefromchanged-onappointmentfromchanged-events.md).|[1.13](/javascript/api/requirement-sets/outlook/requirement-set-1.13/outlook-requirement-set-1.13)| +|`OnSensitivityLabelChanged`|sensitivityLabelChanged|On changing the sensitivity label while composing a message or appointment. To learn how to manage the sensitivity label of a mail item, see [Manage the sensitivity label of your message or appointment in compose mode](../outlook/sensitivity-label.md).

Event-specific data object: [SensitivityLabelChangedEventArgs](/javascript/api/outlook/office.sensitivitylabelchangedeventargs?view=outlook-js-preview&preserve-view=true)|[1.13](/javascript/api/requirement-sets/outlook/requirement-set-1.13/outlook-requirement-set-1.13)| +|`OnMessageReadWithCustomAttachment`|Not available|On opening a message that contains a specific attachment type in read mode.|[Preview](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview)5| +|`OnMessageReadWithCustomHeader`|Not available|On opening a message that contains a specific internet header name in read mode.|[Preview](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview)5| +|`OnMessageDecrypt` (preview)|Not available|On matching the header of an encrypted message to the header key in an add-in's manifest. To learn more, see [Create an encryption Outlook add-in](../outlook/encryption-decryption.md)|[Preview](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview)| > [!NOTE] > 1 Event-based add-ins in classic Outlook on Windows require a minimum of Windows 10 Version 1903 (Build 18362) or Windows Server 2019 Version 1903 to run. diff --git a/docs/images/outlook-encryption-placeholder-message.png b/docs/images/outlook-encryption-placeholder-message.png new file mode 100644 index 0000000000000000000000000000000000000000..33ca5f748d42d67f9c84f9dde28cfb67901b8e0a GIT binary patch literal 19498 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 [!NOTE] +> The `OnMessageDecrypt` event and decryption APIs are in preview. Features in preview shouldn't be used in production add-ins. We invite you to try out this feature in test or development environments and welcome feedback on your experience through GitHub (see the "Office Add-ins feedback" section at the end of this page). + +## Overview of the encryption and decryption workflows + +> [!TIP] +> +> - The encryption and decryption workflows implements the event-based activation feature. If you aren't familiar with event-based activation in Outlook add-ins, we recommend that you first familiarize yourself with the feature and its implementation. To learn more, see [Activate add-ins with events](../develop/event-based-activation.md). +> - The minimum requirement set and supported platforms may vary for each API recommended in this section. We recommend verifying any requirements against [Outlook JavaScript API requirement sets](/javascript/api/requirement-sets/outlook/outlook-api-requirement-sets#outlook-client-support) and supplementing it with documentation for the specific API. + +The following table provides an overview of the encryption and decryption workflows of an Outlook add-in. It also identifies whether a step requires your custom solution or is supported by the Office JavaScript (Office.js) API library. + +| Step | Implementation | +| ---- | -------------- | +| User composes a message and uses your add-in to apply encryption rules | You must implement your own encryption protocol so that the add-in can secure the contents of the message and its attachments. | +| User sends the message | Implement a handler for the [OnMessageSend](onmessagesend-onappointmentsend-events.md) event so that your add-in can automatically run your encryption protocol when the user selects **Send**.

To identify a message that was encrypted using your add-in during the decryption process, use the [internet headers APIs](/javascript/api/outlook/office.internetheaders) to add a header to a message. The header key must match the value specified in the `HeaderName` attribute of the [\](/javascript/api/manifest/launchevent?view=outlook-js-preview&preserve-view=true) element for the [OnMessageDecrypt](../develop/event-based-activation.md#outlook-events) event in the add-in's manifest. For more information, see [Implement decryption using event-based activation](#implement-decryption-using-event-based-activation). | +| Recipient receives the encrypted message and opens it | If the recipient has the same add-in that was used to encrypt the message installed in Outlook, the add-in checks whether the header key included in the message matches the value specified for the `OnMessageDecrypt` event in the manifest. This operation is automatically done by an add-in that handles the `OnMessageDecrypt` event, so that you don't have to manually implement the check. If the headers match, the `OnMessageDecrypt` event occurs and its handler runs. For more information, see [Implement decryption in your add-in](#implement-decryption-in-your-add-in). | +| Add-in decrypts the message | You must implement your own decryption protocol in the `OnMessageDecrypt` event handler. While your add-in decrypts the message and its attachments, a notification is shown to the user to alert them that their message is being processed by the add-in. This notification is automatically shown by an add-in that handles the `OnMessageDecrypt` event, so that you don't have to manually create one. | +| Recipient views the decrypted message and its attachments, if any | Once the decryption operation is complete, a notification is automatically shown to the user to alert them that the add-in has finished processing the message. In your `OnMessageDecrypt` handler, call the [event.completed](/javascript/api/outlook/office.mailboxevent?view=outlook-js-preview&preserve-view=true#outlook-office-mailboxevent-completed-member(1)) and pass it a [MessageDecryptEventCompletedOptions](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true) object. With the `MessageDecryptEventCompletedOptions` object, you can specify whether to display the decrypted content to the recipient. For more information, see [Implement event handling](#implement-event-handling). | + +## Implement decryption using event-based activation + +While you must implement your own encryption and decryption protocol in your add-in, configure your add-in to handle the `OnMessageDecrypt` event to conveniently determine when your add-in can decrypt a message and display the decrypted contents. To implement the `OnMessageDecrypt` event, you must: + +1. [Configure the add-in's manifest](#configure-the-manifest). +1. [Implement event handling](#implement-event-handling). + +### Supported environments + +The `OnMessageDecrypt` event is supported on the Message Read surface. Support varies by client and Exchange environment as shown in the following table. + +| Client | Exchange Online | Exchange Subscription Edition (SE) | Exchange Server 2019 | Exchange Server 2016 | +| ------ | --------------- | ---------------------------------- | -------------------- | -------------------- | +| **Web browser** | Not available | Not available | Not available | Not available | +| **Windows (new)** | Not available | Not available | Not available | Not available | +| **Windows (classic)**
Version TBD (Build TBD) and later | In preview | Not available | Not available | Not available | +| **Mac** | Not available | Not available | Not available | Not available | +| **Android** | Not available | Not available | Not available | Not available | +| **iOS** | Not available | Not available | Not available | Not available | + +#### Preview the decryption APIs in classic Outlook on Windows + +Classic Outlook on Windows includes a local copy of the production and beta versions of Office.js instead of loading from the content delivery network (CDN). By default, the local production copy of the API is referenced. To reference the local beta copy of the API, you must configure your computer's registry. This will enable you to test [preview features](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview) in your event handlers in classic Outlook on Windows. + +1. In the registry, navigate to `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Outlook\Options\WebExt\Developer`. If the key doesn't exist, create it. + +1. Create an entry named `EnableBetaAPIsInJavaScript` and set its value to `1`. + + :::image type="content" source="../images/outlook-beta-registry-key.png" alt-text="The `EnableBetaAPIsInJavaScript` key is set to 1 in the Registry Editor."::: + +### Configure the manifest + +> [!NOTE] +> The `OnMessageDecrypt`event can currently only be implemented with an add-in only manifest. + +To activate your add-in on the `OnMessageDecrypt` event, you must configure the [\](/javascript/api/manifest/versionoverrides-1-1-mail) node of your add-in's **manifest.xml** file as follows. + +- To run an event-based add-in in classic Outlook on Windows, you must specify the JavaScript file that contains the event handler in the [\](/javascript/api/manifest/override) child element of the [\](/javascript/api/manifest/runtime) element. +- Specify the `OnMessageDecrypt` event in the `Type` attribute of a [\](/javascript/api/manifest/launchevent?view=outlook-js-preview&preserve-view=true) element. You must assign the function name of the event handler to the `FunctionName` attribute of the element. To facilitate checking whether the add-in encrypted a message, a header key must be specified in the `HeaderName` attribute. The same header is added to a message when an add-in encrypts it. + +The following is an example of a `` node that implements the `OnMessageDecrypt` event. + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... + + + + + ... + + + +``` + +### Implement event handling + +The `OnMessageDecrypt` event handler is used to run the decryption operation and determine whether to display the decrypted contents of a message. + +- To ensure your handler runs when the `OnMessageDecrypt` event occurs, call `Office.actions.associate` in the JavaScript file where the handler is implemented. This maps the handler name specified in the `FunctionName` attribute of the `` element in the manifest to its JavaScript counterpart. +- Once the decryption operation finishes, you must call `event.completed` to signal to the client that your add-in has completed processing the `OnMessageDecrypt` event. To display the decrypted contents of a message and its attachments, pass a [MessageDecryptEventCompletedOptions](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true) object to the `event.completed` call and set its [allowEvent](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true#outlook-office-messagedecrypteventcompletedoptions-allowevent-member) property to `true`. Then, specify the decrypted contents of the message in the object's [emailBody](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true#outlook-office-messagedecrypteventcompletedoptions-emailbody-member) and [attachments](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true#outlook-office-messagedecrypteventcompletedoptions-attachments-member) properties. + +> [!NOTE] +> Be mindful of the following when creating an event-based add-in for classic Outlook on Windows. +> +> - Imports aren't currently supported in the JavaScript file containing the event handler. +> - When the JavaScript function specified in the manifest to handle an event runs, code in `Office.onReady()` and `Office.initialize` isn't run. We recommend adding any startup logic needed by the event handler, such as checking the user's Outlook version, to the event handler instead. + +The following is an example of an `OnMessageDecrypt` event handler. + +```javascript +function onMessageDecryptHandler(event) { + // Your code to decrypt the contents of a message would appear here. + ... + + // Display the message body and attachments if decryption is successful. + const decryptedBody = { + coercionType: Office.CoercionType.Html, + content: "

Please find attached the recent report and its supporting documentation.

" + }; + + const decryptedAttachments = [ + { + attachmentType: Office.MailboxEnums.AttachmentType.File, + content: "JVBERi0xLjQKJeLjz9MKNCAwIG9i...", + isInline: false, + name: "Fabrikam_Report_202509" + }, + { + attachmentType: Office.MailboxEnums.AttachmentType.Item, + content: "VGhpcyBpcyBhIHRleHQgZmlsZS4=...", + isInline: false, + name: "Fabrikam_Report_202508.eml" + }, + { + attachmentType: Office.MailboxEnums.AttachmentType.Cloud, + isInline: false, + name: "weekly_forecast.xlsx", + path: "https://contosostorage.com/reports/weekly_forecast.xlsx" + }, + { + attachmentType: Office.MailboxEnums.AttachmentType.File, + content: "iVBORw0KGgoAAAANSUhEUgAA...", + contentId: "image001.png@01DC1DD9.1A4AA300", + isInline: true, + name: "banner.png" + } + ]; + + event.completed({ + allowEvent: true, + emailBody: decryptedBody, + attachments: decryptedAttachments + }); +} + +// 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); +``` + +> [!TIP] +> When images are added to a message as inline attachments, they're automatically assigned a content ID. In the body of a message, the content ID of an inline attachment is specified in the `src` attribute of the `` element similar to the following example. +> +> `` +> +> To easily identify and provide these inline attachments during decryption, we recommend saving the content IDs of inline attachments to the message header during encryption. Call [Office.context.mailbox.item.getAttachmentsAsync](/javascript/api/outlook/office.messagecompose?view=outlook-js-preview&preserve-view=true#outlook-office-messagecompose-getattachmentsasync-member(1)) to get the [content ID](/javascript/api/outlook/office.attachmentdetailscompose?view=outlook-js-preview&preserve-view=true#outlook-office-attachmentdetailscompose-contentid-member) of an inline attachment. Then, call [Office.context.mailbox.item.internetHeaders.setAsync](/javascript/api/outlook/office.internetheaders#outlook-office-internetheaders-setasync-member(1)) to save the ID to the header of the message. + +## Behavior and limitations + +- Be aware of the behaviors and limitations of event-based add-ins. To learn more, see [Activate add-ins with events](../develop/event-based-activation.md#behavior-and-limitations). +- Since each add-in uses its own encryption protocol, a message can only be decrypted by the same add-in that encrypted it. When a user doesn't have the required add-in installed to decrypt a message, a notification isn't shown to them. To guide the user through the decryption process, customize a placeholder message for the body of the encrypted message. The placeholder message can include information on how to install your add-in. To set the message body during the encryption process, call [Office.context.mailbox.item.body.setAsync](/javascript/api/outlook/office.body#outlook-office-body-setasync-member(2)). + + :::image type="content" source="../images/outlook-encryption-placeholder-message.png" alt-text="A sample placeholder message of an encrypted message."::: + +- To ensure data security and confidentiality, decrypted content isn't stored on the Outlook client. The contents of an encrypted message are decrypted every time a user opens it. +- An encrypted message must first be decrypted before a user can reply or forward it. A user can't reply or forward an encrypted message while it's being decrypted. +- If a user navigates to another mail item while an encrypted message is being decrypted, the decryption process stops running. The user must select or open the message again to activate the decryption process. +- When replying to or forwarding encrypted messages, drafts are saved unencrypted in the **Drafts** folder. + +### Decryption notifications + +Add-ins that handle the `OnMessageDecrypt` event automatically display notifications in certain decryption scenarios as described in the following table. + +| Notification | Scenario | +| ------------ | -------- | +| \ is unavailable and can't process your message at this time | Applies to classic Outlook on Windows only. This notification is shown when the add-in fails to load because an error prevented the add-in from loading or the user's client or machine is offline. | +| \ failed to process your message | An error was encountered while the add-in was decrypting the message. To retry the decryption operation, the recipient must switch to another message, then open the encrypted message again to invoke the `OnMessageDecrypt` event. | +| \ is processing your message | The add-in is handling the `OnMessageDecrypt` event to decrypt the message. | +| \ has finished processing your message | The add-in successfully decrypted the contents of the message. The user can now view the message and its attachments. | +| \ is taking longer than expected to process your message | The add-in has been running for more than five seconds, but less than five minutes. | +| \ timed out. To retry, select another email and then return to this message | The add-in times out after running for five minutes. To retry the decryption operation, the recipient must switch to another message, then open the encrypted message again to invoke the `OnMessageDecrypt` event. | + +## See also + +- [Privacy and security for Office Add-ins](../concepts/privacy-and-security.md) +- [Activate add-ins with events](../develop/event-based-activation.md) +- [Troubleshoot event-based and spam-reporting add-ins](../testing/troubleshoot-event-based-and-spam-reporting-add-ins.md) +- [Get and set internet headers on a message in an Outlook add-in](internet-headers.md) +- [Manage the sensitivity label of your message or appointment in compose mode](sensitivity-label.md) diff --git a/docs/outlook/one-outlook.md b/docs/outlook/one-outlook.md index 308cbc11b..9c00eb1c0 100644 --- a/docs/outlook/one-outlook.md +++ b/docs/outlook/one-outlook.md @@ -1,7 +1,7 @@ --- title: Develop Outlook add-ins for the new Outlook on Windows description: Learn how to develop add-ins that are compatible with the new Outlook on Windows. -ms.date: 08/05/2025 +ms.date: 09/11/2025 ms.localizationpriority: medium --- @@ -45,7 +45,7 @@ The following table identifies key Outlook scenarios and their support status in |Mail item transformation|Enable users to transform mail items into other formats.|Supported.|
  • [Drag and drop messages and attachments into the task pane of an Outlook add-in](drag-drop-items.md)
  • [getAsFileAsync method](/javascript/api/outlook/office.messageread#outlook-office-messageread-getasfileasync-member(1))
| |Project management|Enable users to create and track project work items from partner systems.|Supported.|
  • [Activate your Outlook add-in on multiple messages](item-multi-select.md)
  • [Activate your Outlook add-in without the Reading Pane enabled or a message selected](contextless.md)
  • [Verify the color categories applied to a new message or appointment](https://github.com/OfficeDev/Office-Add-in-samples/tree/main/Samples/outlook-check-item-categories)
| |Attachment management|Enable users to import or export attachments from partner locations.|Supported.|
  • [Activate your Outlook add-in on multiple messages](item-multi-select.md)
  • [Activate your Outlook add-in without the Reading Pane enabled or a message selected](contextless.md)
  • [Activate add-ins with events](../develop/event-based-activation.md)
  • [Drag and drop messages and attachments into the task pane of an Outlook add-in](drag-drop-items.md)
| -|Message encryption|Enable users to encrypt and decrypt messages.|Partially supported. Essential features are yet to be addressed to create a similar experience to VSTO or COM add-ins.|
  • [Office.context.mailbox.item.body.getAsync](/javascript/api/outlook/office.body#outlook-office-body-getasync-member(1))
  • [Office.context.mailbox.item.body.setAsync](/javascript/api/outlook/office.body#outlook-office-body-setasync-member(1))
  • [Office.context.mailbox.item.display](/javascript/api/outlook/office.messageread?view=outlook-js-preview&preserve-view=true#outlook-office-messageread-display-member) (preview)
  • [Office.context.mailbox.item.display.body.setAsync](/javascript/api/outlook/office.displayedbody?view=outlook-js-preview&preserve-view=true#outlook-office-displayedbody-setasync-member(1)) (preview)
  • [Office.context.mailbox.item.display.subject.setAsync](/javascript/api/outlook/office.displayedsubject#outlook-office-displayedsubject-setasync-member(1)) (preview)
| +|Message encryption|Enable users to encrypt and decrypt messages.|Partially supported. Essential features are yet to be addressed to create a similar experience to VSTO or COM add-ins.|
  • [Activate add-ins with events](../develop/event-based-activation.md)
  • [Handle OnMessageSend and OnAppointmentSend events in your Outlook add-in with Smart Alerts](onmessagesend-onappointmentsend-events.md)
  • [Create an encryption Outlook add-in](encryption-decryption.md)
  • [Office.MessageDecryptEventCompletedOptions](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true) (preview)
  • [Office.DecryptedMessageAttachment](/javascript/api/outlook/office.decryptedmessageattachment?view=outlook-js-preview&preserve-view=true)
  • [Office.DecryptedMessageBody](/javascript/api/outlook/office.decryptedmessagebody?view=outlook-js-preview&preserve-view=true)
  • [Office.context.mailbox.item.body.getAsync](/javascript/api/outlook/office.body#outlook-office-body-getasync-member(1))
  • [Office.context.mailbox.item.body.setAsync](/javascript/api/outlook/office.body#outlook-office-body-setasync-member(1))
  • [Office.context.mailbox.item.display](/javascript/api/outlook/office.messageread?view=outlook-js-preview&preserve-view=true#outlook-office-messageread-display-member) (preview)
  • [Office.context.mailbox.item.display.body.setAsync](/javascript/api/outlook/office.displayedbody?view=outlook-js-preview&preserve-view=true#outlook-office-displayedbody-setasync-member(1)) (preview)
  • [Office.context.mailbox.item.display.subject.setAsync](/javascript/api/outlook/office.displayedsubject#outlook-office-displayedsubject-setasync-member(1)) (preview)
  • [Office.context.mailbox.item.internetHeaders.setAsync](/javascript/api/outlook/office.internetheaders#outlook-office-internetheaders-setasync-member(1))
| |Data loss prevention|Prevent users from forwarding mail items that contain highly sensitive information.|Supported.|
  • [Automatically check for an attachment before a message is sent](smart-alerts-onmessagesend-walkthrough.md)
  • [Handle OnMessageSend and OnAppointmentSend events in your Outlook add-in with Smart Alerts](onmessagesend-onappointmentsend-events.md)
  • [Manage the sensitivity label of your message or appointment in compose mode](sensitivity-label.md)
  • [Verify the sensitivity label of a message](https://github.com/OfficeDev/Office-Add-in-samples/tree/main/Samples/outlook-verify-sensitivity-label)
  • [Office.SensitivityLabel](/javascript/api/outlook/office.sensitivitylabelscatalog)
  • [Office.SensitivityLabelsCatalog](/javascript/api/outlook/office.sensitivitylabelscatalog)
  • [Office.SensitivityLabelDetails](/javascript/api/outlook/office.sensitivitylabeldetails)
  • [Office.context.mailbox.item.body.getAsync](/javascript/api/outlook/office.body#outlook-office-body-getasync-member(1))
  • [Office.context.mailbox.item.body.setAsync](/javascript/api/outlook/office.body#outlook-office-body-setasync-member(1))
  • [Office.context.mailbox.item.closeAsync](/javascript/api/outlook/office.messagecompose#outlook-office-messagecompose-closeasync-member(1))
  • [Office.context.mailbox.item.inReplyTo](/javascript/api/outlook/office.messagecompose#outlook-office-messagecompose-inreplyto-member)
  • [Office.context.mailbox.item.getConversationIndexAsync](/javascript/api/outlook/office.messagecompose#outlook-office-messagecompose-getconversationindexasync-member(1))
  • [Office.context.mailbox.item.getItemClassAsync](/javascript/api/outlook/office.messagecompose#outlook-office-messagecompose-getitemclassasync-member(1))
| |Mail item classification|Enable users to identify and classify messages that contain sensitive information.|Partially supported. Essential features are yet to be addressed to create a similar experience to VSTO or COM add-ins.|
  • [Automatically check for an attachment before a message is sent](smart-alerts-onmessagesend-walkthrough.md)
  • [Handle OnMessageSend and OnAppointmentSend events in your Outlook add-in with Smart Alerts](onmessagesend-onappointmentsend-events.md)
  • [Manage the sensitivity label of your message or appointment in compose mode](sensitivity-label.md)
  • [Manage the sensitivity level of an appointment](/javascript/api/outlook/office.sensitivity)
  • [Office.Sensitivity](/javascript/api/outlook/office.sensitivity)
  • [Office.SensitivityLabel](/javascript/api/outlook/office.sensitivitylabelscatalog)
  • [Office.SensitivityLabelsCatalog](/javascript/api/outlook/office.sensitivitylabelscatalog)
  • [Office.SensitivityLabelDetails](/javascript/api/outlook/office.sensitivitylabeldetails)
| |Data sync service|Enable bidirectional synchronization of mail items with partner systems.|Partially supported. Essential features are yet to be addressed to create a similar experience to VSTO or COM add-ins.|
  • [Use Microsoft Graph to manage personal contacts in Outlook](/graph/outlook-contacts-concept-overview)
| From 4493a272a3171e73d177cfe0f6d7f57fc447e2fa Mon Sep 17 00:00:00 2001 From: Sam Ramon <15154970+samantharamon@users.noreply.github.com> Date: Sun, 7 Sep 2025 19:16:33 -0700 Subject: [PATCH 2/8] Minor fixes --- docs/develop/event-based-activation.md | 2 +- ...outlook-encryption-placeholder-message.png | Bin 19498 -> 57133 bytes docs/outlook/encryption-decryption.md | 12 ++++++------ docs/outlook/one-outlook.md | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/develop/event-based-activation.md b/docs/develop/event-based-activation.md index 81bd7381b..c67f7636e 100644 --- a/docs/develop/event-based-activation.md +++ b/docs/develop/event-based-activation.md @@ -72,7 +72,7 @@ Support for this feature in Outlook was introduced in [requirement set 1.10](/ja |`OnSensitivityLabelChanged`|sensitivityLabelChanged|On changing the sensitivity label while composing a message or appointment. To learn how to manage the sensitivity label of a mail item, see [Manage the sensitivity label of your message or appointment in compose mode](../outlook/sensitivity-label.md).

Event-specific data object: [SensitivityLabelChangedEventArgs](/javascript/api/outlook/office.sensitivitylabelchangedeventargs?view=outlook-js-preview&preserve-view=true)|[1.13](/javascript/api/requirement-sets/outlook/requirement-set-1.13/outlook-requirement-set-1.13)
  • Web browser4
  • Windows ([new](https://support.microsoft.com/office/656bb8d9-5a60-49b2-a98b-ba7822bc7627)4 and classic1)
  • New Mac UI2
| |`OnMessageReadWithCustomAttachment`|Not available|On opening a message that contains a specific attachment type in read mode.|[Preview](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview)5
  • Windows (classic1)
| |`OnMessageReadWithCustomHeader`|Not available|On opening a message that contains a specific internet header name in read mode.|[Preview](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview)5
  • Windows (classic1)
| -|`OnMessageDecrypt` (preview)|Not available|On matching the header of an encrypted message to the header key in an add-in's manifest. To learn more, see [Create an encryption Outlook add-in](../outlook/encryption-decryption.md)|[Preview](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview)
  • Windows (classic1)
| +|`OnMessageDecrypt` (preview)|Not available|On matching the header of an encrypted message to the header key in an add-in's manifest. To learn more, see [Create an encryption Outlook add-in](../outlook/encryption-decryption.md).|[Preview](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview)
  • Windows (classic1)
| > [!NOTE] > 1 Event-based add-ins in classic Outlook on Windows require a minimum of Windows 10 Version 1903 (Build 18362) or Windows Server 2019 Version 1903 to run. diff --git a/docs/images/outlook-encryption-placeholder-message.png b/docs/images/outlook-encryption-placeholder-message.png index 33ca5f748d42d67f9c84f9dde28cfb67901b8e0a..3a9d7ff8e44a4c6023864b53ccd89f544a4f1c1f 100644 GIT binary patch literal 57133 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 Z%yw>-Q2O7sEmGif`J(-Wnse6^{ujtgPR{@U literal 19498 zcmb5UWl&sQ5G^{u0D}*K;4-)dcORS}0YY#H?(QywJ0!Tfy95jF!9BRUYtV4>-9NYL z-gjTU_vdt&_KEC~ZIygA^`}A;ie)4p*b2Blp?QcB~ z0G!q3FMlLjU0Z#7ynVhse|x^ZyT5zfSpm4t|G7ANSYLd8e*Vn?Sfm61oaXkEVMp1q z2fN!hCwnI+CtF)vXXocjJ12kdP5|Bu^Yim?aBvTISC?0pOG`_i;uo*)u5Yi;pB`^g zQc~ZZPa-0s-d=C>a|>QCcSC}L6XFua$H#Bh2ePxWW;gc#UN61<*`Ar6YHDaYxVkYm zGK%`Kbu!=nV{m!s_xA9}u$6_y(ZkdB$>sIS^TqyZb>~EJaWPyDpsTBE>FBbys(N#v z($B|de{<#I$B%Wj_3PMVhZD694i0x0k530v_yG$y1BvC`Yh(3=eSQ5?$9JP^7f)+# zs;cU4?j9ck=EX!rpH5a+Zy%P0;ozcH_ZG)(yt8z*wNHNUR+N`JeQPZLb?|uH_oJk+ zdt&K)eLAE0cS%)y`{I#z-u%k1j`sHUmX?e|Ur^TEcSdhHdEC0$i_dM?NGoek@!!-%_|dT3lQLpr;SsP~ZwYJT?`_4}C*%TGGhj2<{4w zBvO)6^M+);Ld!4qdwzVPW|2VUP-oA16qE9AGb0q1$@F( zH-p4`OXH=%mFuSiAVa9NGN#Yx+HfC3l#WvNB77YpHDxvBTR~^j$8Ia(KX2XpyQ$gF^f5&YE5 zki_<$3w*pGjgaRj*vl#Ol4k*#vmY#5L;9X459d!!1iJIC%O5>-T*hD#L{?-+S3v5* zF{nqd+>tK5K0z@25n{g@E^Y6^Of9Bz2ZA=hhIA(On|VH%m|GFh1`;auZ1&BvF_cu> z2QYT=#N$a_J8dlu4>y=owa$3_QC$XoiQ>#?x>U*NiV~yxJrwn-T=64r=m42qqzm}H ze*dE@MHd&iK37l_H%@eP?_(>88OJwb9U$)A`=}g5i1J^@r=$R)J9ZFv@r;ZuMHff> z0J4CUv~62$won4`=cZ? z-Y3~W12zND$~PUai*57~7X+yPnB=ELhp zGQ9p{MmKi_Cx(nT{btOcz=&+wa!T>Zt)2Xx$Z^+K1dK)$)w^l6*Si50q@Ro_?#w`2 zd}5i|Vx%qKpJdp#@itFwTc*!}Rb`|^_}34&{Z7D~$8mF6{=6RE*QxHO_c))8mpaQu z{HBQtS9p&{cRzkIW>;j^kN%3c^Jm|^QbBqW*e|RpYX>*CDJl3@J#7`;r}qYjSo&wi zlMMeWv;D38Re0=ux<(xlF2@5BFC!7|wKR)Ki=nK{y>01jT}5$R4%skF1>J-?Wk`fA zUXuNtBIc1cK8v1Jl>DHhZdi0v_hO?Tle$qjeR(>&*Cy4vNp9dv17CyIq@Yxg4xncP zCB~2x2<6;+0!|Iq)f@OLLjNNTZ>MFtIjL6K>;_zVzf zrZvHZ$w!gA5#Ao-P)r&G`O=R`eib?y2riXo`!v(+)BDlf3td%=sYq^ z%9*t%LUek#?9T(1zeb9gJ^OS{E71PIMTiI!|K<*vX>fVG4&f93=^?`)d~KkTB^KRJ zri@@DEM4#&Zs0zkr{I|b+%ao=XHiE=XDtW`$RG6*3-kA^v_r${9`XJHkgOVPKmC~d z7qjxP-YZkjY|#yq*4$q-P>$f#JXiXr+2Hj>41@{hk2iNzv?(q5qsc*{lpSriJXdEq zOWQz8Ml5SCeG$JbwmK1y12(>nD(=UteV~!4jZ#DIB_=gf;c(9VuJAWk@c^XVVW*r% znctI(yg5v`=)_5w-Gqqsz}?QcV!;?N=_nc-9|DTWX?W5BCJ!eH^I1Dp2c zCh5=Y%X|q)uq&YlC9M!JGr}$RFW%eq0n{$~N!jdHi`m6ysLj=IDZ9{#;l7TZXr}*N z(Q2k$Yz<03HlJ8-v^k=&B%sLH`;17ErZLPW7tIwOY%GaUDm=|_VOpdlMkWWC&O`Kh zz{@RVc;F9=el+ojd>^G7UY#LK{H*D27$=TdNOhVb1463L3{2+^r<+Cz|Kp+eH$Xy# z72MQw;XV>5tHd8+FkDI7twm!m7&Ki9x8%^gG-~*fg$TrrD9RB37$<@}GaGcEd5zxc zpg@N|gU!8_)TeAYF`lGr3;8Ly%N!SQCSa?vhBAW(p8p6<2LW%Df`mSLG|@*W5GMyR zQ*dJhr^9kys%X*3qW%8u_v{YWEA5L`=b;HQq2J$Ed91g37lc*W$*}HB2l1@r&PIPm zLucTOIp6|>FTX&9a;pJ9D*tjp!K|$6@tk>P2z!uI>|`Wy#evCJ{Yt5VBr%Sqyzls* zbcOtwa=P5AYIudLAFnOVxd)7N1=8AAv{}K*h@|lB?V3sl;h+a}{3cx*a7`{4IDu2| zP|2W=65L$pHE}$HYO9T@ao$hAbel<}!4do~=g4)U_lE`Mj%8j2is#u+F6j6!4&H=x zqRDGCjVV|~Mi?38ChBul=tFWHT7LhK?I-8r0|LD1>x-^A?8Uzo2J7u5y|7epVTaQr zzG9+zi2L~)2(s2lIrNRg{mWzpb6C{Qck3a>2fbU)i>OPd%J-Y9Q1{Z$=+y5bhCQAp z76ZZRD6&h%h(FfK=Frdq1#b08Suh1e?I@W|ASNFaD>Y!;xJSlOAnx-fT%5hNJ*z#v z7VNc_F}GAy>{W~`dLvy}u#Mp-x7UTqC;N3%Ox&*>7(_)zrOIuB8Ga&JPxd~ovgB1j z4(&FNm(^3n=_=BP0oo2NA9?kwv(XeJ85PFe*|n;F$=3f$3Q~0x@wxIP0;hRG?>EuF zY~?u|hCYD7h~iI?QC|G`xGiGj(GE~0!&((KZOq!{3_CH8KcusGo=qc2# zG!=nQ|7ySBmQRv!nPF@@0r|UZ$OlFv(ed1QU~vm^%oyR+^3+geo_hSVyr^c?o{Tbl z(LWH6&r?Aj4?ABv!XdaqC}e++<#2DOo&xn)BU`*L6~F1VyA817YTOvRhtggYrTl$* zqCIPT`P2ddtuAv>Y;?XJXV{B6o-Mau=(pb!`ZeHptq7iVT>g4Jznc_!JG^(}9ZY`1 z!2f#M%uQa``Fg*nQR91gC_ky&<#+aUuyJ}Oyn(hvg|#kk`c@Rz*@CUD{g+M`cQ^D? zr`Kjh4VlN=tbNUnzG#i#tXt=+@7;vp z*R|_2UT;?6*bGD8$A|XC+5n*()_rMrUmf^{s$lWSuLqW%)zRwlK zZqdna*lC=%v^yt}a71*r4Tk08+vRBJGi`&yd4`a41vD0K^!xO8s+X0_SZQJ> zb_pWYZP5^UHl7l?k`rwPqhmHqQR6{Wx7;j&k5bZEJSc&PsJ)d*yP}g_=UEOi;FjmU z3$n+{=Z^G}*w{vhgm(zy?!(Bmw*QR4R&9(B0eW#zPacePn5arTRwDr9E?fV{QzR$YjFf>NiHJ}6 zh%XjCn4{-8f&$R3@U$jCG6^C)E(>HQX;Y^}w6N)OMA!Zr5+qF+Yj|?9zz@W6TYA5n z9oO}?6-M4^_fm?u#H&u#XxwyO?I?28%Ok$D)m>)`FIaifS;QWE@1!&0*bLO7?)qW$zW5-mFgZo__oMTw6rznNjjt)*@+$yXV$6pnSt0Y=d7t|*kSJFqjuS8*-cgHcO>P!x}G}=LRCctoeb2D zRzn;v&^G+vUgLCNkf67?Ma=xDqba$%9a9IYbX`})uW`rh2Td`x zmd3p)8ICnZ;Z3xqQE$rxl*T^v00{!$-2g4p<6|)>Sp%KM7%K?0`>|1HOo1egXd|>@ zpkLhhUJE86xvyeN(8;OEtQh|ih{Gb4#V{f?ws)`2FG+(*t03k#wn?}0^cEk1WF}D9 zQD3aQ`maj}T7QKz^wbc2q+5`LpcF310~{@HZk1~g^fwuTN9?74v6TsCtp>{J#Us=l zj0@=;{K@~3udA2H)T4CM8sG#+$?Rg8Yp4=x0hQ3*?)F8|W&0qDoKscDf++o7oK}(B*U2^WT$?@%Ei%OyTmp z1?9MhhKMOBy~Q;6gOxzqywKcFLm70R=25>d9KbI1fuyt^lgRwWR_Wl0M?U0X%u{W! zeCl~>gO;n692=dVoUAFs&bGX%(c0RCJ-)Y0diz)lB6R zWEiM>C+QXS^jRVqE`K1NWe7~tD5suPl)JARPhGUug5a5W$IgcSOZk;K{8nL)sI$M8 zgUJ9HcUSe?<9PPS_xL?Um{0PIfXUxBIlwqIOrc3TMEGbyG|inI^oz{$wFMKqSRnY_qeq2{uX<=sE*9O_jr#H0Xf0~-o}Z$0J#R}fC zORE;9gf?ifEAcT>+m91>SAe)Me#1@#43145Soi>}kDvOJ7-xjk4K~{Jd*HT{T~7_@ zdePD=UTdU`Q$9cro_lTfX3$h|BH8oR5KnJ#aq!4gV z>c6w4@aTlMtxegU+#VMR6X0&1&FkihScm1k&ekKbBY~-i_~;5nGS(ePM>~$`FkE$` z&>%D>fe-gI&}gPd-3Vq2kK(I8`La1cvUhlpUj`9i)RVknNsJJ=kW$&b&%=3dsbIPL zq>||V+&Qs)4t?qXv8x$`lhkB^IeIFXA6OCdZbV+P-UoA>1rvsnPOtXZXxhbAbQYn3 z*ozVgA};+bmWwB5d7)bKZ3jB|73TV)Y-d)gsE8=0l!*Ea3MMB*Nz$pfGCJ5Kilg0W zY*8vSfIL!pr`$5c_wy=tn%`iAX@G9UP#5-%9%D)Neq6QVN+hG320oU{T1);&H4Q^} z#x@=cNmoa0;dMB~M{kPJd8?-2jlopcP2Oo?+0jp@Yk3%bVqi%XQvMN)mOug`#85<} zP({=9nc*nl9up|CZ$y&9@s%9sQ0NwOyb4I)A^j<$9D|X)ml5uqk|6_C~9o z&c^2;!(YJd4;0*AP=Fubfj~eYJba)S1PlWHUku6Ve2-(XuK>7z2AO`sd_7CmjaG794LUWssq7K_xSS>ZMk`Ca<=4qM zyaKeBlBk8+uRYHSRBF~0M56guACdhwv4u4;3-x8Zf9(FF_Yn1ekPQBM zKVdLn2|@2pptd_Lwj3=Cb;D7`qYgu5G(F0j$`*P8M1K3sN&^zc{Yhs|5w*7%TDBIFzggsQj_~kFRgXzqDyG(@b0E!R|Ba4peS-e0hz}~w;S*WH}0)0}X-u&<*C?s=+a+k zcFh(2du)?lF=vh;(r*spvsk76AVJ2P#U5jL2VbBe7}RUM#!~a^iy58tNs_b2qK8)R zXXS?Sl2g%}g0C3Mr#U75Z$@ne{!U8ty-?Luh)n|{0rz`jVzUYvy+EXcq{#e#jGfca zRFA{r%+2RS^GybBcAm&f{^b1h5Cc-+GJ%fEHDRdnUugZ`4_NgLP_i#Xg#>GWlLtQZ zFsM1CA#m&36W2eL8#y+uG|vKVBo+OEFI)0U*ttOGGLG-DhnW-2^lT?Q{-Y~LH7A^__4 zTt}q5K(dGnD+oM^n+z?p6!>&iNKTtzR}D)*lOo1&nZ-4eK@bkqnR8d1C3mmv=UTMK z7L-#oq^P{$oYb`-psL)Uj*$!xrIv(aCgT$jX&BplC*3mcRv(&h!aCDrCmwEQ_WNfw)PkmbOub1_VsIv0GzbgWTSjIVv z7@vOwUG`-_bxoyJOiO)c=3cru@7|_c4HsYN)?eOf2a>S1 z*?V#u;xI|ZOB5ME8$*`1wSGK*hMK&!WQ#u7 ztGBLPi=4%~_|$t8ea_Q1ZuTkez*r-eDE)l=;^d>6pOXs8N6q*t@~kdr$tt)Yiug$e zovqs{mgf?-+*z!Yz|x2yXGFYcky6iM?;h$GaO3k)iCEBw1r^?qOu8+u-^}JNqE%oh zW|9%&)~`@XR{C3KXzs2H6^_ZfUnfpMBVQ#R&xqTwg@tF|%lxtFj;{0|?2#T#(oniF zF`)TjJ2rH5{UstT_=dO42w`@U8ow~l8@x97+{9bU1L)P!Ls6Pw9w7AkYm1bGbZ`O7 zD8_)E-GYYLNQbF5fk3;X~5W8A)I!<>yr-oHjJdW zkYSCS(C9m~O|^!(mVJ`DyME0cKkIYmUIj3cA#_5N4?Jg6+Y0$3n0)*p2w5}UgS$`9 z7QA~n_Kg$`Xm~YhrYTrD(=ZkGP=F%)WeC<-2eI#EnDA7KEhyRjut4#-5>mPniHK6y z)c_l7L|!$y@lbzKitpxlDY;C0w%jSS8>rBsIN0c#CdnL)2N6-05 zW{f9w5N%h}Y9M5I{h(OdvV-~j&xF8FRH?9`4ttjr)E!9=HoG3|cH*w?L)j18gazl-$55q=J&8$p%d;FaFS*fL8Dei2X*wDHVdXU;Ut zvCaMAz}{76xDM*AzYQ^~X97(n_5bXb3L?77=lMpRZFVyutv5{xmbD2_(=BJ z)TStuPa*Oh@Crsr{8h!~sGYvQ)-w%1JWms;<#?5WpwuDa2d`GhrqNVlp?TS9w`Jyt zARrmKa!A6{wN47&OVN`X5@ZLP{7oO_ylh#?eBlp&!5$1MB7g$a@Wz;e>A1cCPpPYy zLVt?Y9t5@ui6o~RxenAwapIgjA(xL;s z-N@KYzaLN(4h^d5A|Uf!(n$FFNfOe<7b^yVfkBdB_$_2G6cjA{|KpOg)SjIx{fl0t z_+~^|`0O;AJ<}mDw6QR{p-GSN1ANgv`QWmV>P!IqisrY4-;`>}^caeVCNYCV3Mo^C zXFNwdD`=MXG01XQieBRHa9B*%8tCfDgdRK70^ey|eNy8}OUbhTmGQ^#!gr%{d3CUxSG{_qk{e}`! z`$`T@Hwy2P0FQv*VDX_}rxUv7XTK67NCxJ15#<<}fL)T~uKh1+QXwyc2lhUfk4&Gl z!w|MV*|+dk$#m)5{b>HV6^77d>#jde|FEQYj&&dFnT~623X69%zN4J@`gcntMMi4h zJ?B`M{9$;0T5k-XMHcJS)!(r0y_ZyjJVn#rF3Ckq39(&`2YYPzb@j$G(T1N@*<(f7 zSEUmRS^+~2b>^ugsi;%nFv!I)czs5QmS5^d7sBP6Xb6LzR=+Jg6cbFtUO{DslnIF?|HsQY+mM{Omf+FX{?W?NB5?ZU(CHP03>B`U`}j`<;hMVz2Fj7rZN| zr>{(7<0LtTr3r%eZLxGq5rU|FXdkAmH9fhO=AlF4VHw5EBC9KgJzGXTD_ko_wYR}| z_TN$}>8i@)@Wx6FtcD=t`m?V_HX$?`(%_`0Gy~fdj!LfWzCLZ3vNNzPRx}X8^|H!F zskVI5=jEbDcPxo9PH6K!0b=m7TC2{rD>-^_%P64Bc&KJjwgVn_3|2?{$M%bu-DN1xj%!UO(&0eH%D<6Wo(GEG;%LF;ARENTr}-ti~mST z8M#+veVY)8x?`bD6_oca6T#Llp>~MHG$+9kx4+q2u4pc98}4RW0rz5)awo6*37$03 zlH!Coa%84~&J1Bw>4n|-V$%cu|4>7Hr7jk#u%rm&ohff0p`!2)x85bQkJnIAAwqxy zZnsJyhGYr$FJ98v?UvQn>iaG4`S$3leGA2g=nohPWlfoV6yY|KaLT{sDp`whn9;o| zG{1v-o3RFMo7ZIp-&NL!>T*Ld<4(_J6|EVHSqGl<-x32ocxKD#aAxT?1&^B+kmaJ?|S-^ z@#RFsE~}f93D-&7@Az=sV+0@Cl3{eCZnydAlIT^?>5oaCCCp*dhSw#|b2@*~==OI% z>xmjEKx7z#W9pWr4MtMEm_*2}VV`W40^oT#GgpaGM|bl?2Ybs$k|W8ys++d0Xr#gJ z9QMaM4LYXG<ZD_6&bOobhatbn5l*Hqu&J~QXMQMm-BhS5@E4CX2lpfb(*t9;1Ah}x;X)t|+B?v42%;hz$XjxC>^I_l@8%kxKd?nGA~P<)E&mDpX#K+@x1@L}HFJp}R}zARKJ2Eum6hc#J<87`EgH8(xl zhd98L%4rvro`)h6*p=f4v}~N+oi0T_B}3`$vl)>wF}nf0;d~><4m8B@Rj$9lm#nf^ zCFnz1ykCFCeg;o|XKbP0ZfO$>TnKqC(IU2%M$UCkq~U!eh%>DvJD{rR66rUDWe%1l z-4@r6v^l~0=f&bv418G(R>g(#{6*65d^p``go@GrDCmeA~IHUp_95{sJh` zZ7%L7q)xtH+hncLz!6~2;?(Gd8`5V%ULcb0g*#ca^#xQ zkHEpN)$e#41%cR6q|iDvyP5Q8JqSp_OFV9z8e7uA7^W=QP6=RUCf-D_jwHr!A)Z*_ zfO;j*T#+@U*UJJ4-`>M~5Hc_>`+r?f#p^T%Ak4cybkq+KRt6 zb>O-&hvdC01>`50!8r}mVlQN^c7=C4r`pt^ag%c`FT@gav zOkt~Oay0Z!%VNXk;9yxHP;}3Jmn_&?$-wd_o9dQ=>m8rqgct~4WFm7y^jXglKrf-K z`rVK~{wIu$YiQah45IhTU9vhIBFF(Hi@TM;5WEsWK+POZqHf>jC~Urk z!fD*=2W$?6GKwYxg_rMCq8y2kn&=3C`vBIupo?n+qQ8BW*+`B^1|vJ%CBCTEJaag)=J zXN1@%Y#_wI6VJy4)>0|=f)@pO*!dI1d5veyAZ&e&CfwuXsxOqCn9Y3Ykf8Y$`<8~^ zwNOqeSRC1oFta{M0;4AgMLg^?o2QQIymp(HMhvGb;^zy*KMY=^CC{9(a(q>dVQrwQal9XIRGB9TqA4#7OVX31xNa6_<5Kvy)^j2}slt){Q zcN_oY=I(BqF-Se4g5tO2k`n%a^RfoifZD!DI^&C3CKSaZSFviGdn`-yJ$G(A&b7%NF$?) zgWcl+I?SKkrW#+~#3);dM#^3_0C(Qa{zeQzHdMGn7g`TRPdlIrTFdqm$Hk&%FOZm_ zXY{UQq6ASUtaeLr0OiCHoc^BtJHW7Kq!PFgyny$lIIW20%CcW6TWXbF5SB{}iqz|6 zwh_l$<8Tv$rR!xlKtFOFsTqV;2hfO6)jkcy_e5~&jw{r+MOpYD<-fd?nwf>6$gt7yoTew(2uBc_M^C_T4a%Y{eP-2|+Q!NUXtYsD zhsJ51e}o`c@w{!fD_eq%j1&igU>|ov| zv3Pi80cDlZ5XmZ%01~ZSfehORKmed`2q5?X2><`H%Pa#9uKS5479SD-sTdGJB)oeT_=b-FV}=K6 zeYmF^&hoae<~9p82%QZW2ovs!-dX~|UQj^w+NbjI)57k%KlIqqq{flHVPBn`jOTTh zkgGU58wYm?kVE4|0Z{cQL|AU3pgnVC9C-xr-oic7!N~pOwu)wfHkED`tw_bJlXh(x z&)A*uxJ=yxkDU%}>Fk9J2nR(SfrnNmy7PLl{yr}uoDpgas;g-lDFIWw3&s1^r!3=D zI_hPC0xfm=+2a+-m1?9i#DQfL8GY;0mbre-V-nIvC8B9aPXz`786d5&T)~{Ku?HW* zap&v>BkE4>nA5twhs5&g*P*M1vW>Z(fm8?dk6ffoCnSYal=iFsM2W!=fdbAmI%ZG?EILp@*1OA>+&pt$8{ea&&R4Q!pPM^^#Aw@%h{@AXT)44Yg6j{}d z!{VVl8*XFbq!aP_aLAd)ZogKI?pqav)4u(r&3|ZV&J2VFKtia##xv>0A8hEG!%RlP z*Be=HLm+Jw43YIbO3~Gd81q70CP$R7KWnBxSF;lg=KHm5J=D1!dVP&eR})x)tbg~) za)K_nwQ#;~F1gg2!A1*$KxDTxA;Y_)yYpwrT_D(ZO%;KKILvoI-x4|o9g(EiJ4Z%Y z!Tgz{ateX)QVn)zSn=Esg6oI2AoH+T_7h0?D)Cnwj3NJJQJybrX6h}>=?=k(kO zx)1rve{7Uo1yyL^-d2*etwSXo;e-n590yBlR6;#Eh%TkVs-op4*>Ws{teDF})rq|B z(+w@&^Rg?Y74rw{F@p;O67f*4uX@7Pz5)%i>%I)|4ZGD@8Ao|K+8$m;U2(9kx~4a= zM~wR5M=kQ+*7C0mprZQ;_9rOL7cWCZ_S!Yyr$`C;Het1ELS*5zAj9XGe?%22+GwPi zgn!jCCz`rMT{eb$xfQvJ7-7#i$KR^&2WrySvjPKsdj}}1`uIU0RY@mAiceh=o>w=x z(e>A+7r*7@mU@;0;G(m z(*y&Zvfsoy?R|4R&Mz3ift88;KXN9E{hBGjfz0pu_kV0?FE{@ef1hSNQIlLO0<6~- zLM3b{Vh{c2&Z)?LPW$goyad}2F<`wu*Y}|>VPebSZtMRIsW9OKVPd%uFg*x}`oFsl z31aXpM}=bNfBe$^Qjw zFu|H;-S);uL+ zwq531)GV}Wgj0M%wFG|G?m#^pN!i+-!Bno9NfK z+a6KrnM63JWC3hQssG*ae8t)G2d?iUdPJVz;9zWnAZ_r_G+q&g2?+}}*}kO~byvC7$du{7Vyfgb zoT|43oTXi!Z8>Qo0*vtjlvYwDP#XPS&$FUS=Ur568R%DPCCjE&0Hd+EdeF6?)D$t& z?s^H{mq4&}X+*4;`X5d#GS!C#&9X<%&j&qSMNrJ-yDxT}+%6%yD95=)N3Mq4v>(6T zFGq04A9<*O!>2|82`S)~3WketRRW1-M9vc`76fW;G6#i&qJL~&kiZ9c;JHZMcc;>> z`N%V2s*r@mWeI1(bLnsi{5(k^28z5^kNOl@NSRcZtxmf6b9D&+xhfURd;()S*jt?` zJ)vnA7vbjddv~Rj5j;dZR(|2?`JlCh(3Iv$XKf#9gl*_)t%|e(S`9-q-pq%i%XJO&m(dK*vVFLUQd37D~97| z)G@@+itCtLxT2zNQ2wiIeRSGv8IoB~+(C+;P*PB0?sg%89An{SeRC_m-9scf?<*;w zzMVB}0$|4A*&cx{klu16X*+5m=+os-RVLwrGl{Y2#jvb*xyKDa|H%r=;&DcDYS{@~ z^R;;o?_3{uz$)Zy6wb)PWdbtc9*)_aBO;AG`gv;)*Yhw<%6oK|nI3<;oMBbFHS4q~ zfIz*9ZkS~p4q)#a^=*5S&jwQQG?pgI%@hRq5F{Izwlj7{7c$9udZC4%26mlHWh{@u ze-+xbGeXP5&n8QYO3CN^c{`4zpn_tyX)VLv;)xsoaVoSM(?c^rn5{Iqi5lA-S&XqW zLz84S?dU5Y-yhLr{bEj{{qf$_mbHp20sfi1w2>@4m$KD_K-D7G5 zhf(2uMUjDS_*5IvUl>cAGL;IVoLQLhXKv4(t%!R8jo-N~rCG2~wW+b+CW>!8kpmjP zWOf+o1>awOPlZ>_OA55U%j@23oWfhcD-Mtyb=B$cvv|kqw+4Ia&EYpai&Z2`ug#{J zDIyu`_V>dmUPiDouBi%da}FiYc`zlIT}HBWfA{5tW>W{lpcuJPRt5>^!;RRF&^I-0 zcCX4sXNfU0XOq`_#344JPy%0AhbuO%se&7*EY?ylEr#Y*UFgOF%s*5&t-RLN%b_In zyT!E*sepx0z`xy&g_Efi9jHD9YZJ&5aHoXyq09@4tCQ-I;7BP8RGCu?4=_ro9sPO| zYEC11f_H2=UJ~*;T82l@FVRt7lJ(u1v!R)KB2)4AMJ>@368fFX_%oDQN~ImlcAJ2{ zWP`vjn1vcIH+gpFWr($_Dkhf7_@?wvE)Fa^GEEM=u6PjyDGon<^>!dON4OD9Pv!}; z>}-}>V@fDAlC+LDsp5>_?U+>v>8$I}!jF@#|`y0+S?v~Zo+uf;v3doi8W&F{b94R0_8{S72Zxhfem zO?`^n`MuUO?kpwqSyL@T4_hVTiPpE*=;__^{crUV&EXj-mbUWB< zzqYh_-RTf(nEZ%SY<9A0rpA`($|^1T;FZKX+jHZperY4`4MQvwa=pS5aq|aT%Fh$S zNb_3b?*YO=&gY<6|45--`|$0*)jz)ky>_JGT;jj^oqmM_8K(E)&%0h{#L>)GnvJaF zpg+>kjeTRA&JG1hG+JFvR^Dje-F=D?A;?}vhKeJ2v89g$QCW!yQ4$U4RBejX#~kl} zLX>S|s2P9mt?iUpClgH472Dka$Tqn9yp)m9Ky(AmL@gJ~)|BeG^|Ujv0?!}S#D}S; zC(;5w|H)TloNq56wP~xnrjTmR#?uBu}1>Fb8kb};cIdWT^&JDzV|J^1ZH zS`ZB0yX?5vz0pswM(TBTq<0=K3`-k&o#h{E^1B@v{B^>NWY%)5($NXU_N-?`k5%BinGKc<+b`*$_@muE*O z3bstD1B*s{kHhd8Diqy{z)>NL-vXP9g%>VN8$cdMYQ?~cZ&$M zAp*%Vcs7b{PYhKZ%n}o;-=4>Qr|@Ohe_SAG>b+>J(m zXi%)gm*Bs@l`CP+hUVSZPPA)ct z&aNk~eFtjjY@97d#aTPem-hn~cpLhu*0Wd7nZmdkeHSB!?0(@Ud3B0{^jhyM zIcfV_Ue=dTJ_@36iV>7Ja5Ro%RZ3cy72oW1mrrCciWmFPpCu1)s8TMSEaLpaVHAsaqQh3U z>ps;O?Sn0;=d@$_nzowHJ7;zs3{^#;PV4pKlpk4a31pi@>xba3-27{+ZbAw_kNp$a zbM^(#^*c10y?<9gn|i>i&X@E_R&cS8%KK;iFvUe>|2yxiX}qw#+4jfoW%<;D*OB6f zCZ|_LpXTND?*r@l`Cfu3rQTI+3*(F45f3SG6v#(PJ{vao?q?6BHVm^*k2aa6+}?>7 z^p+hgu~9BTZjr)8)4T|430+hn0;&UJNOc)ut4WS^Dqge%PKqfZ-}99j^Rtg+H&wW$ zxtt$v&Z?PXHA)ZNO!4_t>(j61(rvmwnkHHkj961?vFBw{p|^5<XCRD&iOkuSK6zHpoTwd0v(omF-_5*ErW%%-cd11l?Wi2Hn5#Q1 zAfM}N^%0$_ff{sg4S?gjD;}1JjtndRxw9Cz%wZ&b*BZa24BXiTMfUq++U|~YpWiaE z2D4c$Glwzh9jtoCWZybyd5-DUt#xi1EG_CF3$4Vq<%2Qg+gsdG75tZ^{f-Q3Ud8 zs?dyoE69H=WP$wCch&3q5Vic0_3O}O7(f2mB5>H5v?>SPO>nmrQ9&?Boan$@LO$~ zXH2k`3MSLefu)|3PDw8xa`$Qvk%6NJ4~w|v{?>#*$fRJ!9f-4cA;1kT-u;Ww9&f?+ zVu7K(>g&|}QoFW3o_EgN6K`OH?_R<}j!Dyc3UY$I`%t@6qT%P)4Bp<(nKR#WKUb=X zXN@uqZ`O*HttD@x-XqoDK_TH%MOnK9bz-COE*hw4G;JWszXK{x5f!?_N>x>v=1$nI z4l;{bt+rVtzOsf1_M*;KT%-xsf;ah{Zk9q(>WQH$F7dvPxZv-)YJ8rvNo$P$E^3v8C1i9ZAA|EYt9VZI z^_(cT%20D%BB|k!Dw^tshvHTO)SnYe5q9~As-0pS7Z@gzBniv!#5)`pKa|ar0ME1&d^;$|JLnCMfGH^7a5cB!=iG zE+s>2#ZjP|B?`hKT`O0v4Q@))%noMusGNbPig5>VfMgp!D|$MVR%ZUatNk_Q(y3zf z1NGuk-^}sa+`zgWlO~ifxo9ZDzEivAbe^e0u9#Qrs9z>d&|7o)@BZx>jT~W#p^#kL zRBf8TRXi3b>TKdOJ661EZG$M~Sb?kte}AO!GNwf{YK!{wPikWa7 z==~w#K42(;lKHq*5qZI1l-Z@IdwQ9w@EwdVAKhu~0c>6sA&%H)!3vP&VO%-WMO~ba za9iphwLV-t1{y>o0F9363)g>kvb?8a6njxfmF^MR7P$Kb$W|@QSLUk+uv99u8*H{s z=19-0BrByPdjL4>q_4)%DYz{LlaO*+&@7|&Gb+owB{s)adwqLJx7w(3XauEZ7Zo_r zyyyrEX9Qz2mQvq~cA^wM4PCW45P!Puyw&3UJ^FmbO0+@ZU+1>eo=~9KHOxXWH^eUN zCxj9_Ut{keBq~D2-T7!UfS{8?$4{3{?b~hsgM({ugl$1PB3W0ybn>%+f1pI8A#H{< z^xEy=+uF6-1DcMw4goF-^KWwQ7&I^41ICD`9xo{^d9Azf^i35sD5NSbFm(;BJ@(2m z*AQO`z7Er$LpbHT9lW{YdUmpfd2>iFBr069I)gs-gds|FfUtuac_28($X}d0Ge#$~ z(x3<;!`O~*JBt;Do^@ykXBJMJ=&}eNBZa)u(l>-M(BeMCuo@JEpk}h} ziF@jO7WJLvF1RtFe_``PUzhsE_lW2!GNN!1R&DnFqZ-cwVOBE&witq6p0Ruw*Jn8W z-=E^YVzHEkZKny-pM-x1{Qm0N9!`zn9ff;sHvy^pIe9?Ye{oX?+!$&kX1N=k5T zKTU4Zq^tjDX3NLZILc#G;#n`I$=N8OSeCv*8YaT*iWd-)i8-5pFuTJx-O0_-o)w3IOqw^wu8ZP1T8=KewkU&6={Kkqah}lN` zE=O!0MXU^Kj31s5ITKs=<`FIC<<6J4yzmSoFb1{*!mBGFMWGeaz7<|A|U2#&<)5cFr-KQiYLQ0$%?Nh$zObl5YC6rw1Omgm}tXg)9SsZ^9} zv~jiqQAL)3z???$GjC|8_AnttJ99~9gL5_rH*>0*8Y0<3koug7%wm~)00WY9%alhJ zUp)Emd|8ndr|<0l5sHXLA(MNcag^+X93hSB0~FHT2fXO1T-3wlHysU=q zW^yn7>hFIG5XKSy=Uys0g26EP1Ch|i;dqGXgUmVJ;`{epIB3LwlKv0BT>pPd{~ADO zsqv2yA>@w+LjJZDNB)%d;;T^qOh{i61v2j0w+&!Y>vQO<0+Dx`UrZKEy10YqJ9a0Ig3}R3FOe; z0drdU)d+yY`GH(-fGy8c0|Bi0uwMry001xy1O2<+f0QV=^AKoFESP){5C{ka9)Um* z2n2yZ5C{Z;KoAH7fj|%l1c5*h2n2yZ5C{Z;KoAH7fj|(*v0sO}Z9`EQ$MunObg985 z7e)33j;)0%Dh-4c4;`bA_%F*s93g=SafAdS#1ZWbgj^C;uhS#!uu7sPD2;|E6F(_htcpNPk|wHp zN!lT7xGYOl6QWeTOr}vs)hL`4tyM)JolFy|M=n(;aHLQ_;^Alj;eKx}RAFK^R}6dI#b4S=E;jnS$6hO}1&fy5c19%d5= zWicAV+dxu_#;^p^Vl5BEqVYg_kU+#v>jQC+K*awefrKOw5s*Ma5{L*$AR!4v1nLWf zmW+RNJdp7cSdLMx69T!sM5QEKJ0}G4_35TOsSVEHzNN2=5=gt%6NvBQmqFS0(P%Wibtt**UZCViAmi1a z`Fy<^Bjj>FkY5n?^&aju%4m9L?d+Pdb3!0DPhlap?rnXRO*b6op~_MHj6a?xHC~8ho$_2w^0l!KxrgP%y4BGI%K(WVEU3)WseH zRq3E5bPDtZvUTYT_yIb4>L!n}_f*^aY3yqh48j^Dmn^Wn?$W)C3<1l?X* zSEAP?^~}_@91c;CKI^ej9*YfOG@3=aGRsmcYX#XGb|J{wr;Ful!TJ08RDvsbl*q%% zVn@?>p2TBjP-P}#8VEt;YQ{071P#{;BF<3Di}!Vggo1E!K11oaWtg~W8R6ZkjhTw2JPhlU#jxisYC+K|-} z4SF05XO)X?Pz6CiQ|?t7(4k&8$~mk|UYr;ZXjY!brF(lpo_u}!v&!QwKOk4rey77j zS^yYOUm-`tFMFNb&kQHxsvqU)iN)sR0|mK&9Jhk(4Z9IU7;=U+=k=gLtU(GYFrr>K zOv0nJAl)eF3PFw{Yf&0#xJeLU2or{g1e#JD(llgee zfVGo}?9&|tdGY2kYJT^lS%V}rS=VPMWQqjSv1cFTUNoq;^o&j{1Q`lJLO^TRAp66P z1i{(z9oD?7XF?4g8MOzM(kGLF=`d(2=3D0FW!^~@k2xA{6a=rA5?hMUr=PD1GGlPb z;!f$-&v>2Cm$*e8E(GaDaW#iP%WRcdcMwE+{sNaAKi#TU2%@edMl$3y=R%O0QI$<3 zE6ZG%q#>lAg1BUI$#2&n`@_zAvDDRTG?-)nF3k=dnp%Meql|-bl`0rrPCaOj4Y%yY zI{mg0FyryGFkrj~57NWTBjG}Q)?GJ@}!_EbfUcWc@Ou-iSZ+ACKtqGQxrNeO}ZM%ER77s0mcBRYD&8B^9bALfbQ@IIdW~PptX$5K7 z;-Ljm^{e;#8F%G+d^4>eE!(vJDBPkIq-Bf!5JdU+f*7qJEj54X&Wa4X zptvSO1HmH3AOX>2$lU*Sn@uLjs&0dL-vxfd z6Buv^BxXp#%a(fFefAP|5+ y00IFF1OgZc1TYW?U?32{Kp=pDKmY@Q0Fl1K1W{sSH=UaR0000 [!TIP] > -> - The encryption and decryption workflows implements the event-based activation feature. If you aren't familiar with event-based activation in Outlook add-ins, we recommend that you first familiarize yourself with the feature and its implementation. To learn more, see [Activate add-ins with events](../develop/event-based-activation.md). +> - The encryption and decryption workflows implement the event-based activation feature. If you aren't familiar with event-based activation in Outlook add-ins, we recommend that you first learn about the feature and its implementation. To learn more, see [Activate add-ins with events](../develop/event-based-activation.md). > - The minimum requirement set and supported platforms may vary for each API recommended in this section. We recommend verifying any requirements against [Outlook JavaScript API requirement sets](/javascript/api/requirement-sets/outlook/outlook-api-requirement-sets#outlook-client-support) and supplementing it with documentation for the specific API. -The following table provides an overview of the encryption and decryption workflows of an Outlook add-in. It also identifies whether a step requires your custom solution or is supported by the Office JavaScript (Office.js) API library. +The following table provides an overview of the encryption and decryption workflows of an Outlook add-in. It also identifies whether a step requires a custom solution or is supported by the Office JavaScript (Office.js) API library. | Step | Implementation | | ---- | -------------- | | User composes a message and uses your add-in to apply encryption rules | You must implement your own encryption protocol so that the add-in can secure the contents of the message and its attachments. | | User sends the message | Implement a handler for the [OnMessageSend](onmessagesend-onappointmentsend-events.md) event so that your add-in can automatically run your encryption protocol when the user selects **Send**.

To identify a message that was encrypted using your add-in during the decryption process, use the [internet headers APIs](/javascript/api/outlook/office.internetheaders) to add a header to a message. The header key must match the value specified in the `HeaderName` attribute of the [\](/javascript/api/manifest/launchevent?view=outlook-js-preview&preserve-view=true) element for the [OnMessageDecrypt](../develop/event-based-activation.md#outlook-events) event in the add-in's manifest. For more information, see [Implement decryption using event-based activation](#implement-decryption-using-event-based-activation). | -| Recipient receives the encrypted message and opens it | If the recipient has the same add-in that was used to encrypt the message installed in Outlook, the add-in checks whether the header key included in the message matches the value specified for the `OnMessageDecrypt` event in the manifest. This operation is automatically done by an add-in that handles the `OnMessageDecrypt` event, so that you don't have to manually implement the check. If the headers match, the `OnMessageDecrypt` event occurs and its handler runs. For more information, see [Implement decryption in your add-in](#implement-decryption-in-your-add-in). | +| Recipient receives the encrypted message and opens it | If the recipient has the same add-in that was used to encrypt the message installed in Outlook, the add-in checks whether the header key included in the message matches the value specified for the `OnMessageDecrypt` event in the manifest. This operation is automatically done by an add-in that handles the `OnMessageDecrypt` event, so that you don't have to manually implement the check. If the headers match, the `OnMessageDecrypt` event occurs and its handler runs. For more information, see [Implement decryption using event-based activation](#implement-decryption-using-event-based-activation). | | Add-in decrypts the message | You must implement your own decryption protocol in the `OnMessageDecrypt` event handler. While your add-in decrypts the message and its attachments, a notification is shown to the user to alert them that their message is being processed by the add-in. This notification is automatically shown by an add-in that handles the `OnMessageDecrypt` event, so that you don't have to manually create one. | -| Recipient views the decrypted message and its attachments, if any | Once the decryption operation is complete, a notification is automatically shown to the user to alert them that the add-in has finished processing the message. In your `OnMessageDecrypt` handler, call the [event.completed](/javascript/api/outlook/office.mailboxevent?view=outlook-js-preview&preserve-view=true#outlook-office-mailboxevent-completed-member(1)) and pass it a [MessageDecryptEventCompletedOptions](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true) object. With the `MessageDecryptEventCompletedOptions` object, you can specify whether to display the decrypted content to the recipient. For more information, see [Implement event handling](#implement-event-handling). | +| Recipient views the decrypted message and its attachments, if any | Once the decryption operation is complete, a notification is automatically shown to the user to alert them that the add-in has finished processing the message. In your `OnMessageDecrypt` handler, call the [event.completed](/javascript/api/outlook/office.mailboxevent?view=outlook-js-preview&preserve-view=true#outlook-office-mailboxevent-completed-member(1)) method and pass it a [MessageDecryptEventCompletedOptions](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true) object. With the `MessageDecryptEventCompletedOptions` object, you can specify whether to display the decrypted content to the recipient. For more information, see [Implement event handling](#implement-event-handling). | ## Implement decryption using event-based activation -While you must implement your own encryption and decryption protocol in your add-in, configure your add-in to handle the `OnMessageDecrypt` event to conveniently determine when your add-in can decrypt a message and display the decrypted contents. To implement the `OnMessageDecrypt` event, you must: +While you must implement your own encryption and decryption protocols, configure your add-in to handle the `OnMessageDecrypt` event to conveniently determine when your add-in can decrypt a message and display the decrypted contents. To implement the `OnMessageDecrypt` event, you must: 1. [Configure the add-in's manifest](#configure-the-manifest). 1. [Implement event handling](#implement-event-handling). @@ -68,7 +68,7 @@ Classic Outlook on Windows includes a local copy of the production and beta vers To activate your add-in on the `OnMessageDecrypt` event, you must configure the [\](/javascript/api/manifest/versionoverrides-1-1-mail) node of your add-in's **manifest.xml** file as follows. - To run an event-based add-in in classic Outlook on Windows, you must specify the JavaScript file that contains the event handler in the [\](/javascript/api/manifest/override) child element of the [\](/javascript/api/manifest/runtime) element. -- Specify the `OnMessageDecrypt` event in the `Type` attribute of a [\](/javascript/api/manifest/launchevent?view=outlook-js-preview&preserve-view=true) element. You must assign the function name of the event handler to the `FunctionName` attribute of the element. To facilitate checking whether the add-in encrypted a message, a header key must be specified in the `HeaderName` attribute. The same header is added to a message when an add-in encrypts it. +- Specify the `OnMessageDecrypt` event in the `Type` attribute of a [\](/javascript/api/manifest/launchevent?view=outlook-js-preview&preserve-view=true) element. You must assign the function name of the event handler to the `FunctionName` attribute of the element. To facilitate checking whether the add-in encrypted a message, a header key must be specified in the `HeaderName` attribute. The same header is added to a message that's encrypted by the add-in. The following is an example of a `` node that implements the `OnMessageDecrypt` event. diff --git a/docs/outlook/one-outlook.md b/docs/outlook/one-outlook.md index 9c00eb1c0..7347195b6 100644 --- a/docs/outlook/one-outlook.md +++ b/docs/outlook/one-outlook.md @@ -45,7 +45,7 @@ The following table identifies key Outlook scenarios and their support status in |Mail item transformation|Enable users to transform mail items into other formats.|Supported.|

| |Project management|Enable users to create and track project work items from partner systems.|Supported.|
  • [Activate your Outlook add-in on multiple messages](item-multi-select.md)
  • [Activate your Outlook add-in without the Reading Pane enabled or a message selected](contextless.md)
  • [Verify the color categories applied to a new message or appointment](https://github.com/OfficeDev/Office-Add-in-samples/tree/main/Samples/outlook-check-item-categories)
| |Attachment management|Enable users to import or export attachments from partner locations.|Supported.|
  • [Activate your Outlook add-in on multiple messages](item-multi-select.md)
  • [Activate your Outlook add-in without the Reading Pane enabled or a message selected](contextless.md)
  • [Activate add-ins with events](../develop/event-based-activation.md)
  • [Drag and drop messages and attachments into the task pane of an Outlook add-in](drag-drop-items.md)
| -|Message encryption|Enable users to encrypt and decrypt messages.|Partially supported. Essential features are yet to be addressed to create a similar experience to VSTO or COM add-ins.|
  • [Activate add-ins with events](../develop/event-based-activation.md)
  • [Handle OnMessageSend and OnAppointmentSend events in your Outlook add-in with Smart Alerts](onmessagesend-onappointmentsend-events.md)
  • [Create an encryption Outlook add-in](encryption-decryption.md)
  • [Office.MessageDecryptEventCompletedOptions](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true) (preview)
  • [Office.DecryptedMessageAttachment](/javascript/api/outlook/office.decryptedmessageattachment?view=outlook-js-preview&preserve-view=true)
  • [Office.DecryptedMessageBody](/javascript/api/outlook/office.decryptedmessagebody?view=outlook-js-preview&preserve-view=true)
  • [Office.context.mailbox.item.body.getAsync](/javascript/api/outlook/office.body#outlook-office-body-getasync-member(1))
  • [Office.context.mailbox.item.body.setAsync](/javascript/api/outlook/office.body#outlook-office-body-setasync-member(1))
  • [Office.context.mailbox.item.display](/javascript/api/outlook/office.messageread?view=outlook-js-preview&preserve-view=true#outlook-office-messageread-display-member) (preview)
  • [Office.context.mailbox.item.display.body.setAsync](/javascript/api/outlook/office.displayedbody?view=outlook-js-preview&preserve-view=true#outlook-office-displayedbody-setasync-member(1)) (preview)
  • [Office.context.mailbox.item.display.subject.setAsync](/javascript/api/outlook/office.displayedsubject#outlook-office-displayedsubject-setasync-member(1)) (preview)
  • [Office.context.mailbox.item.internetHeaders.setAsync](/javascript/api/outlook/office.internetheaders#outlook-office-internetheaders-setasync-member(1))
| +|Message encryption|Enable users to encrypt and decrypt messages.|Partially supported. Essential features are yet to be addressed to create a similar experience to VSTO or COM add-ins.|
  • [Activate add-ins with events](../develop/event-based-activation.md)
  • [Handle OnMessageSend and OnAppointmentSend events in your Outlook add-in with Smart Alerts](onmessagesend-onappointmentsend-events.md)
  • [Create an encryption Outlook add-in](encryption-decryption.md)
  • [Office.MessageDecryptEventCompletedOptions](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true) (preview)
  • [Office.DecryptedMessageAttachment](/javascript/api/outlook/office.decryptedmessageattachment?view=outlook-js-preview&preserve-view=true) (preview)
  • [Office.DecryptedMessageBody](/javascript/api/outlook/office.decryptedmessagebody?view=outlook-js-preview&preserve-view=true) (preview)
  • [Office.context.mailbox.item.body.getAsync](/javascript/api/outlook/office.body#outlook-office-body-getasync-member(1))
  • [Office.context.mailbox.item.body.setAsync](/javascript/api/outlook/office.body#outlook-office-body-setasync-member(1))
  • [Office.context.mailbox.item.display](/javascript/api/outlook/office.messageread?view=outlook-js-preview&preserve-view=true#outlook-office-messageread-display-member) (preview)
  • [Office.context.mailbox.item.display.body.setAsync](/javascript/api/outlook/office.displayedbody?view=outlook-js-preview&preserve-view=true#outlook-office-displayedbody-setasync-member(1)) (preview)
  • [Office.context.mailbox.item.display.subject.setAsync](/javascript/api/outlook/office.displayedsubject#outlook-office-displayedsubject-setasync-member(1)) (preview)
  • [Office.context.mailbox.item.internetHeaders.setAsync](/javascript/api/outlook/office.internetheaders#outlook-office-internetheaders-setasync-member(1))
| |Data loss prevention|Prevent users from forwarding mail items that contain highly sensitive information.|Supported.|
  • [Automatically check for an attachment before a message is sent](smart-alerts-onmessagesend-walkthrough.md)
  • [Handle OnMessageSend and OnAppointmentSend events in your Outlook add-in with Smart Alerts](onmessagesend-onappointmentsend-events.md)
  • [Manage the sensitivity label of your message or appointment in compose mode](sensitivity-label.md)
  • [Verify the sensitivity label of a message](https://github.com/OfficeDev/Office-Add-in-samples/tree/main/Samples/outlook-verify-sensitivity-label)
  • [Office.SensitivityLabel](/javascript/api/outlook/office.sensitivitylabelscatalog)
  • [Office.SensitivityLabelsCatalog](/javascript/api/outlook/office.sensitivitylabelscatalog)
  • [Office.SensitivityLabelDetails](/javascript/api/outlook/office.sensitivitylabeldetails)
  • [Office.context.mailbox.item.body.getAsync](/javascript/api/outlook/office.body#outlook-office-body-getasync-member(1))
  • [Office.context.mailbox.item.body.setAsync](/javascript/api/outlook/office.body#outlook-office-body-setasync-member(1))
  • [Office.context.mailbox.item.closeAsync](/javascript/api/outlook/office.messagecompose#outlook-office-messagecompose-closeasync-member(1))
  • [Office.context.mailbox.item.inReplyTo](/javascript/api/outlook/office.messagecompose#outlook-office-messagecompose-inreplyto-member)
  • [Office.context.mailbox.item.getConversationIndexAsync](/javascript/api/outlook/office.messagecompose#outlook-office-messagecompose-getconversationindexasync-member(1))
  • [Office.context.mailbox.item.getItemClassAsync](/javascript/api/outlook/office.messagecompose#outlook-office-messagecompose-getitemclassasync-member(1))
| |Mail item classification|Enable users to identify and classify messages that contain sensitive information.|Partially supported. Essential features are yet to be addressed to create a similar experience to VSTO or COM add-ins.|
  • [Automatically check for an attachment before a message is sent](smart-alerts-onmessagesend-walkthrough.md)
  • [Handle OnMessageSend and OnAppointmentSend events in your Outlook add-in with Smart Alerts](onmessagesend-onappointmentsend-events.md)
  • [Manage the sensitivity label of your message or appointment in compose mode](sensitivity-label.md)
  • [Manage the sensitivity level of an appointment](/javascript/api/outlook/office.sensitivity)
  • [Office.Sensitivity](/javascript/api/outlook/office.sensitivity)
  • [Office.SensitivityLabel](/javascript/api/outlook/office.sensitivitylabelscatalog)
  • [Office.SensitivityLabelsCatalog](/javascript/api/outlook/office.sensitivitylabelscatalog)
  • [Office.SensitivityLabelDetails](/javascript/api/outlook/office.sensitivitylabeldetails)
| |Data sync service|Enable bidirectional synchronization of mail items with partner systems.|Partially supported. Essential features are yet to be addressed to create a similar experience to VSTO or COM add-ins.|
  • [Use Microsoft Graph to manage personal contacts in Outlook](/graph/outlook-contacts-concept-overview)
| From db7c1e4745820d188eeeaab4b3e0f45feede756a Mon Sep 17 00:00:00 2001 From: Sam Ramon <15154970+samantharamon@users.noreply.github.com> Date: Wed, 8 Oct 2025 14:56:18 -0700 Subject: [PATCH 3/8] Update ms.date and fix event name --- docs/develop/event-based-activation.md | 4 +- docs/outlook/encryption-decryption.md | 53 +++++++++++++------------- docs/outlook/one-outlook.md | 2 +- docs/toc.yml | 2 + 4 files changed, 32 insertions(+), 29 deletions(-) diff --git a/docs/develop/event-based-activation.md b/docs/develop/event-based-activation.md index c67f7636e..fc7a3b9ad 100644 --- a/docs/develop/event-based-activation.md +++ b/docs/develop/event-based-activation.md @@ -1,7 +1,7 @@ --- title: Activate add-ins with events description: Learn how to develop an Office Add-in that implements event-based activation. -ms.date: 09/11/2025 +ms.date: 10/09/2025 ms.topic: concept-article ms.localizationpriority: medium --- @@ -72,7 +72,7 @@ Support for this feature in Outlook was introduced in [requirement set 1.10](/ja |`OnSensitivityLabelChanged`|sensitivityLabelChanged|On changing the sensitivity label while composing a message or appointment. To learn how to manage the sensitivity label of a mail item, see [Manage the sensitivity label of your message or appointment in compose mode](../outlook/sensitivity-label.md).

Event-specific data object: [SensitivityLabelChangedEventArgs](/javascript/api/outlook/office.sensitivitylabelchangedeventargs?view=outlook-js-preview&preserve-view=true)|[1.13](/javascript/api/requirement-sets/outlook/requirement-set-1.13/outlook-requirement-set-1.13)
  • Web browser4
  • Windows ([new](https://support.microsoft.com/office/656bb8d9-5a60-49b2-a98b-ba7822bc7627)4 and classic1)
  • New Mac UI2
| |`OnMessageReadWithCustomAttachment`|Not available|On opening a message that contains a specific attachment type in read mode.|[Preview](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview)5
  • Windows (classic1)
| |`OnMessageReadWithCustomHeader`|Not available|On opening a message that contains a specific internet header name in read mode.|[Preview](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview)5
  • Windows (classic1)
| -|`OnMessageDecrypt` (preview)|Not available|On matching the header of an encrypted message to the header key in an add-in's manifest. To learn more, see [Create an encryption Outlook add-in](../outlook/encryption-decryption.md).|[Preview](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview)
  • Windows (classic1)
| +|`OnMessageRead` (preview)|Not available|On matching the header of an encrypted message to the header key in an add-in's manifest. To learn more, see [Create an encryption Outlook add-in](../outlook/encryption-decryption.md).|[Preview](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview)
  • Windows (classic1)
| > [!NOTE] > 1 Event-based add-ins in classic Outlook on Windows require a minimum of Windows 10 Version 1903 (Build 18362) or Windows Server 2019 Version 1903 to run. diff --git a/docs/outlook/encryption-decryption.md b/docs/outlook/encryption-decryption.md index 4228b2419..c3295c391 100644 --- a/docs/outlook/encryption-decryption.md +++ b/docs/outlook/encryption-decryption.md @@ -1,17 +1,17 @@ --- title: Create an encryption Outlook add-in description: Learn how to develop an Outlook add-in that encrypts and decrypts messages. -ms.date: 09/11/2025 +ms.date: 10/09/2025 ms.topic: how-to ms.localizationpriority: medium --- # Create an encryption Outlook add-in -Implement custom encryption and decryption functionality in an Outlook add-in to secure email communications. With the `OnMessageDecrypt` event, your add-in can provide a seamless user experience by automatically identifying encrypted messages and handling decryption, content display, and error notifications. +Implement custom encryption and decryption functionality in an Outlook add-in to secure email communications. With the `OnMessageRead` event, your add-in can provide a seamless user experience by automatically identifying encrypted messages and handling decryption, content display, and error notifications. > [!NOTE] -> The `OnMessageDecrypt` event and decryption APIs are in preview. Features in preview shouldn't be used in production add-ins. We invite you to try out this feature in test or development environments and welcome feedback on your experience through GitHub (see the "Office Add-ins feedback" section at the end of this page). +> The `OnMessageRead` event and decryption APIs are in preview. Features in preview shouldn't be used in production add-ins as they may change based on feedback we receive. We invite you to try out this feature in test or development environments and welcome feedback on your experience through GitHub (see the "Office Add-ins feedback" section at the end of this page). ## Overview of the encryption and decryption workflows @@ -25,27 +25,27 @@ The following table provides an overview of the encryption and decryption workfl | Step | Implementation | | ---- | -------------- | | User composes a message and uses your add-in to apply encryption rules | You must implement your own encryption protocol so that the add-in can secure the contents of the message and its attachments. | -| User sends the message | Implement a handler for the [OnMessageSend](onmessagesend-onappointmentsend-events.md) event so that your add-in can automatically run your encryption protocol when the user selects **Send**.

To identify a message that was encrypted using your add-in during the decryption process, use the [internet headers APIs](/javascript/api/outlook/office.internetheaders) to add a header to a message. The header key must match the value specified in the `HeaderName` attribute of the [\](/javascript/api/manifest/launchevent?view=outlook-js-preview&preserve-view=true) element for the [OnMessageDecrypt](../develop/event-based-activation.md#outlook-events) event in the add-in's manifest. For more information, see [Implement decryption using event-based activation](#implement-decryption-using-event-based-activation). | -| Recipient receives the encrypted message and opens it | If the recipient has the same add-in that was used to encrypt the message installed in Outlook, the add-in checks whether the header key included in the message matches the value specified for the `OnMessageDecrypt` event in the manifest. This operation is automatically done by an add-in that handles the `OnMessageDecrypt` event, so that you don't have to manually implement the check. If the headers match, the `OnMessageDecrypt` event occurs and its handler runs. For more information, see [Implement decryption using event-based activation](#implement-decryption-using-event-based-activation). | -| Add-in decrypts the message | You must implement your own decryption protocol in the `OnMessageDecrypt` event handler. While your add-in decrypts the message and its attachments, a notification is shown to the user to alert them that their message is being processed by the add-in. This notification is automatically shown by an add-in that handles the `OnMessageDecrypt` event, so that you don't have to manually create one. | -| Recipient views the decrypted message and its attachments, if any | Once the decryption operation is complete, a notification is automatically shown to the user to alert them that the add-in has finished processing the message. In your `OnMessageDecrypt` handler, call the [event.completed](/javascript/api/outlook/office.mailboxevent?view=outlook-js-preview&preserve-view=true#outlook-office-mailboxevent-completed-member(1)) method and pass it a [MessageDecryptEventCompletedOptions](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true) object. With the `MessageDecryptEventCompletedOptions` object, you can specify whether to display the decrypted content to the recipient. For more information, see [Implement event handling](#implement-event-handling). | +| User sends the message | Implement a handler for the [OnMessageSend](onmessagesend-onappointmentsend-events.md) event so that your add-in can automatically run your encryption protocol when the user selects **Send**.

To identify a message that was encrypted using your add-in during the decryption process, use the [internet headers APIs](/javascript/api/outlook/office.internetheaders) to add a header to a message. The header key must match the value specified in the `HeaderName` attribute of the [\](/javascript/api/manifest/launchevent?view=outlook-js-preview&preserve-view=true) element for the [OnMessageRead](../develop/event-based-activation.md#outlook-events) event in the add-in's manifest. For more information, see [Implement decryption using event-based activation](#implement-decryption-using-event-based-activation). | +| Recipient receives the encrypted message and opens it | If the recipient has the same add-in that was used to encrypt the message installed in Outlook, the add-in checks whether the header key included in the message matches the value specified for the `OnMessageRead` event in the manifest. This operation is automatically done by an add-in that handles the `OnMessageRead` event, so that you don't have to manually implement the check. If the headers match, the `OnMessageRead` event occurs and its handler runs. For more information, see [Implement decryption using event-based activation](#implement-decryption-using-event-based-activation). | +| Add-in decrypts the message | You must implement your own decryption protocol in the `OnMessageRead` event handler. While your add-in decrypts the message and its attachments, a notification is shown to the user to alert them that their message is being processed by the add-in. This notification is automatically shown by an add-in that handles the `OnMessageRead` event, so that you don't have to manually create one. | +| Recipient views the decrypted message and its attachments, if any | Once the decryption operation is complete, a notification is automatically shown to the user to alert them that the add-in has finished processing the message. In your `OnMessageRead` handler, call the [event.completed](/javascript/api/outlook/office.mailboxevent?view=outlook-js-preview&preserve-view=true#outlook-office-mailboxevent-completed-member(1)) method and pass it a [MessageDecryptEventCompletedOptions](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true) object. With the `MessageDecryptEventCompletedOptions` object, you can specify whether to display the decrypted content to the recipient. For more information, see [Implement event handling](#implement-event-handling). | ## Implement decryption using event-based activation -While you must implement your own encryption and decryption protocols, configure your add-in to handle the `OnMessageDecrypt` event to conveniently determine when your add-in can decrypt a message and display the decrypted contents. To implement the `OnMessageDecrypt` event, you must: +While you must implement your own encryption and decryption protocols, configure your add-in to handle the `OnMessageRead` event to conveniently determine when your add-in can decrypt a message and display the decrypted contents. To implement the `OnMessageRead` event, you must: 1. [Configure the add-in's manifest](#configure-the-manifest). 1. [Implement event handling](#implement-event-handling). ### Supported environments -The `OnMessageDecrypt` event is supported on the Message Read surface. Support varies by client and Exchange environment as shown in the following table. +The `OnMessageRead` event is supported on the Message Read surface. Support varies by client and Exchange environment as shown in the following table. | Client | Exchange Online | Exchange Subscription Edition (SE) | Exchange Server 2019 | Exchange Server 2016 | | ------ | --------------- | ---------------------------------- | -------------------- | -------------------- | | **Web browser** | Not available | Not available | Not available | Not available | | **Windows (new)** | Not available | Not available | Not available | Not available | -| **Windows (classic)**
Version TBD (Build TBD) and later | In preview | Not available | Not available | Not available | +| **Windows (classic)**
Version 2510 (Build 19312.20000) and later | In preview | Not available | Not available | Not available | | **Mac** | Not available | Not available | Not available | Not available | | **Android** | Not available | Not available | Not available | Not available | | **iOS** | Not available | Not available | Not available | Not available | @@ -63,14 +63,14 @@ Classic Outlook on Windows includes a local copy of the production and beta vers ### Configure the manifest > [!NOTE] -> The `OnMessageDecrypt`event can currently only be implemented with an add-in only manifest. +> The `OnMessageRead`event can currently only be implemented with an add-in only manifest. -To activate your add-in on the `OnMessageDecrypt` event, you must configure the [\](/javascript/api/manifest/versionoverrides-1-1-mail) node of your add-in's **manifest.xml** file as follows. +To activate your add-in on the `OnMessageRead` event, you must configure the [\](/javascript/api/manifest/versionoverrides-1-1-mail) node of your add-in's **manifest.xml** file as follows. - To run an event-based add-in in classic Outlook on Windows, you must specify the JavaScript file that contains the event handler in the [\](/javascript/api/manifest/override) child element of the [\](/javascript/api/manifest/runtime) element. -- Specify the `OnMessageDecrypt` event in the `Type` attribute of a [\](/javascript/api/manifest/launchevent?view=outlook-js-preview&preserve-view=true) element. You must assign the function name of the event handler to the `FunctionName` attribute of the element. To facilitate checking whether the add-in encrypted a message, a header key must be specified in the `HeaderName` attribute. The same header is added to a message that's encrypted by the add-in. +- Specify the `OnMessageRead` event in the `Type` attribute of a [\](/javascript/api/manifest/launchevent?view=outlook-js-preview&preserve-view=true) element. You must assign the function name of the event handler to the `FunctionName` attribute of the element. To facilitate checking whether the add-in encrypted a message, a header key must be specified in the `HeaderName` attribute. The same header is added to a message that's encrypted by the add-in. -The following is an example of a `` node that implements the `OnMessageDecrypt` event. +The following is an example of a `` node that implements the `OnMessageRead` event. ```xml @@ -95,7 +95,7 @@ The following is an example of a `` node that implements the ` - + @@ -117,10 +117,10 @@ The following is an example of a `` node that implements the ` ### Implement event handling -The `OnMessageDecrypt` event handler is used to run the decryption operation and determine whether to display the decrypted contents of a message. +The `OnMessageRead` event handler is used to run the decryption operation and determine whether to display the decrypted contents of a message. -- To ensure your handler runs when the `OnMessageDecrypt` event occurs, call `Office.actions.associate` in the JavaScript file where the handler is implemented. This maps the handler name specified in the `FunctionName` attribute of the `` element in the manifest to its JavaScript counterpart. -- Once the decryption operation finishes, you must call `event.completed` to signal to the client that your add-in has completed processing the `OnMessageDecrypt` event. To display the decrypted contents of a message and its attachments, pass a [MessageDecryptEventCompletedOptions](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true) object to the `event.completed` call and set its [allowEvent](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true#outlook-office-messagedecrypteventcompletedoptions-allowevent-member) property to `true`. Then, specify the decrypted contents of the message in the object's [emailBody](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true#outlook-office-messagedecrypteventcompletedoptions-emailbody-member) and [attachments](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true#outlook-office-messagedecrypteventcompletedoptions-attachments-member) properties. +- To ensure your handler runs when the `OnMessageRead` event occurs, call `Office.actions.associate` in the JavaScript file where the handler is implemented. This maps the handler name specified in the `FunctionName` attribute of the `` element in the manifest to its JavaScript counterpart. +- Once the decryption operation finishes, you must call `event.completed` to signal to the client that your add-in has completed processing the `OnMessageRead` event. To display the decrypted contents of a message and its attachments, pass a [MessageDecryptEventCompletedOptions](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true) object to the `event.completed` call and set its [allowEvent](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true#outlook-office-messagedecrypteventcompletedoptions-allowevent-member) property to `true`. Then, specify the decrypted contents of the message in the object's [emailBody](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true#outlook-office-messagedecrypteventcompletedoptions-emailbody-member) and [attachments](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true#outlook-office-messagedecrypteventcompletedoptions-attachments-member) properties. You can also specify any data that your add-in may need for processing in the [contextData](/javascript/api/outlook/office.messagedecrypteventcompletedoptions?view=outlook-js-preview&preserve-view=true#outlook-office-messagedecrypteventcompletedoptions-contextdata-member) property. For example, you can store custom internet headers to decrypt messages in reply and forward scenarios. > [!NOTE] > Be mindful of the following when creating an event-based add-in for classic Outlook on Windows. @@ -128,10 +128,10 @@ The `OnMessageDecrypt` event handler is used to run the decryption operation and > - Imports aren't currently supported in the JavaScript file containing the event handler. > - When the JavaScript function specified in the manifest to handle an event runs, code in `Office.onReady()` and `Office.initialize` isn't run. We recommend adding any startup logic needed by the event handler, such as checking the user's Outlook version, to the event handler instead. -The following is an example of an `OnMessageDecrypt` event handler. +The following is an example of an `OnMessageRead` event handler. ```javascript -function onMessageDecryptHandler(event) { +function onMessageReadHandler(event) { // Your code to decrypt the contents of a message would appear here. ... @@ -172,12 +172,13 @@ function onMessageDecryptHandler(event) { event.completed({ allowEvent: true, emailBody: decryptedBody, - attachments: decryptedAttachments + 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); +Office.actions.associate("onMessageReadHandler", onMessageReadHandler); ``` > [!TIP] @@ -201,16 +202,16 @@ Office.actions.associate("onMessageDecryptHandler", onMessageDecryptHandler); ### Decryption notifications -Add-ins that handle the `OnMessageDecrypt` event automatically display notifications in certain decryption scenarios as described in the following table. +Add-ins that handle the `OnMessageRead` event automatically display notifications in certain decryption scenarios as described in the following table. | Notification | Scenario | | ------------ | -------- | | \ is unavailable and can't process your message at this time | Applies to classic Outlook on Windows only. This notification is shown when the add-in fails to load because an error prevented the add-in from loading or the user's client or machine is offline. | -| \ failed to process your message | An error was encountered while the add-in was decrypting the message. To retry the decryption operation, the recipient must switch to another message, then open the encrypted message again to invoke the `OnMessageDecrypt` event. | -| \ is processing your message | The add-in is handling the `OnMessageDecrypt` event to decrypt the message. | +| \ failed to process your message | An error was encountered while the add-in was decrypting the message. To retry the decryption operation, the recipient must switch to another message, then open the encrypted message again to invoke the `OnMessageRead` event. | +| \ is processing your message | The add-in is handling the `OnMessageRead` event to decrypt the message. | | \ has finished processing your message | The add-in successfully decrypted the contents of the message. The user can now view the message and its attachments. | | \ is taking longer than expected to process your message | The add-in has been running for more than five seconds, but less than five minutes. | -| \ timed out. To retry, select another email and then return to this message | The add-in times out after running for five minutes. To retry the decryption operation, the recipient must switch to another message, then open the encrypted message again to invoke the `OnMessageDecrypt` event. | +| \ timed out. To retry, select another email and then return to this message | The add-in times out after running for five minutes. To retry the decryption operation, the recipient must switch to another message, then open the encrypted message again to invoke the `OnMessageRead` event. | ## See also diff --git a/docs/outlook/one-outlook.md b/docs/outlook/one-outlook.md index 7347195b6..0fb8ae112 100644 --- a/docs/outlook/one-outlook.md +++ b/docs/outlook/one-outlook.md @@ -1,7 +1,7 @@ --- title: Develop Outlook add-ins for the new Outlook on Windows description: Learn how to develop add-ins that are compatible with the new Outlook on Windows. -ms.date: 09/11/2025 +ms.date: 10/09/2025 ms.localizationpriority: medium --- diff --git a/docs/toc.yml b/docs/toc.yml index 1356f4dc9..fa7c7c5d6 100644 --- a/docs/toc.yml +++ b/docs/toc.yml @@ -808,6 +808,8 @@ items: - name: Update your signature when switching between accounts href: outlook/onmessagefromchanged-onappointmentfromchanged-events.md displayName: event-based activation + - name: Create an encryption add-in + href: outlook/encryption-decryption.md - name: Implement a spam reporting add-in href: outlook/spam-reporting.md - name: Activate add-in without Reading Pane or selected message From 3e25fbf2bfa23877916fb7c1a016bcbb1b6d683e Mon Sep 17 00:00:00 2001 From: Sam Ramon <15154970+samantharamon@users.noreply.github.com> Date: Wed, 8 Oct 2025 15:42:57 -0700 Subject: [PATCH 4/8] Clarify note --- docs/outlook/encryption-decryption.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/outlook/encryption-decryption.md b/docs/outlook/encryption-decryption.md index c3295c391..3036fe6cf 100644 --- a/docs/outlook/encryption-decryption.md +++ b/docs/outlook/encryption-decryption.md @@ -182,7 +182,7 @@ Office.actions.associate("onMessageReadHandler", onMessageReadHandler); ``` > [!TIP] -> When images are added to a message as inline attachments, they're automatically assigned a content ID. In the body of a message, the content ID of an inline attachment is specified in the `src` attribute of the `` element similar to the following example. +> In classic Outlook on Windows, when images are added to a message as inline attachments, they're automatically assigned a content ID. In the body of a message, the content ID of an inline attachment is specified in the `src` attribute of the `` element similar to the following example. > > `` > From 0d62810c7ef58685d10af63e26ca39dc0be7d813 Mon Sep 17 00:00:00 2001 From: Sam Ramon <15154970+samantharamon@users.noreply.github.com> Date: Wed, 8 Oct 2025 15:48:36 -0700 Subject: [PATCH 5/8] Fix spacing Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/outlook/encryption-decryption.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/outlook/encryption-decryption.md b/docs/outlook/encryption-decryption.md index c3295c391..1bc7f82b4 100644 --- a/docs/outlook/encryption-decryption.md +++ b/docs/outlook/encryption-decryption.md @@ -63,7 +63,7 @@ Classic Outlook on Windows includes a local copy of the production and beta vers ### Configure the manifest > [!NOTE] -> The `OnMessageRead`event can currently only be implemented with an add-in only manifest. +> The `OnMessageRead` event can currently only be implemented with an add-in only manifest. To activate your add-in on the `OnMessageRead` event, you must configure the [\](/javascript/api/manifest/versionoverrides-1-1-mail) node of your add-in's **manifest.xml** file as follows. From 8edc39138169bb533232000f4df90fba35d3d240 Mon Sep 17 00:00:00 2001 From: Sam Ramon <15154970+samantharamon@users.noreply.github.com> Date: Thu, 9 Oct 2025 14:53:12 -0700 Subject: [PATCH 6/8] Add preview instructions --- docs/outlook/encryption-decryption.md | 6 ++++-- docs/toc.yml | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/outlook/encryption-decryption.md b/docs/outlook/encryption-decryption.md index 3036fe6cf..1efc12d3e 100644 --- a/docs/outlook/encryption-decryption.md +++ b/docs/outlook/encryption-decryption.md @@ -1,12 +1,12 @@ --- -title: Create an encryption Outlook add-in +title: Create an encryption Outlook add-in (preview) description: Learn how to develop an Outlook add-in that encrypts and decrypts messages. ms.date: 10/09/2025 ms.topic: how-to ms.localizationpriority: medium --- -# Create an encryption Outlook add-in +# Create an encryption Outlook add-in (preview) Implement custom encryption and decryption functionality in an Outlook add-in to secure email communications. With the `OnMessageRead` event, your add-in can provide a seamless user experience by automatically identifying encrypted messages and handling decryption, content display, and error notifications. @@ -52,6 +52,8 @@ The `OnMessageRead` event is supported on the Message Read surface. Support vari #### Preview the decryption APIs in classic Outlook on Windows +To preview the decryption APIs in classic Outlook on Windows, join the [Microsoft 365 Insider program](https://aka.ms/MSFT365InsiderProgram), then choose the Beta Channel in the Outlook client. Your client must be on Version 2510 (Build 19312.20000) or later. + Classic Outlook on Windows includes a local copy of the production and beta versions of Office.js instead of loading from the content delivery network (CDN). By default, the local production copy of the API is referenced. To reference the local beta copy of the API, you must configure your computer's registry. This will enable you to test [preview features](/javascript/api/requirement-sets/outlook/preview-requirement-set/outlook-requirement-set-preview) in your event handlers in classic Outlook on Windows. 1. In the registry, navigate to `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Outlook\Options\WebExt\Developer`. If the key doesn't exist, create it. diff --git a/docs/toc.yml b/docs/toc.yml index fa7c7c5d6..6a369d2b9 100644 --- a/docs/toc.yml +++ b/docs/toc.yml @@ -810,6 +810,7 @@ items: displayName: event-based activation - name: Create an encryption add-in href: outlook/encryption-decryption.md + displayName: preview - name: Implement a spam reporting add-in href: outlook/spam-reporting.md - name: Activate add-in without Reading Pane or selected message From cdc3603b970a6ea4d971b56e50f9fbefb57ab94b Mon Sep 17 00:00:00 2001 From: Sam Ramon <15154970+samantharamon@users.noreply.github.com> Date: Thu, 9 Oct 2025 18:42:00 -0700 Subject: [PATCH 7/8] Apply suggestions from review Co-authored-by: Alex Jerabek <38896772+AlexJerabek@users.noreply.github.com> --- docs/outlook/encryption-decryption.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/outlook/encryption-decryption.md b/docs/outlook/encryption-decryption.md index 12b60d84d..09a2fefbb 100644 --- a/docs/outlook/encryption-decryption.md +++ b/docs/outlook/encryption-decryption.md @@ -8,7 +8,7 @@ ms.localizationpriority: medium # Create an encryption Outlook add-in (preview) -Implement custom encryption and decryption functionality in an Outlook add-in to secure email communications. With the `OnMessageRead` event, your add-in can provide a seamless user experience by automatically identifying encrypted messages and handling decryption, content display, and error notifications. +Implement custom encryption and decryption functionality in an Outlook add-in to secure email communications. The `OnMessageRead` event lets your add-in automatically identify encrypted messages and handle decryption, content display, and error notifications. > [!NOTE] > The `OnMessageRead` event and decryption APIs are in preview. Features in preview shouldn't be used in production add-ins as they may change based on feedback we receive. We invite you to try out this feature in test or development environments and welcome feedback on your experience through GitHub (see the "Office Add-ins feedback" section at the end of this page). @@ -32,14 +32,14 @@ The following table provides an overview of the encryption and decryption workfl ## Implement decryption using event-based activation -While you must implement your own encryption and decryption protocols, configure your add-in to handle the `OnMessageRead` event to conveniently determine when your add-in can decrypt a message and display the decrypted contents. To implement the `OnMessageRead` event, you must: +You must implement your own encryption and decryption protocols. The add-in must also be configured to handle the `OnMessageRead` event to conveniently determine when your add-in can decrypt a message and display the decrypted contents. To implement the `OnMessageRead` event, you must: 1. [Configure the add-in's manifest](#configure-the-manifest). 1. [Implement event handling](#implement-event-handling). ### Supported environments -The `OnMessageRead` event is supported on the Message Read surface. Support varies by client and Exchange environment as shown in the following table. +The `OnMessageRead` event is supported on the [Message Read](read-scenario.md) surface. Support varies by client and Exchange environment, as shown in the following table. | Client | Exchange Online | Exchange Subscription Edition (SE) | Exchange Server 2019 | Exchange Server 2016 | | ------ | --------------- | ---------------------------------- | -------------------- | -------------------- | @@ -70,7 +70,7 @@ Classic Outlook on Windows includes a local copy of the production and beta vers To activate your add-in on the `OnMessageRead` event, you must configure the [\](/javascript/api/manifest/versionoverrides-1-1-mail) node of your add-in's **manifest.xml** file as follows. - To run an event-based add-in in classic Outlook on Windows, you must specify the JavaScript file that contains the event handler in the [\](/javascript/api/manifest/override) child element of the [\](/javascript/api/manifest/runtime) element. -- Specify the `OnMessageRead` event in the `Type` attribute of a [\](/javascript/api/manifest/launchevent?view=outlook-js-preview&preserve-view=true) element. You must assign the function name of the event handler to the `FunctionName` attribute of the element. To facilitate checking whether the add-in encrypted a message, a header key must be specified in the `HeaderName` attribute. The same header is added to a message that's encrypted by the add-in. +- Specify the `OnMessageRead` event in the `Type` attribute of a [\](/javascript/api/manifest/launchevent?view=outlook-js-preview&preserve-view=true) element. You must assign the function name of the event handler to the `FunctionName` attribute of the element. To facilitate checking whether the message was encrypted by the add-in, a header key must be specified in the `HeaderName` attribute. The same header is added to a message that's encrypted by the add-in. The following is an example of a `` node that implements the `OnMessageRead` event. From 5bc8fd28272518c3ccfc0d258ab73dacc715095b Mon Sep 17 00:00:00 2001 From: Sam Ramon <15154970+samantharamon@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:16:26 -0700 Subject: [PATCH 8/8] Apply suggestion from code review --- docs/outlook/encryption-decryption.md | 50 ++++++++++++++++++--------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/docs/outlook/encryption-decryption.md b/docs/outlook/encryption-decryption.md index 12b60d84d..904816b73 100644 --- a/docs/outlook/encryption-decryption.md +++ b/docs/outlook/encryption-decryption.md @@ -137,37 +137,55 @@ function onMessageReadHandler(event) { // Your code to decrypt the contents of a message would appear here. ... - // Display the message body and attachments if decryption is successful. + // Use the results from your decryption process to display the decrypted contents of the message body and attachments. + const decryptedBodyContent = "

Please find attached the recent report and its supporting documentation.

"; const decryptedBody = { coercionType: Office.CoercionType.Html, - content: "

Please find attached the recent report and its supporting documentation.

" + content: decryptedBodyContent }; + // Decrypted content and properties of a file attachment. + const decryptedPdfFile = "JVBERi0xLjQKJeLjz9MKNCAwIG9i..."; + const pdfFileName = "Fabrikam_Report_202509"; + + // Decrypted content and properties of a mail item. + const decryptedEmailFile = "VGhpcyBpcyBhIHRleHQgZmlsZS4=..."; + const emailFileName = "Fabrikam_Report_202508.eml"; + + // 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: "JVBERi0xLjQKJeLjz9MKNCAwIG9i...", + { + attachmentType: Office.MailboxEnums.AttachmentType.File, + content: decryptedPdfFile, isInline: false, - name: "Fabrikam_Report_202509" + name: pdfFileName }, { - attachmentType: Office.MailboxEnums.AttachmentType.Item, - content: "VGhpcyBpcyBhIHRleHQgZmlsZS4=...", + attachmentType: Office.MailboxEnums.AttachmentType.Item, + content: decryptedEmailFile, isInline: false, - name: "Fabrikam_Report_202508.eml" + name: emailFileName }, { - attachmentType: Office.MailboxEnums.AttachmentType.Cloud, + attachmentType: Office.MailboxEnums.AttachmentType.Cloud, isInline: false, - name: "weekly_forecast.xlsx", - path: "https://contosostorage.com/reports/weekly_forecast.xlsx" + name: cloudFileName, + path: cloudFilePath }, { - attachmentType: Office.MailboxEnums.AttachmentType.File, - content: "iVBORw0KGgoAAAANSUhEUgAA...", - contentId: "image001.png@01DC1DD9.1A4AA300", + attachmentType: Office.MailboxEnums.AttachmentType.File, + content: decryptedImageFile, + contentId: imageContentId, isInline: true, - name: "banner.png" + name: imageFileName } ];