VSTO - Outlook 如何从邮件 ID 跟踪电子邮件
VSTO - Outlook how to trace email from Message ID
我正在为 Outlook 开发 VSTO 加载项,
现在我收到一封退回邮件,其中包含邮件 ID。
如何在 VSTO 程序中根据此邮件 ID 跟踪原始电子邮件?
您可以搜索 PR_INTERNET_MESSAGE_ID
属性 值。 属性 的 DASL 名称是 http://schemas.microsoft.com/mapi/proptag/0x1035001F
。
使用 Items
class 的 Find
/FindNext
或 Restrict
方法。 Restrict
方法是使用 Find
方法或 FindNext
方法迭代集合中特定项目的替代方法。如果项目数量较少,Find
或 FindNext
方法比过滤更快。 Restrict
方法在集合中有大量项目时明显更快,尤其是在大型集合中只希望找到少数项目的情况下。
但如果您需要从多个文件夹中查找项目,我建议您改用 AdvancedSearch
方法:
Public m_SearchComplete As Boolean
Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
If SearchObject.Tag = "MySearch" Then
m_SearchComplete = True
End If
End Sub
Sub TestSearchForMultipleFolders()
Dim Scope As String
Dim Filter As String
Dim MySearch As Outlook.Search
Dim MyTable As Outlook.Table
Dim nextRow As Outlook.Row
m_SearchComplete = False
'Establish scope for multiple folders
Scope = "'" & Application.Session.GetDefaultFolder( _
olFolderInbox).FolderPath _
& "','" & Application.Session.GetDefaultFolder( _
olFolderSentMail).FolderPath & "'"
'Establish filter
If Application.Session.DefaultStore.IsInstantSearchEnabled Then
Filter = Chr(34) & "http://schemas.microsoft.com/mapi/proptag/0x1035001F" _
& Chr(34) & " ci_phrasematch 'MesssageID'"
Else
Filter = Chr(34) & "http://schemas.microsoft.com/mapi/proptag/0x1035001F" _
& Chr(34) & " like '%MessageID%'"
End If
Set MySearch = Application.AdvancedSearch( _
Scope, Filter, True, "MySearch")
While m_SearchComplete <> True
DoEvents
Wend
Set MyTable = MySearch.GetTable
Do Until MyTable.EndOfTable
Set nextRow = MyTable.GetNextRow()
Debug.Print nextRow("Subject")
Loop
End Sub
正如 Eugene 所说,您需要根据 PR_INTERNET_MESSAGE_ID
属性 搜索已发送的消息。没有理由使用 Items.Restrict
甚至 Find/FindNext
- 因为你期待一个单一的匹配(除非你的邮箱真的有问题),一个单一的调用 Items.Find
是你所需要的。
另请记住,在缓存 Exchange 模式下,PR_INTERNET_MESSAGE_ID
不会对“已发送邮件”文件夹中的邮件进行设置。要解决这个问题,您需要在在线模式下打开“已发送邮件”文件夹(您可以使用 C++/Delphi 或 Redemption(我是其作者)中的扩展 MAPI 以任何语言执行此操作.
我正在为 Outlook 开发 VSTO 加载项, 现在我收到一封退回邮件,其中包含邮件 ID。 如何在 VSTO 程序中根据此邮件 ID 跟踪原始电子邮件?
您可以搜索 PR_INTERNET_MESSAGE_ID
属性 值。 属性 的 DASL 名称是 http://schemas.microsoft.com/mapi/proptag/0x1035001F
。
使用 Items
class 的 Find
/FindNext
或 Restrict
方法。 Restrict
方法是使用 Find
方法或 FindNext
方法迭代集合中特定项目的替代方法。如果项目数量较少,Find
或 FindNext
方法比过滤更快。 Restrict
方法在集合中有大量项目时明显更快,尤其是在大型集合中只希望找到少数项目的情况下。
但如果您需要从多个文件夹中查找项目,我建议您改用 AdvancedSearch
方法:
Public m_SearchComplete As Boolean
Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
If SearchObject.Tag = "MySearch" Then
m_SearchComplete = True
End If
End Sub
Sub TestSearchForMultipleFolders()
Dim Scope As String
Dim Filter As String
Dim MySearch As Outlook.Search
Dim MyTable As Outlook.Table
Dim nextRow As Outlook.Row
m_SearchComplete = False
'Establish scope for multiple folders
Scope = "'" & Application.Session.GetDefaultFolder( _
olFolderInbox).FolderPath _
& "','" & Application.Session.GetDefaultFolder( _
olFolderSentMail).FolderPath & "'"
'Establish filter
If Application.Session.DefaultStore.IsInstantSearchEnabled Then
Filter = Chr(34) & "http://schemas.microsoft.com/mapi/proptag/0x1035001F" _
& Chr(34) & " ci_phrasematch 'MesssageID'"
Else
Filter = Chr(34) & "http://schemas.microsoft.com/mapi/proptag/0x1035001F" _
& Chr(34) & " like '%MessageID%'"
End If
Set MySearch = Application.AdvancedSearch( _
Scope, Filter, True, "MySearch")
While m_SearchComplete <> True
DoEvents
Wend
Set MyTable = MySearch.GetTable
Do Until MyTable.EndOfTable
Set nextRow = MyTable.GetNextRow()
Debug.Print nextRow("Subject")
Loop
End Sub
正如 Eugene 所说,您需要根据 PR_INTERNET_MESSAGE_ID
属性 搜索已发送的消息。没有理由使用 Items.Restrict
甚至 Find/FindNext
- 因为你期待一个单一的匹配(除非你的邮箱真的有问题),一个单一的调用 Items.Find
是你所需要的。
另请记住,在缓存 Exchange 模式下,PR_INTERNET_MESSAGE_ID
不会对“已发送邮件”文件夹中的邮件进行设置。要解决这个问题,您需要在在线模式下打开“已发送邮件”文件夹(您可以使用 C++/Delphi 或 Redemption(我是其作者)中的扩展 MAPI 以任何语言执行此操作.