繁体   English   中英

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

[英]Can I modify Conversation ID in Outlook by VBA to group independent Emails?

我确实收到了很多由各种机器人发送的邮件。 我可以通过主题轻松识别电子邮件(例如:“对工单 123 的响应”)。 不幸的是,每封电子邮件都是单独自动生成的。

为此,Outlook 不会像普通对话那样将它们分组。

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

通过使用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

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

我能够使用此处的提示和代码设置 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/")

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

 oItem2.propertyAccessor.BinaryToString(x)

其中 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")

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM