Graph SDK O365获取邮件MIME内容返回空JSON问题求助
问题描述
我按照O365 Graph SDK文档获取邮件的MIME内容,用于保存为EML文件到Blob存储。使用以下代码请求共享邮箱邮件的MIME内容:
return $graphSdk->createRequest('GET', sprintf('/users/%s/messages/%s/$value', $this->config['from_email'], $message->id)) ->setReturnType(MimeContent::class) ->execute();
遇到以下问题:
- 该请求始终返回空JSON响应,即使在Graph Explorer中测试也是如此;修改邮件ID会抛出400错误(提示无效ID),说明当前ID是正确的
- 尝试另一个端点
/users/{id | userPrincipalName}/mailFolders/{id}/messages/{id}/$value,返回:
The OData request is not supported
- 移除URI中的
/$value后,能正常获取邮件内容,但无法获取MIME内容 - 已在PHP SDK的Issue中跟踪该问题,不确定是否与SDK相关,寻求解决思路
解决思路
- 检查邮件状态:确认目标邮件不是草稿、已删除或处于特殊状态,这类邮件可能没有完整的MIME内容
- 修正SDK的返回类型处理:
/$value端点返回的是原始的MIME文本内容(不是JSON格式的MimeContent对象),设置setReturnType(MimeContent::class)会导致SDK尝试解析JSON失败,返回空。改为直接获取原始响应内容:$response = $graphSdk->createRequest('GET', sprintf('/users/%s/messages/%s/$value', $this->config['from_email'], $message->id)) ->execute(); $mimeContent = (string) $response->getBody(); return $mimeContent; - 验证权限配置:确保授权的Token包含
Mail.Read权限(委托权限或应用权限均可);如果是应用权限,需在Azure AD中确认应用已被授予访问该共享邮箱的权限 - Graph Explorer测试注意事项:测试时切换到「原始响应」视图查看内容,默认的JSON视图会因为返回的是纯文本而显示为空
- 使用正确的端点:获取MIME内容的标准端点为
/users/{user-id}/messages/{message-id}/$value,通过mailFolders路径添加/$value的方式不被Graph API支持,应避免使用
内容的提问来源于stack exchange,提问作者Jaquarh
相关产品推荐
相关产品推荐

