1

我正在尝试从 Outlook 项目中获取所有属性名称/值。除了默认的 Outlook 项目属性外,我还有自定义属性。我正在使用兑换来绕过 Outlook 警告,但我在 Redemption.RDOMail 项目上的 GetNamesFromIDs 方法遇到了一些问题......

我正在使用我的兑换会话来获取消息并尝试使用该消息来获取所有属性的名称。

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

任何帮助或见解将不胜感激。

4

2 回答 2

2

好吧,对于背景信息,作者建议使用OutlookSpy之类的东西来查看 Outlook 如何存储属性。

看看这个交流(确保通读所有后续回复),没有更多内容(事实上,我认为在某一时刻 Outlook MVP 类型GetNamesFromIDs当他的意思时GetIDsFromNames)。

您可能会尝试使用GetIDsFromNames查看返回的内容,然后使用它传递给GetNamesFromIDs.

我以前用过救赎,但不是以这种特殊的方式,所以这就是我为你准备的一切......

于 2008-10-30T15:50:24.803 回答
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
于 2008-10-30T17:04:10.427 回答