【问题标题】:Outlook Redemption : GetNamesFromIDsOutlook 兑换:GetNamesFromIDs
【发布时间】:2008-10-30 15:24:27
【问题描述】:

我正在尝试从 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

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

【问题讨论】:

  • 如果成功的话,投赞成票会很好。 :-)
  • 绝对!感谢您对此进行调查——我真的很感激。
  • 酷! :-) 这是一些难以获得的信息,谷歌搜索并没有真正帮助。但这确实是一个很好的问题,所以我也可以轻松地为此 +1。

标签: vb.net outlook mapi outlook-redemption


【解决方案1】:

我想我明白了。我只使用过 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

输出中的第一个 sn-p:

8041001E      (             urn:content-classes:message )
    GUID:     {00020386-0000-0000-C000-000000000046}
      ID:     content-class

【讨论】:

    【解决方案2】:

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

    查看this exchange(确保通读所有后续回复),并没有更多信息(事实上,我认为 Outlook MVP 曾在某一时刻输入GetNamesFromIDs,而他的意思是GetIDsFromNames )。

    您可以尝试使用GetIDsFromNames 查看返回的内容,然后将其传递给GetNamesFromIDs

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2021-05-22
      相关资源
      最近更新 更多