Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(PowerShell) Outlook -- Search Multiple FoldersI don't yet see how it's possible to do a recursive search of Outlook folders using the Microsoft Graph API. My best guess is to somehow use OData v4.0's $expand query option, but the hierarchical structure of the "mailFolder" and "messages" Microsoft Graph resources don't quite fit. Suggestions are welcome and can be sent to support@chilkatsoft.com. This example will iterate over a list of folder previously obtained by a recursive traversal of the Outlook mail folders. (See the link in the example code below.) A separate search is performed on each desired folder, and the results are combined into a single result set. Note: This example requires Chilkat v9.5.0.68 or greater. This example applies to: Exchange Online | Office 365 | Hotmail.com | Live.com | MSN.com | Outlook.com | Passport.com
Add-Type -Path "C:\chilkat\ChilkatDotNet47-9.5.0-x64\ChilkatDotNet47.dll" # This example requires the Chilkat API to have been previously unlocked. # See Global Unlock Sample for sample code. $http = New-Object Chilkat.Http # Use your previously obtained access token here: # See the following examples for getting an access token: # Get Microsoft Graph OAuth2 Access Token (Azure AD v2.0 Endpoint). # Get Microsoft Graph OAuth2 Access Token (Azure AD Endpoint). # Refresh Access Token (Azure AD v2.0 Endpoint). # Refresh Access Token (Azure AD Endpoint). $http.AuthToken = "MICROSOFT_GRAPH_ACCESS_TOKEN" # This example will iterate over the folders previously discovered by recursively traversing the Outlook folders # as shown in this example: Outlook Recursive Folder Traversal) # The XML map produced by the recursive traversal looks like this: # <?xml version="1.0" encoding="utf-8"?> # <hashtable> # <e><k>/Sent Items</k><v>AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEJAAAA</v></e> # <e><k>/Inbox</k><v>AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEMAAAA</v></e> # <e><k>/Junk Email</k><v>AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEiAAAA</v></e> # <e><k>/Inbox/xyz</k><v>AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwEAAAA=</v></e> # <e><k>/Inbox/abc/subFolderA/a</k><v>AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwIAAAA=</v></e> # <e><k>/Inbox/abc</k><v>AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huv8AAAA=</v></e> # <e><k>/Outbox</k><v>AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgELAAAA</v></e> # <e><k>/Inbox/abc/subFolderA</k><v>AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwAAAQ==</v></e> # <e><k>/Inbox/abc/subFolderB</k><v>AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwMAAAA=</v></e> # <e><k>/Archive</k><v>AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAG8XunwAAAA=</v></e> # <e><k>/Deleted Items</k><v>AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEKAAAA</v></e> # <e><k>/Drafts</k><v>AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEPAAAA</v></e> # </hashtable> # We'll iterate over the folders, and search all folders beginning with "/Inbox" (effectively, we're recursively searching # everything under Inbox) $xmlMap = New-Object Chilkat.Xml $success = $xmlMap.LoadXmlFile("qa_data/outlook/folderMap.xml") if ($success -ne $true) { $("Failed to load XML folder map.") exit } # We're going to return just the message id, subject, and FROM name/address. $http.SetUrlVar("select","id,subject,from") # Our search will be for emails with the word "sample" in the subject. $http.SetUrlVar("filter","contains(subject,'sample')") $json = New-Object Chilkat.JsonObject $json.EmitCompact = $false $jsonCombined = New-Object Chilkat.JsonObject $jsonCombined.EmitCompact = $false $sbResponse = New-Object Chilkat.StringBuilder $sbPath = New-Object Chilkat.StringBuilder $numFolders = $xmlMap.NumChildren $i = 0 $j = 0 $k = 0 while ($i -lt $numFolders) { $xmlMap.I = $i $sbPath.SetString($xmlMap.GetChildContent("e[i]|k")) if ($sbPath.StartsWith("/Inbox",$true) -eq $true) { $("------------------------------------------------------------------") $("Searching " + $sbPath.GetAsString()) # Search this mail folder.. $http.SetUrlVar("folder_id",$xmlMap.GetChildContent("e[i]|v")) $sbResponse.Clear() $success = $http.QuickGetSb("https://graph.microsoft.com/v1.0/me/mailFolders/{$folder_id}/messages?$filter={$filter}&$select={$select}",$sbResponse) if (($success -ne $true) -and ($http.LastStatus -eq 0)) { $($http.LastErrorText) exit } $json.LoadSb($sbResponse) if ($http.LastStatus -ne 200) { $("HTTP response status = " + $http.LastStatus) $($json.Emit()) $("Failed.") exit } $($json.Emit()) # Each mail folder search will return JSON with a value array, which is non-empty if any matching messages were found: # { # "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('me')/mailFolders('AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEMAAAA')/messages(id,subject,from)", # "value": [ # Individual messages, if any, are listed here. # ] # } $numMessages = $json.SizeOfArray("value") $j = 0 while ($j -lt $numMessages) { $json.J = $j # Add this message to the final result set. $jsonCombined.K = $k $jsonCombined.UpdateString("value[k].folderPath",$sbPath.GetAsString()) $jsonCombined.UpdateString("value[k].id",$json.StringOf("value[j].id")) $jsonCombined.UpdateString("value[k].subject",$json.StringOf("value[j].subject")) $jsonCombined.UpdateString("value[k].from.emailAddress.name",$json.StringOf("value[j].from.emailAddress.name")) $jsonCombined.UpdateString("value[k].from.emailAddress.address",$json.StringOf("value[j].from.emailAddress.address")) $k = $k + 1 $j = $j + 1 } } $i = $i + 1 } # Show the final combined JSON search result. $("------------------------------------------------------------------") $("Combined Search Results:") $($jsonCombined.Emit()) # Sample output for the above program: # ------------------------------------------------------------------ # Searching /Inbox # { # "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('me')/mailFolders('AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEMAAAA')/messages(id,subject,from)", # "value": [ # { # "@odata.etag": "W/\"CQAAABYAAADn68XtMop0TpsYJGpfKXY9AADOpwfr\"", # "id": "AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgBGAAADsVyfxjDU406Ic4X7ill8xAcA5_vF7TKKdE6bGCRqXyl2PQAAAgEMAAAA5_vF7TKKdE6bGCRqXyl2PQAAAM6Jj10AAAA=", # "subject": "A sample email with Amazon in the body", # "from": { # "emailAddress": { # "name": "Chilkat Software", # "address": "support@chilkatsoft.com" # } # } # } # ] # } # # ------------------------------------------------------------------ # Searching /Inbox/xyz # { # "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('me')/mailFolders('AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwEAAAA%3D')/messages(id,subject,from)", # "value": [ # ] # } # # ------------------------------------------------------------------ # Searching /Inbox/abc/subFolderA/a # { # "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('me')/mailFolders('AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwIAAAA%3D')/messages(id,subject,from)", # "value": [ # { # "@odata.etag": "W/\"CQAAABYAAADn68XtMop0TpsYJGpfKXY9AADOpzfb\"", # "id": "AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgBGAAADsVyfxjDU406Ic4X7ill8xAcA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwIAAADn68XtMop0TpsYJGpfKXY9AAAAzombFQAAAA==", # "subject": "Sample email from admin@chilkat.io", # "from": { # "emailAddress": { # "name": "Chilkat Software", # "address": "admin@chilkat.io" # } # } # } # ] # } # # ------------------------------------------------------------------ # Searching /Inbox/abc # { # "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('me')/mailFolders('AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huv8AAAA%3D')/messages(id,subject,from)", # "value": [ # ] # } # # ------------------------------------------------------------------ # Searching /Inbox/abc/subFolderA # { # "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('me')/mailFolders('AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwAAAQ%3D%3D')/messages(id,subject,from)", # "value": [ # ] # } # # ------------------------------------------------------------------ # Searching /Inbox/abc/subFolderB # { # "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('me')/mailFolders('AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwMAAAA%3D')/messages(id,subject,from)", # "value": [ # ] # } # # ------------------------------------------------------------------ # Combined Search Results: # { # "value": [ # { # "folderPath": "/Inbox", # "id": "AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgBGAAADsVyfxjDU406Ic4X7ill8xAcA5_vF7TKKdE6bGCRqXyl2PQAAAgEMAAAA5_vF7TKKdE6bGCRqXyl2PQAAAM6Jj10AAAA=", # "subject": "A sample email with Amazon in the body", # "from": { # "emailAddress": { # "name": "Chilkat Software", # "address": "support@chilkatsoft.com" # } # } # }, # { # "folderPath": "/Inbox/abc/subFolderA/a", # "id": "AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgBGAAADsVyfxjDU406Ic4X7ill8xAcA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwIAAADn68XtMop0TpsYJGpfKXY9AAAAzombFQAAAA==", # "subject": "Sample email from admin@chilkat.io", # "from": { # "emailAddress": { # "name": "Chilkat Software", # "address": "admin@chilkat.io" # } # } # } # ] # } # |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.