调用Graph API读取自定义邮件文件夹报ID malformed错误咨询
问题结论
- 必须对
Get-MailboxFolderStatistics返回的FolderId做格式转换,否则一定会触发ErrorInvalidIdMalformed错误。 - 存在可直接运行的PowerShell转换命令,不需要额外安装依赖。
错误原因
Get-MailboxFolderStatistics返回的FolderId是MAPI层使用的十六进制编码EntryID格式,而Microsoft Graph的/mailFolders接口要求传入的是Base64URL编码的REST格式ID,两种格式不兼容,直接传入就会报ID格式非法。
可用转换命令
将你查询到的原始FolderId替换到以下脚本的对应变量中,执行后输出的结果就是可以直接给Graph接口使用的合法FolderId:
# 替换为Get-MailboxFolderStatistics查询到的原始FolderId值 $rawMapiFolderId = "此处填入你拿到的原始FolderId" $folderIdBytes = [byte[]]::new($rawMapiFolderId.Length / 2) for ($i = 0; $i -lt $folderIdBytes.Length; $i++) { $folderIdBytes[$i] = [Convert]::ToByte($rawMapiFolderId.Substring($i * 2, 2), 16) } # 转换为Graph要求的Base64URL格式 $graphCompatibleFolderId = [Convert]::ToBase64String($folderIdBytes).TrimEnd('=').Replace('+', '-').Replace('/', '_') # 输出可直接使用的ID $graphCompatibleFolderId
替代方案(无需转换ID)
如果不想做格式转换,可以直接通过文件夹路径遍历的方式获取合法ID:
- 已知自定义文件夹的父文件夹(比如收件箱Inbox),先调用
GET /users/mailbox@server.com/mailFolders/Inbox/childFolders?$select=id,displayName拿到收件箱下所有一级子文件夹的ID和名称 - 如果是更深层级的文件夹,继续在对应子文件夹下调用
childFolders接口逐层查询即可,返回的id字段可以直接用来构造查询邮件的请求。
注意:不要尝试直接对原始MAPI格式的FolderId做URL编码后传入接口,URL编码无法解决底层格式不匹配的问题,依然会返回ID格式错误。
内容的提问来源于stack exchange,提问作者PhDJ
相关产品推荐
相关产品推荐

