我正在为Outlook开发VSTO加载项,现在,我收到一封包含邮件ID的退回电子邮件。如何在VSTO程序中从此消息ID跟踪原始电子邮件?
您可以搜索PR_INTERNET_MESSAGE_ID
属性值。该属性的DASL名称为http://schemas.microsoft.com/mapi/proptag/0x1035001F
。
使用Find
类的FindNext
/ Restrict
或Items
方法。 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中的Extended MAPI或任何语言的Redemption来执行此操作。)>