Получить настраиваемый набор свойств в надстройке Outlook через Microsoft Graph

Допустим, в моей надстройке Outlook (с помощью Office.js) есть следующий код, выполняемый в составной форме встречи:

const item = Office.context.mailbox.item;
item.loadCustomPropertiesAsync((result) => {
    const props = result.value;
    const testProp = props.get("my_prop");
    console.log("CUSTOM_PROP", testProp);
    props.set("my_prop", "test_value");
    props.saveAsync((saveResult) =>
        console.log("SAVE_CUSTOM_PROP", saveResult));
});

Я вижу, что это на самом деле сохраняется на мероприятии.

А теперь куча вопросов, касающихся этих пользовательских свойств:

  1. Но связаны ли они с расширенными свойствами?

  2. Эти свойства как-то доступны через Outlook REST API или Microsoft Graph?

  3. Могу ли я создать подписку на push-уведомления с помощью Microsoft Graph с фильтром на основе этих свойств? (Я знаю, что могу на основе расширенных свойств)

  4. Если ответ на вышеуказанный вопрос "нет", а пользовательские свойства доступны только через надстройку, которая их создала, есть ли способ создать расширенное свойство для события из надстройки, даже если оно не сохранено?

Чтобы объяснить, почему я спрашиваю - я создаю надстройку, которая позволяет "связать" встречу с нашей сторонней системой и синхронизировать эту встречу с нашим объектом.

Поэтому, когда нажимается кнопка в форме создания, я:

  • сохранить встречу и получить event-id,
  • сохраните его в нашей системе, чтобы выполнить синхронизацию от нашей системы до встречи.
  • добавить расширенное свойство в нашей системе, используя Microsoft Graph для этого назначения

При первом использовании надстройки пользователь аутентифицируется, и я создаю подписку на push-уведомления для событий с нашим расширенным свойством, чтобы выполнить синхронизацию из Outlook с нашей системой.

Он отлично работает на OWA, но теперь, когда нам действительно нужно поддерживать десктоп, возникают две основные проблемы:

  • Outlook для Mac: нет saveAsync метод, таким образом, нет возможности получить событие idЯ думал о добавлении некоторого пользовательского свойства, а затем о пуш-уведомлении, информирующем нашу систему о том, что было создано событие, которое необходимо синхронизировать с нашей системой.

  • Outlook для ПК: есть saveAsync метод, но обратный вызов выполняется, когда встреча сохраняется локально, а не на сервере, поэтому я не могу знать, когда именно было создано событие, и могу выполнить некоторые вызовы Microsoft Graph для этого события.

Ответ на мой первый вопрос и / или любые советы о моем случае использования будут более чем приветствоваться.

2 ответа

Решение

TL;DR; Да, можно прочитать пользовательские свойства, установленные Office.js апи loadCustomPropertiesAsync Использование REST API Вам необходимо создать запрос вызова REST, который выглядит следующим образом:

string addinManifestId = "<your manifest guid here>";//lower cases
string prop = @"String {00020329-0000-0000-C000-000000000046} Name"+ string.Format(" cecp-{0}", addinManifestId );
var url = $"<apiEndpoint>/messages/<youritemid>?$expand=SingleValueExtendedProperties($filter=PropertyId eq '{propertyname}')";

Больше информации

Документация доступна здесь https://msdn.microsoft.com/en-us/library/hh968549(v=exchg.80).aspx

У меня была похожая проблема, когда мне нужно было обработать "отправленную почту" для моей надстройки Keluro. Я реализовал нечто очень близкое к вашему подходу с помощью веб-хука REST API. Насколько мне известно, это единственный способ обработки отправленных товаров. Рассмотрите возможность голосования по этому https://officespdev.uservoice.com/forums/224641-feature-requests-and-feedback/suggestions/10964871-add-itemsend-event-so-add-in-can-cancel-email

  1. Согласно MS-OXCEXT, документу о взаимодействии о том, как надстройки хранят вещи в Outlook, пользовательские свойства хранятся в виде словаря JSON в расширенном свойстве MAPI (подробности по этой ссылке). Это означает, что вы должны иметь доступ к ним через расширенные свойства Graph, вам просто нужно проанализировать значение самостоятельно.
  2. Следует использовать расширенные свойства и "{type} {guid} Name {name}" формат.
  3. Я не понимаю, почему нет.
  4. Ответ не отрицательный, но я все равно отвечу на ваше продолжение:). Конечно, вы можете сделать это, если вы используете REST API из вашей надстройки.
Другие вопросы по тегам