[英]Outlook VBA - Move only emails from conversation that are still in inbox
[英]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.