Вопрос

Я пытаюсь получить все имена / значения свойств из элемента 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# свойства

Любая помощь или понимание будут с благодарностью.

Это было полезно?

Решение

Я думаю, я понял это. Я использовал только 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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top