Outlook Redemption: GetNamesFromIDs
-
05-07-2019 - |
Вопрос
Я пытаюсь получить все имена / значения свойств из элемента 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 и раньше, но не таким образом, так что это все, что у меня есть для вас ...