Получить настраиваемый набор свойств в надстройке 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));
});
Я вижу, что это на самом деле сохраняется на мероприятии.
А теперь куча вопросов, касающихся этих пользовательских свойств:
Но связаны ли они с расширенными свойствами?
Эти свойства как-то доступны через Outlook REST API или Microsoft Graph?
Могу ли я создать подписку на push-уведомления с помощью Microsoft Graph с фильтром на основе этих свойств? (Я знаю, что могу на основе расширенных свойств)
Если ответ на вышеуказанный вопрос "нет", а пользовательские свойства доступны только через надстройку, которая их создала, есть ли способ создать расширенное свойство для события из надстройки, даже если оно не сохранено?
Чтобы объяснить, почему я спрашиваю - я создаю надстройку, которая позволяет "связать" встречу с нашей сторонней системой и синхронизировать эту встречу с нашим объектом.
Поэтому, когда нажимается кнопка в форме создания, я:
- сохранить встречу и получить
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
- Согласно MS-OXCEXT, документу о взаимодействии о том, как надстройки хранят вещи в Outlook, пользовательские свойства хранятся в виде словаря JSON в расширенном свойстве MAPI (подробности по этой ссылке). Это означает, что вы должны иметь доступ к ним через расширенные свойства Graph, вам просто нужно проанализировать значение самостоятельно.
- Следует использовать расширенные свойства и
"{type} {guid} Name {name}"
формат. - Я не понимаю, почему нет.
- Ответ не отрицательный, но я все равно отвечу на ваше продолжение:). Конечно, вы можете сделать это, если вы используете REST API из вашей надстройки.