DataFlex
DataFlex
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 DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoHttp
Handle hoFolderMap
Variant vSbResponse
Handle hoSbResponse
Handle hoJson
Handle hoIdQueue
Handle hoSbFolderPath
Handle hoSbQueueEntry
String sFolderName
String sFolderPath
String sFolderId
Integer i
Integer iNumFolders
String sParentFolderPath
String sParentFolderId
Variant vSbFolderMapXml
Handle hoSbFolderMapXml
Handle hoHt2
Variant vSb2
Handle hoSb2
String sTemp1
Integer iTemp1
Move False To iSuccess
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
Get Create (RefClass(cComChilkatHttp)) To hoHttp
If (Not(IsComObjectCreated(hoHttp))) Begin
Send CreateComObject of hoHttp
End
// Our folder path --> ID map will be stored in this hash table.
Get Create (RefClass(cComChilkatHashtable)) To hoFolderMap
If (Not(IsComObjectCreated(hoFolderMap))) Begin
Send CreateComObject of hoFolderMap
End
// 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).
Set ComAuthToken Of hoHttp To "MICROSOFT_GRAPH_ACCESS_TOKEN"
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbResponse
If (Not(IsComObjectCreated(hoSbResponse))) Begin
Send CreateComObject of hoSbResponse
End
// Begin by getting the top-level folders.
Send ComClearUrlVars To hoHttp
Get ComSetUrlVar Of hoHttp "userPrincipalName" "chilkatsoft@outlook.com" To iSuccess
Get pvComObject of hoSbResponse to vSbResponse
Get ComQuickGetSb Of hoHttp "https://graph.microsoft.com/v1.0/users/{$userPrincipalName}/mailFolders" vSbResponse To iSuccess
Get ComLastStatus Of hoHttp To iTemp1
If ((iSuccess <> True) And (iTemp1 = 0)) Begin
Get ComLastErrorText Of hoHttp To sTemp1
Showln sTemp1
Procedure_Return
End
Get Create (RefClass(cComChilkatJsonObject)) To hoJson
If (Not(IsComObjectCreated(hoJson))) Begin
Send CreateComObject of hoJson
End
Get pvComObject of hoSbResponse to vSbResponse
Get ComLoadSb Of hoJson vSbResponse To iSuccess
Set ComEmitCompact Of hoJson To False
Get ComLastStatus Of hoHttp To iTemp1
Showln "Status code = " iTemp1
Get ComLastStatus Of hoHttp To iTemp1
If (iTemp1 <> 200) Begin
Get ComEmit Of hoJson To sTemp1
Showln sTemp1
Showln "Failed."
End
// 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.
Get Create (RefClass(cComCkStringArray)) To hoIdQueue
If (Not(IsComObjectCreated(hoIdQueue))) Begin
Send CreateComObject of hoIdQueue
End
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbFolderPath
If (Not(IsComObjectCreated(hoSbFolderPath))) Begin
Send CreateComObject of hoSbFolderPath
End
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbQueueEntry
If (Not(IsComObjectCreated(hoSbQueueEntry))) Begin
Send CreateComObject of hoSbQueueEntry
End
// Prime the map and idQueue with the top-level folders.
Move 0 To i
Get ComSizeOfArray Of hoJson "value" To iNumFolders
While (i < iNumFolders)
Set ComI Of hoJson To i
Get ComStringOf Of hoJson "value[i].displayName" To sFolderName
Get ComStringOf Of hoJson "value[i].id" To sFolderId
Get ComSetString Of hoSbFolderPath "/" To iSuccess
Get ComAppend Of hoSbFolderPath sFolderName To iSuccess
Get ComGetAsString Of hoSbFolderPath To sFolderPath
Get ComAddStr Of hoFolderMap sFolderPath sFolderId To iSuccess
Showln sFolderPath " --> " sFolderId
// Push the folder path + id onto the idQueue.
Send ComClear To hoSbQueueEntry
Get ComSetNth Of hoSbQueueEntry 0 sFolderPath "|" False False To iSuccess
Get ComSetNth Of hoSbQueueEntry 1 sFolderId "|" False False To iSuccess
Get ComGetAsString Of hoSbQueueEntry To sTemp1
Get ComAppend Of hoIdQueue sTemp1 To iSuccess
Move (i + 1) To i
Loop
// 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.
While ((ComLength(hoIdQueue)) > 0)
Get ComGetString Of hoIdQueue 0 To sTemp1
Get ComSetString Of hoSbQueueEntry sTemp1 To iSuccess
Get ComRemoveAt Of hoIdQueue 0 To iSuccess
Get ComGetNth Of hoSbQueueEntry 0 "|" False False To sParentFolderPath
Get ComGetNth Of hoSbQueueEntry 1 "|" False False To sParentFolderId
Get ComSetUrlVar Of hoHttp "id" sParentFolderId To iSuccess
Get pvComObject of hoSbResponse to vSbResponse
Get ComQuickGetSb Of hoHttp "https://graph.microsoft.com/v1.0/users/{$userPrincipalName}/mailFolders/{$id}/childFolders" vSbResponse To iSuccess
Get ComLastStatus Of hoHttp To iTemp1
If ((iSuccess <> True) And (iTemp1 = 0)) Begin
Get ComLastErrorText Of hoHttp To sTemp1
Showln sTemp1
Procedure_Return
End
Get pvComObject of hoSbResponse to vSbResponse
Get ComLoadSb Of hoJson vSbResponse To iSuccess
Get ComLastStatus Of hoHttp To iTemp1
If (iTemp1 <> 200) Begin
Get ComLastStatus Of hoHttp To iTemp1
Showln "Status code = " iTemp1
Get ComEmit Of hoJson To sTemp1
Showln sTemp1
Showln "Failed."
End
Move 0 To i
Get ComSizeOfArray Of hoJson "value" To iNumFolders
While (i < iNumFolders)
Set ComI Of hoJson To i
Get ComStringOf Of hoJson "value[i].displayName" To sFolderName
Get ComStringOf Of hoJson "value[i].id" To sFolderId
Get ComSetString Of hoSbFolderPath sParentFolderPath To iSuccess
Get ComAppend Of hoSbFolderPath "/" To iSuccess
Get ComAppend Of hoSbFolderPath sFolderName To iSuccess
Get ComGetAsString Of hoSbFolderPath To sFolderPath
Get ComAddStr Of hoFolderMap sFolderPath sFolderId To iSuccess
Showln sFolderPath " --> " sFolderId
// Push the folder path + id onto the idQueue.
Send ComClear To hoSbQueueEntry
Get ComSetNth Of hoSbQueueEntry 0 sFolderPath "|" False False To iSuccess
Get ComSetNth Of hoSbQueueEntry 1 sFolderId "|" False False To iSuccess
Get ComGetAsString Of hoSbQueueEntry To sTemp1
Get ComAppend Of hoIdQueue sTemp1 To iSuccess
Move (i + 1) To i
Loop
Loop
// The hash table of mail folder paths --> ID's can be persisted to XML and saved to a file or database (or anywhere..)
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbFolderMapXml
If (Not(IsComObjectCreated(hoSbFolderMapXml))) Begin
Send CreateComObject of hoSbFolderMapXml
End
Get pvComObject of hoSbFolderMapXml to vSbFolderMapXml
Get ComToXmlSb Of hoFolderMap vSbFolderMapXml To iSuccess
Get ComWriteFile Of hoSbFolderMapXml "qa_data/outlook/folderMap.xml" "utf-8" False To iSuccess
// The hash table can be restored from the serialized XML like this:
Get Create (RefClass(cComChilkatHashtable)) To hoHt2
If (Not(IsComObjectCreated(hoHt2))) Begin
Send CreateComObject of hoHt2
End
Get Create (RefClass(cComChilkatStringBuilder)) To hoSb2
If (Not(IsComObjectCreated(hoSb2))) Begin
Send CreateComObject of hoSb2
End
Get ComLoadFile Of hoSb2 "qa_data/outlook/folderMap.xml" "utf-8" To iSuccess
Get pvComObject of hoSb2 to vSb2
Get ComAddFromXmlSb Of hoHt2 vSb2 To iSuccess
// What's the ID for the folder "/Inbox/abc/subFolderA" ?
Get ComLookupStr Of hoHt2 "/Inbox/abc/subFolderA" To sTemp1
Showln "id for /Inbox/abc/subFolderA = " sTemp1
// 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.
End_Procedure