Выкуп Outlook: GetNamesFromIDs

Я пытаюсь получить все имена / значения свойств из элемента Outlook. У меня есть настраиваемые свойства в дополнение к свойствам элемента Outlook по умолчанию. Я использую погашение, чтобы обойти предупреждения Outlook, но у меня возникли проблемы с методом GetNamesFromIDs в элементе Redemption.RDOMail ....

Я использую сеанс погашения, чтобы получить сообщение, и пытаюсь использовать сообщение, чтобы получить имена всех свойств.

Dim rMessage as Redemption.RDOMail = _RDOSession.GetMessageFromID(EntryID, getPublicStoreID())
Dim propertyList As Redemption.PropList = someMessage.GetPropList(Nothing)
For i As Integer = 1 To propertyList.Count + 1
    Console.WriteLine(propertyList(i).ToString())
    Console.WriteLine(someMessage.GetNamesFromIDs(________, propertyList(i)))
Next

Я не совсем уверен, что передать в качестве первого параметра getNamesFromIDs. Определение GetNamesFromIDs выглядит следующим образом:

GetNamesFromIDs(MAPIProp as Object, PropTag as Integer) As Redemption.NamedProperty

Я не совсем уверен, что следует передавать как объект MAPIProp. Я не вижу ссылок на это свойство в документации. http://www.dimastr.com/redemption/rdo/MAPIProp.htm#properties

Мы будем благодарны за любую помощь или понимание.


person Ryan Lanciaux    schedule 30.10.2008    source источник
comment
Было бы неплохо, если бы это сработало. :-)   -  person Tomalak    schedule 30.10.2008
comment
Определенно! Спасибо, что изучили это - я очень ценю это.   -  person Ryan Lanciaux    schedule 30.10.2008
comment
Прохладный! :-) Это была труднодоступная информация, поиск в Google не особо помог. Но это действительно хороший вопрос, поэтому я могу легко поставить +1 и за него.   -  person Tomalak    schedule 30.10.2008


Ответы (2)


Думаю, я разобрался. Я использовал только VBA, поэтому вам нужно «подумать» над его ограничениями, он будет следовать той же схеме в VB.NET.

Сигнатура функции такова:

Function GetNamesFromIDs(MAPIProp As Unknown, PropTag As Long) As NamedProperty

В качестве первого параметра требуется объект, поддерживающий интерфейс IUnknown. Глядя на документацию Redemption, стало ясно, что существует интерфейс с именем _MAPIProp, от которого происходят многие другие объекты RDO (среди них IRDOMail). Так что это должен быть тот самый RDOMail, из которого вы пытаетесь получить данные.

Зная это, ему потребовался еще один тонкий намек из документации, чтобы заставить его работать:

Учитывая тег prop (> = 0x80000000), возвращает GUID и идентификатор названного свойства.

Таким образом, тег свойства должен быть >= 0x80000000, это означает, что он не будет работать для всех свойств, а будет работать только для пользовательских (я предполагаю, что это различие в данном случае, поправьте меня, если я ошибаюсь.) Передача тегов свойств не соответствует этому условию. выдает сообщение об ошибке (0x8000ffff «неожиданные результаты»).

Вот мой код. Это VBA, так что простите меня за грубую ошибку Hex (), поскольку длинные целые числа VBA переполняются для таких больших чисел. Я уверен, что вы уловите картину.

Sub GetNamesFromIds()

  Dim rSession As New Redemption.RDOSession
  Dim rMessage As Redemption.RDOMail
  Dim PropertyList As Redemption.PropList
  Dim PropTag As Long
  Dim EntryId As String
  Dim i As Integer

  rSession.MAPIOBJECT = Application.Session.MAPIOBJECT

  ' retrieve first random mail for this example '
  EntryId = ActiveExplorer.CurrentFolder.Items(1).EntryId
  Set rMessage = rSession.GetMessageFromID(EntryId)
  Set PropertyList = rMessage.GetPropList(0)

  For i = 1 To PropertyList.Count
    PropTag = PropertyList(i)
    If "0x" & Right("00000000" & Hex(PropTag), 8) > "0x80000000" Then
      Debug.Print
      If IsArray(rMessage.Fields(PropTag)) Then
        Debug.Print Hex(PropTag), "(Array:", UBound(rMessage.Fields(PropTag)), "items)"
      Else
        Debug.Print Hex(PropTag), "(", rMessage.Fields(PropTag), ")"
      End If
      Debug.Print "    GUID:", rMessage.GetNamesFromIds(rMessage, PropTag).GUID
      Debug.Print "      ID:", rMessage.GetNamesFromIds(rMessage, PropTag).ID
    End If
  Next

End Sub

Первый фрагмент вывода:

8041001E      (             urn:content-classes:message )
    GUID:     {00020386-0000-0000-C000-000000000046}
      ID:     content-class
person Tomalak    schedule 30.10.2008

Что ж, в качестве справочной информации автор предлагает использовать что-то вроде OutlookSpy, чтобы узнать, как Outlook сохраняет свойства.

При просмотре этого обмена (обязательно прочитайте все последующие ответы), больше нечего (на самом деле, я думаю, что в какой-то момент MVP Outlook набирает GetNamesFromIDs, когда он имеет в виду GetIDsFromNames).

Вы можете попробовать использовать GetIDsFromNames, чтобы увидеть, что это вернет, а затем использовать это для перехода к GetNamesFromIDs.

Я использовал Redemption раньше, но не таким образом, так что это все, что у меня есть для вас ...

person Dave DuPlantis    schedule 30.10.2008