使用Microsoft Graph Beta将EwsId转换为RestId/RestImmutableEntryId遇错求助
解决Microsoft Graph Beta中EwsId转RestImmutableEntryId失败的问题
看起来你遇到的核心问题是混淆了邮件的Internet Message-ID和Exchange EwsId,加上错误的ID处理方式导致了转换器报错。下面一步步帮你排查解决:
1. 先搞清楚两个关键ID的区别
你现在用的<someId@something.prod.outlook.com>是邮件的Internet Message-ID(邮件头里的标识),这和Exchange内部使用的EwsId完全不是一回事:
- EwsId是Exchange Web Services用来定位邮件的内部条目ID,格式是一段长Base64字符串(比如
AQMkADAwATM0MDAAMS1iNTcwLWI2NDMtMDACLTAwCgBGAAADs5KfUq...=) - 你传入的Message-ID是用来跨系统标识邮件的全局ID,但Graph的
translateExchangeIds接口不接受这个格式作为EwsId输入,所以才会抛出Invalid compression id错误。
2. 从.msg文件中提取正确的EwsId
你需要从.msg文件中获取PR_ENTRY_ID属性的值(对应Outlook Object Model里的MailItem.EntryID):
- 如果使用Outlook互操作库:直接读取
MailItem.EntryID,这个值就是现成的Base64格式EwsId - 如果用第三方库(比如MsgReader):读取
PR_ENTRY_ID的二进制数据,再转换成Base64字符串,这就是你需要的EwsId
3. 修正你的代码实现
现在把错误的ID替换成正确的EwsId,并且确保参数逻辑正确(你的参数顺序是对的,但ID本身错了):
var client = new GraphServiceClient(/* 你的认证逻辑 */); // 从.msg文件中提取的正确EwsId(Base64字符串) var correctEwsId = "AQMkADAwATM0MDAAMS1iNTcwLWI2NDMtMDACLTAwCgBGAAADs5KfUq...="; // 调用转换接口:源格式是EwsId,目标格式是RestImmutableEntryId var req = client .Me .TranslateExchangeIds(new [] { correctEwsId }, ExchangeIdFormat.RestImmutableEntryId, ExchangeIdFormat.EwsId); var translateResult = await req.Request().PostAsync();
额外注意事项
- 权限验证:确保你的应用已经申请了
Mail.Read或Mail.ReadWrite权限,转换ID需要访问邮件元数据 - 邮箱上下文:
.Me对应的邮箱必须是该邮件所在的邮箱,因为EwsId是邮箱专属的,跨邮箱无法转换 - Beta版本兼容性:虽然Beta版文档有限,但
translateExchangeIds确实支持EwsId和Graph ID的互转,只要ID格式正确就可以正常工作
内容的提问来源于stack exchange,提问作者jsaele
相关产品推荐
相关产品推荐

