Vol*_*ker 11 outlook vba outlook-vba
我确实收到了各种机器人发送的大量邮件.我可以通过主题轻松识别电子邮件(例如:"对故障单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
Run Code Online (Sandbox Code Playgroud)
编辑:评论中的每个用户 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)
分享这个以防它可以帮助任何人解决问题。
| 归档时间: |
|
| 查看次数: |
1679 次 |
| 最近记录: |