Изкупуване на 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
Готино! :-) Това беше някаква труднодостъпна информация, гугълането не помогна особено. Но това наистина е добър въпрос, така че лесно мога да дам +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 и id на наименуваното свойство.

Така че етикетът на свойство трябва да бъде >= 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