Outlook有一个让我非常闹心的地方,虽然有对话视图,但是Outlook对于判断收到的邮件是否属于同一对话,是很难以琢磨的。据说不是以邮件主题为判断依据,而是以邮件header部分的ConversationIndex作为依据。但是有时候非Outlook客户端回复的邮件会直接忽略到这个参数。 另外,我自己用ios邮件客户端回复的邮件, 有时候也不能归到同一对话下。
忍了很久之后,决定解决这个问题。 由于无法修改别人使用的客户端,只能想办法把收到的邮件合并到正确的对话中。 又在google中进行了一番学习。基本上看完全网相关的内容之后,找到了似乎是唯一的解决办法: 用VBA配合私有的Redemption库才能解决。具体如下:
第一步是注册 Redemption库 。
在 Redemption 主页上可以免费下载到Developer Version。在公司电脑上注册也不用管理员权限,笑眯眯。
然后在Outlook中打开 Visual Basic Editor(按Alt+F11),在 Tools, References 里面勾选上Redemption库。
第二步,宏代码
Sub AddToConversation()
On Error GoTo ErrHnd:
Dim oNS As Object
Dim oRDOSess As Object
Dim oRDOItem As Object
Dim sEntryID As String
Dim sStoreID As String
Dim lNumMsgs As Long
Set oRDOSess = CreateObject("Redemption.RDOSession")
Set oNS = Nothing
Set oNS = Outlook.GetNamespace("MAPI")
oNS.Logon
oRDOSess.MAPIOBJECT = oNS.MAPIOBJECT
lNumMsgs = Outlook.ActiveExplorer.Selection.Count
If lNumMsgs < 2 Then
MsgBox ("To add messages to a conversation, first select a message then select the target conversation and run this macro.")
GoTo ErrHnd:
End If
For i = 1 To (lNumMsgs - 1)
With Outlook.ActiveExplorer.Selection(i)
strEntryID = .EntryID
strStoreID = .Parent.StoreID
End With
Set objRDOItem = oRDOSess.GetMessageFromID(strEntryID, strStoreID)
objRDOItem.ConversationTopic = Outlook.ActiveExplorer.Selection.Item(lNumMsgs).ConversationTopic
' 以下这句是因为Outlook 2016开始用ConversationIndex来判断对话
objRDOItem.ConversationIndex = Outlook.ActiveExplorer.Selection.Item(lNumMsgs).ConversationIndex
objRDOItem.Save
Next i
ErrHnd:
Set oNS = Nothing
Set oRDOSess = Nothing
Set objRDOItem = Nothing
Set strEntryID = Nothing
Set strStoreID = Nothing
lNumMsgs = 0
End Sub
第三部,使用方法
先选中落单的邮件,然后按住ctrl选中原对话,然后运行这个宏。OK,就是这么简单。
Reference: https://www.slipstick.com/developer/code-samples/merge-split-conversations/