Outlook Redemption: GetNamesFromIDs
-
05-07-2019 - |
Question
J'essaie d'obtenir tous les noms / valeurs de propriétés d'un élément Outlook. J'ai des propriétés personnalisées en plus des propriétés d'élément de perspectives par défaut. J'utilise rédemption pour contourner les avertissements Outlook, mais je rencontre des problèmes avec la méthode GetNamesFromIDs sur un élément Redemption.RDOMail ....
J'utilise ma session d'échange pour obtenir le message et j'essaie de l'utiliser pour obtenir le nom de toutes les propriétés.
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
Je ne suis pas tout à fait sûr de ce qu'il faut transmettre en tant que premier paramètre pour getNamesFromIDs. La définition de GetNamesFromIDs est la suivante:
GetNamesFromIDs(MAPIProp as Object, PropTag as Integer) As Redemption.NamedProperty
Je ne suis pas tout à fait sûr de ce qui devrait être transmis en tant qu'objet MAPIProp. Je ne vois pas cette propriété référencée dans la documentation. http://www.dimastr.com/redemption/rdo/MAPIProp.htm# propriétés
Toute aide ou suggestion serait grandement appréciée.
La solution
Je pense que je l'ai compris. J’ai utilisé uniquement VBA, vous devez donc "réfléchir" et ses limitations, il suivra le même schéma dans VB.NET.
La signature de la fonction est la suivante:
Function GetNamesFromIDs(MAPIProp As Unknown, PropTag As Long) As NamedProperty
En tant que premier paramètre, il nécessite un objet prenant en charge l'interface IUnknown
. En examinant la documentation Redemption, il est apparu clairement qu’il existe une interface nommée _MAPIProp
, à partir de laquelle de nombreux autres objets RDO sont dérivés ( IRDOMail
en fait partie). Il doit donc s'agir du même RDOMail
que vous essayez d'extraire des données.
Sachant cela, il ne lui fallait qu'un autre indice subtil de la documentation pour le faire fonctionner:
Avec une balise prop (> = 0x80000000), retourne le GUID et l'id du nommé propriété.
La balise de propriété doit donc être > = 0x80000000
, cela signifie que cela ne fonctionnera pas pour toutes les propriétés, mais uniquement pour les propriétés personnalisées (je suppose que c'est la distinction dans ce cas, corrigez-moi si je Je ne me trompe pas. Passer des balises de propriété ne remplissant pas cette condition déclenche un message d'erreur (0x8000ffff "résultats inattendus").
Voici mon code. C'est VBA, alors pardonnez-moi la faute Hex (), car l'entier long de VBA déborde pour les nombres aussi gros. Je suis sûr que vous obtiendrez la photo.
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
Premier extrait de la sortie:
8041001E ( urn:content-classes:message )
GUID: {00020386-0000-0000-C000-000000000046}
ID: content-class
Autres conseils
Eh bien, pour des informations générales, l'auteur suggère d'utiliser quelque chose comme OutlookSpy pour voir comment Outlook stocke les propriétés.
En regardant cet échange (assurez-vous de lire toutes les réponses suivantes), il n’ya pas grand chose de plus (en fait, je pense qu’à un moment donné, le type MVP d’Outlook GetNamesFromIDs
lorsqu'il signifie GetIDsFromNames
).
Vous pouvez essayer d'utiliser GetIDsFromNames
pour voir ce qui est renvoyé, puis l'utiliser pour passer à GetNamesFromIDs
.
J'ai déjà utilisé Redemption auparavant, mais pas de cette manière. C'est tout ce que j'ai pour vous ...