From dcba4b99771f71b37d2f7f1ccd909d8e96198200 Mon Sep 17 00:00:00 2001 From: Schalli Date: Tue, 30 Jun 2026 10:23:30 +0200 Subject: [PATCH] fix(dkv): search msgfolderroot for EWS subfolder resolution FindFolder was searching only under inbox DistinguishedFolderId, missing folders at mailbox root level. Now searches msgfolderroot (full mailbox) so custom folders like DKV are found regardless of placement. Also adds HTTP status check and debug logging for FindFolder responses. Co-Authored-By: Claude Sonnet 4.6 --- .../dkv/providers/exchange-inbox.provider.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/apps/api/src/dkv/providers/exchange-inbox.provider.ts b/apps/api/src/dkv/providers/exchange-inbox.provider.ts index f8b9cb7..3997e29 100644 --- a/apps/api/src/dkv/providers/exchange-inbox.provider.ts +++ b/apps/api/src/dkv/providers/exchange-inbox.provider.ts @@ -276,7 +276,8 @@ export class ExchangeInboxProvider implements InboxProvider { /** Resolve folder config to a EWS ParentFolderIds XML element. * Well-known names → . - * Custom names (e.g. "DKV" or "INBOX/DKV") → FindFolder deep search under inbox → . + * Custom names (e.g. "DKV" or "INBOX/DKV") → FindFolder deep search under msgfolderroot → . + * Searches msgfolderroot (full mailbox) so folders at root level are found, not just inbox subfolders. */ private async resolveFolderElement(config: InboxConfig): Promise { const folderCfg = config.folder ?? 'INBOX'; @@ -286,14 +287,20 @@ export class ExchangeInboxProvider implements InboxProvider { if (distinguished) { return ``; } - // Custom subfolder: resolve via FindFolder - const ffSoap = findFolderSoap('inbox', displayName); + // Custom subfolder: search entire mailbox (msgfolderroot) so top-level folders are found too + const ffSoap = findFolderSoap('msgfolderroot', displayName); const ffRes = await this.ewsPost(config, ffSoap, 'FindFolder'); - const folderId = extractAttr(ffRes.body, 't:FolderId', 'Id'); - if (!folderId) { - this.logger.warn(`EWS FindFolder: subfolder "${displayName}" not found — falling back to inbox`); + if (ffRes.statusCode !== 200) { + this.logger.warn(`EWS FindFolder HTTP ${ffRes.statusCode} for "${displayName}" — falling back to inbox`); return ``; } + this.logger.debug(`EWS FindFolder response for "${displayName}": ${ffRes.body.slice(0, 500)}`); + const folderId = extractAttr(ffRes.body, 't:FolderId', 'Id'); + if (!folderId) { + this.logger.warn(`EWS FindFolder: subfolder "${displayName}" not found under msgfolderroot — falling back to inbox`); + return ``; + } + this.logger.log(`EWS FindFolder: resolved "${displayName}" → FolderId ${folderId.slice(0, 20)}…`); return ``; }