我可以通过VBA修改Outlook中的对话ID以对独立的电子邮件进行分组吗?

Vol*_*ker 11 outlook vba outlook-vba

我确实收到了各种机器人发送的大量邮件.我可以通过主题轻松识别电子邮件(例如:"对故障单123的响应").不幸的是,每封电子邮件都是自动生成的

对于此Outlook,不会将它们组合为普通会话.

我想知道是否可以修改例如邮件属性"ConversationID"?我是否需要创建"ConversationTopic"并将其分配给相关的MailItems?

Han*_*obo 5

通过使用Redemption获得对 ConversationTopic 和 ConversationIndex 的 MAPI 属性的写访问权限,我能够自己解决这个问题。

虽然显然 ConversationTopic 首先用于对消息进行分组,但 ConversationIndex 在分组中也起作用:它不仅携带排序时间戳,而且第一个字节是一个对话代码,必须在对话的所有电子邮件中匹配。否则,即使主题相同,它们仍然没有分组。有关详细信息,请参见此处:https : //msdn.microsoft.com/en-us/library/ms528174(v=exchg.10).aspx

幸运的是,将 Index 设置为 Null 显然使 Outlook 只关注主题,因此我们不需要重新计算新的索引。

我的工作代码:

Dim oNS As Object
Dim oRDOSess As Object
Dim oRDOItem As Object

Debug.Print "Creating Redemption Object ..."
' This requires: http://www.dimastr.com/redemption/download.htm
Set oRDOSess = CreateObject("Redemption.RDOSession")
Set oNS = Nothing
Set oNS = Outlook.GetNamespace("MAPI")
oNS.Logon
oRDOSess.MAPIOBJECT = oNS.MAPIOBJECT

Set oRDOItem = oRDOSess.GetMessageFromID(incomingMail.EntryID, incomingMail.Parent.StoreID)

Debug.Print "Trying to change conversation topic ..."
oRDOItem.ConversationTopic = incomingMail.Subject

Debug.Print "Trying to change conversation index ..."
oRDOItem.Fields("http://schemas.microsoft.com/mapi/proptag/0x00710102") = Null

Debug.Print "Saving modified mail item ..."
oRDOItem.Save
Run Code Online (Sandbox Code Playgroud)


Opi*_*Dad 4

编辑:评论中的每个用户 Glen K 缺少的部分是在更新后保存消息。我已将此保存添加到代码中,如前所述,但没有时间对此进行测试。添加后,这将是一个完整的答案,但由于它未经测试,我将保留原始帖子,包括评论指出它并不完全有效,唯一的更改是更新的保存。

这不是一个完整的答案,但对于评论来说太长了。

我能够使用此处的提示和代码设置 MAPI对话主题和对话索引属性:

 oItem.propertyAccessor.SetProperty "http://schemas.microsoft.com/mapi/proptag/0x00710102", _
             oItem2.propertyAccessor.GetProperty("http://www.slipstick.com/developer/read-mapi-properties-exposed-outlooks-object-model/")
Run Code Online (Sandbox Code Playgroud)

例如,对于 ConversationIndex 属性。这假设您有一条消息为 oItem,另一条消息为 oItem2,两者都声明为对象。请注意,此属性是二进制的,因此如果您想查看它,可以使用:

 oItem2.propertyAccessor.BinaryToString(x)
Run Code Online (Sandbox Code Playgroud)

其中 x 代表属性(设置为变量或仅将 propertyAccessor.GetProperty 代码放入其中)。这变得相关,因为消息对象的 ConversationID 是 MAPI ConversationIndex 属性的最后一堆“字符/二进制位”。但是,更改 ConversationIndex 属性不会更改 ConversationID。

消息对象的ConversationIndex 和conversationTopic 属性都是只读的,但是更改conversationTopic MAPI 属性确实会更改消息的ConversationTopic 属性。然而,我无法让它真正对消息进行分组。

我的研究表明 ConversationTopic 属性应该是最初对消息进行分组的属性,ConversationIndex 属性在分组后对它们进行排序,但是,正如我所提到的,即使在将相同的 ConversationTopic 分配给MAPI 和消息对象。

以下代码有助于展示此行为:

Dim Msg As Outlook.MailItem
Dim oItem As Object
Dim oItem2 As Object
Dim objNS As Outlook.NameSpace
Dim olFolder As Outlook.MAPIFolder
Dim Item As Object

Set objNS = GetNamespace("MAPI")
Set olFolder = objNS.GetDefaultFolder(olFolderInbox)


For Each Item In olFolder.Items
    If TypeName(Item) = "MailItem" Then
        Debug.Print "Subject: " & Item.Subject & " " & Item.propertyAccessor.BinaryToString(Item.propertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x00710102"))
    
        If Item.Subject = "test" Then
            Set oItem = Item
        ElseIf Item.Subject = "test2" Then
            Set oItem2 = Item
        End If
    End If
Next Item

Debug.Print "OItem: " & vbCr _
            & "ConversationIndex: " & oItem.ConversationIndex & vbCr _
            & "ConversationID: " & oItem.ConversationID & vbCr _
            & "ConversationTopic: " & oItem.ConversationTopic & vbCr _
            & "MAPI ConversationIndex: " & oItem.propertyAccessor.BinaryToString(oItem.propertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x00710102")) & vbCr _
            & "MAPI ConversationTopic: " & oItem.propertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x0070001E") & vbCr
            

Debug.Print "OItem2: " & vbCr _
            & "ConversationIndex: " & oItem2.ConversationIndex & vbCr _
            & "ConversationID: " & oItem2.ConversationID & vbCr _
            & "ConversationTopic: " & oItem2.ConversationTopic & vbCr _
            & "MAPI ConversationIndex: " & oItem2.propertyAccessor.BinaryToString(oItem2.propertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x00710102")) & vbCr _
            & "MAPI ConversationTopic: " & oItem2.propertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x0070001E") & vbCr
            
Debug.Print "Set OItem2 To OItem"

oItem2.propertyAccessor.SetProperty "http://schemas.microsoft.com/mapi/proptag/0x0070001E", oItem.ConversationTopic
oItem2.propertyAccessor.SetProperty "http://schemas.microsoft.com/mapi/proptag/0x00710102", oItem.propertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x00710102")
oItem2.save

Debug.Print "OItem: " & vbCr _
            & "ConversationIndex: " & oItem.ConversationIndex & vbCr _
            & "ConversationID: " & oItem.ConversationID & vbCr _
            & "ConversationTopic: " & oItem.ConversationTopic & vbCr _
            & "MAPI ConversationIndex: " & oItem.propertyAccessor.BinaryToString(oItem.propertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x00710102")) & vbCr _
            & "MAPI ConversationTopic: " & oItem.propertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x0070001E") & vbCr
            

Debug.Print "OItem2: " & vbCr _
            & "ConversationIndex: " & oItem2.ConversationIndex & vbCr _
            & "ConversationID: " & oItem2.ConversationID & vbCr _
            & "ConversationTopic: " & oItem2.ConversationTopic & vbCr _
            & "MAPI ConversationIndex: " & oItem2.propertyAccessor.BinaryToString(oItem2.propertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x00710102")) & vbCr _
            & "MAPI ConversationTopic: " & oItem2.propertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x0070001E") & vbCr
Run Code Online (Sandbox Code Playgroud)

分享这个以防它可以帮助任何人解决问题。