代码之家  ›  专栏  ›  技术社区  ›  Ryan Lanciaux

Outlook赎回:GetNamesFromIds

  •  1
  • Ryan Lanciaux  · 技术社区  · 16 年前

    我正在尝试从一个Outlook项目中获取所有属性名称/值。除了默认的Outlook项目属性外,我还有自定义属性。我正在使用redemption绕过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

    任何帮助或洞察都将不胜感激。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Tomalak    16 年前

    我想我明白了。我只使用了vba,所以您需要“考虑”它的局限性,它将遵循vb.net中的相同方案。

    函数签名如下:

    Function GetNamesFromIDs(MAPIProp As Unknown, PropTag As Long) As NamedProperty
    

    作为第一个参数,它需要一个支持 IUnknown 接口。查看兑换文档,很明显有一个名为 _MAPIProp ,从中派生许多其他RDO对象( IRDOMail 就在其中)。所以这一定是 RDOMail 您正在尝试从中获取数据。

    知道了这一点,它只需要从文档中得到一个其他微妙的提示就可以让它工作:

    给定一个prop标记(>=0x8000000), 返回已命名的 财产。

    所以属性标记必须是 >= 0x80000000 ,这意味着它不适用于所有属性,但仅适用于自定义属性(我想这是本例中的区别,如果我错了,请纠正我。)传递不满足此条件的属性标记会引发错误消息(0x8000ffff“意外结果”)。

    这是我的密码。它是vba,所以请原谅hex()的错误,因为vbas long integer溢出了这么大的数字。我相信你会拿到照片的。

    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
    
        2
  •  2
  •   Dave DuPlantis    16 年前

    嗯,关于背景资料,作者 suggests 使用类似 OutlookSpy 查看Outlook如何存储属性。

    看着 this exchange (一定要通读所有的后续回复),没有太多(事实上,我认为在某一点上,Outlook MVP类型 GetNamesFromIDs 当他意味着 GetIDsFromNames )

    你可以尝试使用 名字来源 看看它会返回什么,然后用它传递给 获得名字 .

    我以前用过赎罪法,但不是用这种特殊的方式,所以这就是我为你准备的……