AutoIt
AutoIt
Outlook -- Create Map of Folder Paths to IDs
See more Outlook Examples
Recursively descends folders and creates a hashtable of folder paths to IDs. This can be done once at the start of your program (or even less if the map is persisted to a file or database).The reason this is necessary is because folder ID's need to be passed to the Outlook API, and an application will typically be working with folder paths.
Note: This example requires Chilkat v9.5.0.67 or greater.
This example applies to: Exchange Online | Office 365 | Hotmail.com | Live.com | MSN.com | Outlook.com | Passport.com
Chilkat AutoIt Downloads
Local $bSuccess = False
; This example requires the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.
$oHttp = ObjCreate("Chilkat.Http")
; Our folder path --> ID map will be stored in this hash table.
$oFolderMap = ObjCreate("Chilkat.Hashtable")
; 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).
$oHttp.AuthToken = "MICROSOFT_GRAPH_ACCESS_TOKEN"
$oSbResponse = ObjCreate("Chilkat.StringBuilder")
; Begin by getting the top-level folders.
$oHttp.ClearUrlVars
$oHttp.SetUrlVar("userPrincipalName","chilkatsoft@outlook.com")
$bSuccess = $oHttp.QuickGetSb("https://graph.microsoft.com/v1.0/users/{$userPrincipalName}/mailFolders",$oSbResponse)
If (($bSuccess <> True) And ($oHttp.LastStatus = 0)) Then
ConsoleWrite($oHttp.LastErrorText & @CRLF)
Exit
EndIf
$oJson = ObjCreate("Chilkat.JsonObject")
$oJson.LoadSb($oSbResponse)
$oJson.EmitCompact = False
ConsoleWrite("Status code = " & $oHttp.LastStatus & @CRLF)
If ($oHttp.LastStatus <> 200) Then
ConsoleWrite($oJson.Emit() & @CRLF)
ConsoleWrite("Failed." & @CRLF)
EndIf
; This is our queue/stack of unprocessed folder ID's
; The recursive nature of this example is that we get the
; child folders for each folder ID in the idQueue, which may
; cause additional ID's to be added. We continue until the idQueue
; is empty.
$oIdQueue = ObjCreate("Chilkat.StringArray")
$oSbFolderPath = ObjCreate("Chilkat.StringBuilder")
$oSbQueueEntry = ObjCreate("Chilkat.StringBuilder")
Local $sFolderName
Local $sFolderPath
Local $sFolderId
; Prime the map and idQueue with the top-level folders.
Local $i = 0
Local $iNumFolders = $oJson.SizeOfArray("value")
While $i < $iNumFolders
$oJson.I = $i
$sFolderName = $oJson.StringOf("value[i].displayName")
$sFolderId = $oJson.StringOf("value[i].id")
$oSbFolderPath.SetString("/")
$oSbFolderPath.Append($sFolderName)
$sFolderPath = $oSbFolderPath.GetAsString()
$oFolderMap.AddStr($sFolderPath,$sFolderId)
ConsoleWrite($sFolderPath & " --> " & $sFolderId & @CRLF)
; Push the folder path + id onto the idQueue.
$oSbQueueEntry.Clear
$oSbQueueEntry.SetNth(0,$sFolderPath,"|",False,False)
$oSbQueueEntry.SetNth(1,$sFolderId,"|",False,False)
$oIdQueue.Append($oSbQueueEntry.GetAsString())
$i = $i + 1
Wend
; Initial output:
; /Archive --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAG8XunwAAAA=
; /Deleted Items --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEKAAAA
; /Drafts --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEPAAAA
; /Inbox --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEMAAAA
; /Junk Email --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEiAAAA
; /Outbox --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgELAAAA
; /Sent Items --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEJAAAA
;
; Process the idQueue until it becomes empty. This is the recursive loop.
Local $sParentFolderPath
Local $sParentFolderId
While $oIdQueue.Length > 0
$oSbQueueEntry.SetString($oIdQueue.GetString(0))
$oIdQueue.RemoveAt(0)
$sParentFolderPath = $oSbQueueEntry.GetNth(0,"|",False,False)
$sParentFolderId = $oSbQueueEntry.GetNth(1,"|",False,False)
$oHttp.SetUrlVar("id",$sParentFolderId)
$bSuccess = $oHttp.QuickGetSb("https://graph.microsoft.com/v1.0/users/{$userPrincipalName}/mailFolders/{$id}/childFolders",$oSbResponse)
If (($bSuccess <> True) And ($oHttp.LastStatus = 0)) Then
ConsoleWrite($oHttp.LastErrorText & @CRLF)
Exit
EndIf
$oJson.LoadSb($oSbResponse)
If ($oHttp.LastStatus <> 200) Then
ConsoleWrite("Status code = " & $oHttp.LastStatus & @CRLF)
ConsoleWrite($oJson.Emit() & @CRLF)
ConsoleWrite("Failed." & @CRLF)
EndIf
$i = 0
$iNumFolders = $oJson.SizeOfArray("value")
While $i < $iNumFolders
$oJson.I = $i
$sFolderName = $oJson.StringOf("value[i].displayName")
$sFolderId = $oJson.StringOf("value[i].id")
$oSbFolderPath.SetString($sParentFolderPath)
$oSbFolderPath.Append("/")
$oSbFolderPath.Append($sFolderName)
$sFolderPath = $oSbFolderPath.GetAsString()
$oFolderMap.AddStr($sFolderPath,$sFolderId)
ConsoleWrite($sFolderPath & " --> " & $sFolderId & @CRLF)
; Push the folder path + id onto the idQueue.
$oSbQueueEntry.Clear
$oSbQueueEntry.SetNth(0,$sFolderPath,"|",False,False)
$oSbQueueEntry.SetNth(1,$sFolderId,"|",False,False)
$oIdQueue.Append($oSbQueueEntry.GetAsString())
$i = $i + 1
Wend
Wend
; The hash table of mail folder paths --> ID's can be persisted to XML and saved to a file or database (or anywhere..)
$oSbFolderMapXml = ObjCreate("Chilkat.StringBuilder")
$oFolderMap.ToXmlSb($oSbFolderMapXml)
$oSbFolderMapXml.WriteFile("qa_data/outlook/folderMap.xml","utf-8",False)
; The hash table can be restored from the serialized XML like this:
$oHt2 = ObjCreate("Chilkat.Hashtable")
$oSb2 = ObjCreate("Chilkat.StringBuilder")
$oSb2.LoadFile("qa_data/outlook/folderMap.xml","utf-8")
$oHt2.AddFromXmlSb($oSb2)
; What's the ID for the folder "/Inbox/abc/subFolderA" ?
ConsoleWrite("id for /Inbox/abc/subFolderA = " & $oHt2.LookupStr("/Inbox/abc/subFolderA") & @CRLF)
; Final output:
; /Archive --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAG8XunwAAAA=
; /Deleted Items --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEKAAAA
; /Drafts --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEPAAAA
; /Inbox --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEMAAAA
; /Junk Email --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEiAAAA
; /Outbox --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgELAAAA
; /Sent Items --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAgEJAAAA
; /Inbox/abc --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huv8AAAA=
; /Inbox/xyz --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwEAAAA=
; /Inbox/abc/subFolderA --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwAAAQ==
; /Inbox/abc/subFolderB --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwMAAAA=
; /Inbox/abc/subFolderA/a --> AQMkADAwATM0MDAAMS1iNTcwLWI2NTEtMDACLTAwCgAuAAADsVyfxjDU406Ic4X7ill8xAEA5_vF7TKKdE6bGCRqXyl2PQAAAL8huwIAAAA=
;
; ------------------------------------------------------------------------------------------------------
; This example applies to: Exchange Online | Office 365 | Hotmail.com | Live.com | MSN.com | Outlook.com | Passport.com
;
; The Microsoft Graph Outlook Mail API lets you read, create, and send messages and attachments,
; view and respond to event messages, and manage folders that are secured by Azure Active Directory
; in Office 365. It also provides the same functionality in Microsoft accounts specifically
; in these domains: Hotmail.com, Live.com, MSN.com, Outlook.com, and Passport.com.