Создание расширенного свойства с помощью EWS и доступ к нему из надстройки Outlook - PullRequest
3 голосов
/ 16 мая 2011

В настоящее время я работаю над EWS, чтобы обеспечить некоторую интеграцию приложения нашей компании с Exchange 2010. Я использую EWS для создания назначения для Exchange 2010, и он отлично работает;но недавно я попытался добавить некоторое настраиваемое / расширенное свойство при создании встречи, ниже приведен мой код для добавления расширенного свойства.

Dim customField As New ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, "MyCustomField", MapiPropertyType.String)

appointment.SetExtendedProperty(customField, "CustomFieldValue")

Приведенные выше коды способны создать настраиваемое поле для встречи.

Теперь вот моя проблема.Когда я открываю встречу в Outlook, которую я создал, и захожу в «Разработчик> Дизайн этой формы», затем на вкладку «Все поля», я вижу только настраиваемое поле, созданное мной в «Пользовательском поле в папке», но не в«Определяемое пользователем поле в этом элементе».

Я также создаю надстройку Outlook, чтобы реагировать на настраиваемое поле, созданное с помощью EWS, когда пользователь открывает встречу в Outlook, когда я пытался посмотретьдля настраиваемого поля не удалось найти настраиваемое поле, поскольку настраиваемое поле создается в «Пользовательском поле в папке», а не в «Пользовательском поле в этом элементе».

Этокоды в надстройке Outlook и будут выполняться, когда пользователь открывает точку в Outlook.Но поскольку настраиваемое поле отсутствует в «в этом элементе», .Find () ничего не возвращает.

Dim appt As Outlook.AppointmentItem
appt = TryCast(inspector.CurrentItem, Outlook.AppointmentItem)
If appt.UserProperties.Find("MyCustomField") Is Nothing Then
    'Some action
Else
    'Some action
End If

Чего я хочу добиться, так это создать встречу с настраиваемым полем (расширенное свойство), используяEWS, а затем прочитайте настраиваемое поле (расширенное свойство) в надстройке Outlook, когда пользователь откроет встречу в Outlook.

РЕДАКТИРОВАТЬ:

Значение, которое я присвоил настраиваемому полю с помощью EWSотображается в поле «Пользовательское поле в папке».Как получить значение из моей надстройки Outlook?Может быть, я могу получить значение и добавить настраиваемое поле для элемента со значением?

Спасибо.

Ответы [ 2 ]

7 голосов
/ 18 мая 2011

Ответ здесь: http://social.technet.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/2a98b4ab-0fbc-4863-8303-48711a18a050

Невозможно получить доступ к расширенному свойству, созданному EWS, с помощью UserProperties.Но можно получить доступ с помощью PropertyAccessor.

outlookItem.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/yourProp")
1 голос
/ 19 июня 2013

Я публикую это как другой ответ, показывающий некоторый фактический (Delphi) код, потому что он отсутствовал в первом ответе.AAppointmentItem - это OLEVariant

const
   GUID_PS_PUBLIC_STRINGS = '{00020329-0000-0000-C000-000000000046}';
   cPublicStringNameSpace = 'http://schemas.microsoft.com/mapi/string/' + GUID_PS_PUBLIC_STRINGS + '/';

var
   lPropertyAccessor: OleVariant;
   lSchemaName, lValue: String;

begin   
   // Use the PropertyAccessor because Outlook UserProperties() can't access the extended properties created by EWS 
   // Use the 'string subnamespace of the MAPI namespace' (http://msdn.microsoft.com/en-us/library/office/ff868915.aspx)
   // with the PS_PUBLIC_STRINGS GUID from http://msdn.microsoft.com/en-us/library/bb905283%28v=office.12%29.aspx
   lPropertyAccessor := AAppointmentItem.PropertyAccessor;
   lSchemaName := cPublicStringNameSpace + PROPERTY_TIMETELLID;  // Name constants defined elsewhere
   try
      lSchemaName := cPublicStringNameSpace + PROPERTY_TIMETELLID;
      lValue := lPropertyAccessor.GetProperty(lSchemaName);
      lEvent.CustSyncTTID := StrToInt(lValue);
   except
   end;
   try
      lSchemaName := cPublicStringNameSpace + PROPERTY_TIMETELLSYNCTIME;
      lValue := lPropertyAccessor.GetProperty(lSchemaName);
      lEvent.CustSyncDate := UTCString2LocalDateTime(lValue);
   except
   end;
   try
      lSchemaName := cPublicStringNameSpace + PROPERTY_TIMETELLSYNCID;
      lValue := lPropertyAccessor.GetProperty(lSchemaName);
      lEvent.CustSyncEntryID := lValue;
   except
   end;

Обратите внимание, что исключения много попыток, потому что мы делаем позднее связывание;«ранний» был бы лучше (http://blog.depauptits.nl/2012/04/safely-accessing-named-properties-in.html)

Кроме того, мы извлекаем несколько пользовательских свойств, поэтому GetProperties () на самом деле лучше.

FWIW, это был старый код с использованием UserProperties(lProperty OLEVariant)

lProperty := AAppointmentItem.UserProperties.Find(PROPERTY_TIMETELLID);
if IDispatch(lProperty) <> nil then
  lEvent.CustSyncTTID :=  lProperty.Value;
lProperty := AAppointmentItem.UserProperties.Find(PROPERTY_TIMETELLSYNCTIME);
if IDispatch(lProperty) <> nil then
  lEvent.CustSyncDate :=  lProperty.Value;
lProperty := AAppointmentItem.UserProperties.Find(PROPERTY_TIMETELLSYNCID);
if IDispatch(lProperty) <> nil then
  lEvent.CustSyncEntryID := lProperty.Value;            

[Отредактировано для добавления 2013-6-10]

А вот код, модифицированный для обработки всех трех свойств одновременно с использованием GetProperties ( какМС рекомендует ):

lPropertyAccessor := AAppointmentItem.PropertyAccessor;
lSchemas := VarArrayOf([cPublicStringNameSpace + PROPERTY_TIMETELLID,
                        cPublicStringNameSpace + PROPERTY_TIMETELLSYNCTIME,
                        cPublicStringNameSpace + PROPERTY_TIMETELLSYNCID]);
try
  lValues := lPropertyAccessor.GetProperties(lSchemas);
  if VarType(lValues[0]) <> varError then
     lEvent.CustSyncTTID := lValues[0];
  if VarType(lValues[1]) <> varError then
  begin
     lDT := lValues[1];
     lDT := TTimeZone.Local.ToLocalTime(lDT);
     lEvent.CustSyncDate := lDT;
  end;
  if VarType(lValues[2]) <> varError then
    lEvent.CustSyncEntryID := lValues[2];
except
end;
...