'VSTO - Outlook how to trace email from Message ID
I'm developing a VSTO add-in for Outlook, Now I get a bounce back email, which included message ID. How can I trace the original email from this message ID in VSTO program?
Solution 1:[1]
You can search for PR_INTERNET_MESSAGE_ID property value. The DASL name of the property is http://schemas.microsoft.com/mapi/proptag/0x1035001F.
Use the Find/FindNext or Restrict methods of the Items class. The Restrict method is an alternative to using the Find method or FindNext method to iterate over specific items within a collection. The Find or FindNext methods are faster than filtering if there are a small number of items. The Restrict method is significantly faster if there is a large number of items in the collection, especially if only a few items in a large collection are expected to be found.
But if you need to find items from multiple folders I'd recommend using the AdvancedSearch method instead:
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
Solution 2:[2]
As Eugene mentioned, you need to search for the sent message based on the PR_INTERNET_MESSAGE_ID property. No reason to use Items.Restrict or even Find/FindNext - since you are expecting a single match (unless something is really wrong with your mailbox), a single call to Items.Find is all your need.
Also keep in mind that in the cached Exchange mode PR_INTERNET_MESSAGE_ID will not be set on the items in the Sent Items folder. To work round that, you'd need to open the Sent Items folder in the online mode (you can do that using Extended MAPI in C++/Delphi or Redemption (I am its author) in any language.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Eugene Astafiev |
| Solution 2 |
