Outlook Redenção: GetNamesFromIDs
-
05-07-2019 - |
Pergunta
Eu estou tentando obter todos os nomes de propriedade / valores de um item do Outlook. Tenho propriedades personalizadas, além das propriedades item do Outlook padrão. Eu estou usando a redenção para contornar os avisos do Outlook, mas eu estou tendo alguns problemas com o método GetNamesFromIDs em um Redemption.RDOMail item ....
Eu estou usando minha sessão de resgate para obter a mensagem e tentar usar a mensagem para obter os nomes de todas as propriedades.
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
Eu não estou totalmente certo do que passar em como o primeiro parâmetro para GetNamesFromIDs. A definição de GetNamesFromIDs é a seguinte:
GetNamesFromIDs(MAPIProp as Object, PropTag as Integer) As Redemption.NamedProperty
Eu não estou totalmente certo de que deve ser passado como o objeto MAPIProp. Eu não vejo esta propriedade referenciada na documentação. http://www.dimastr.com/redemption/rdo/MAPIProp.htm# Propriedades
Qualquer ajuda ou insight seria muito apreciada.
Solução
Eu acho que eu percebi isso. Eu tenho usado VBA somente, então você precisa "pensar em torno" É limitações, ele seguirá o mesmo esquema em VB.NET.
A assinatura da função é o seguinte:
Function GetNamesFromIDs(MAPIProp As Unknown, PropTag As Long) As NamedProperty
Como o primeiro parâmetro que requer um objeto que suporta a interface IUnknown
. Olhando para os docs de resgate ficou claro que há uma _MAPIProp
interface chamada, a partir do qual muitos outros objetos RDO são derivados (IRDOMail
está entre eles). Portanto, este deve ser o RDOMail
você está tentando obter dados de fora.
Sabendo disso, ele precisava de apenas um outro toque sutil dos docs para fazê-lo funcionar:
Dada uma tag prop (> = 0x80000000), retorna o GUID e ID da chamada propriedade.
Assim tag propriedade deve ser >= 0x80000000
, isso significa que ele não vai funcionar para todas as propriedades, mas apenas para os personalizados (eu acho que é a distinção neste caso, me corrija se eu estiver errado). Passando em não tags de propriedade cumprir esta condição gera uma mensagem de erro (0x8000ffff "resultados inesperados").
Aqui está o meu código. É VBA, então perdoe-me o Hex (erro), como VBAs transborda inteiro longo para números tão grande. Tenho certeza que você vai obter a imagem.
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
Primeiro trecho da saída:
8041001E ( urn:content-classes:message )
GUID: {00020386-0000-0000-C000-000000000046}
ID: content-class
Outras dicas
Bem, para informação de fundo, o autor sugere usando algo como OutlookSpy para ver como o Outlook armazena as propriedades.
Olhando para essa troca (certifique-se de ler todas as respostas de acompanhamento), não há muito mais (na verdade, eu acho que em um ponto os tipos Outlook MVP GetNamesFromIDs
quando ele significa GetIDsFromNames
).
O que você pode tentar é usar GetIDsFromNames
para ver o que os retornos, e depois usar isso para passar para GetNamesFromIDs
.
Eu tenho Redemption usado antes, mas não dessa maneira particular, de modo que é tudo que eu tenho para você ...