获取Microsoft Graph API中.eml邮件附件所需权限及方案咨询
解决Outlook .eml附件获取内容的问题
问题原因
.eml格式的附件属于项目附件(item attachment),而非普通的文件附件,因此调用/users/{user_id}/messages/{message_id}/attachments接口时,返回结果中不会包含contentBytes字段,这类附件需要通过专门的端点获取内容。
所需权限
获取.eml附件内容需要配置以下权限之一(根据应用类型选择):
- 委派权限:
Mail.Read或Mail.ReadWrite(需用户登录授权,适用于客户端应用) - 应用权限:
Mail.Read或Mail.ReadWrite(需管理员同意,适用于后台服务类应用)
注意:要确保在Azure AD应用注册中已添加对应权限并完成授权(应用权限需管理员审批)。
可行获取方法
方法1:调用附件专属的$value端点
- 先调用
/users/{user_id}/messages/{message_id}/attachments接口,获取目标.eml附件的id; - 使用该
id调用/users/{userId}/messages/{message_id}/attachments/{attachment_id}/$value接口,直接获取.eml文件的二进制内容。
对应msgraph-sdk-php的代码示例:
// 假设已初始化好$graphClient $userId = "目标用户ID"; $messageId = "目标邮件ID"; $attachmentId = ".eml附件的ID"; // 获取.eml附件内容 $emlContent = $graphClient->users() ->byUserId($userId) ->messages() ->byMessageId($messageId) ->attachments() ->byAttachmentId($attachmentId) ->content() ->get(); // 保存到文件或处理内容 file_put_contents("attachment.eml", $emlContent);
方法2:通过嵌套邮件对象获取内容
由于.eml附件本质是嵌套的邮件,也可以调用/users/{userId}/messages/{message_id}/attachments/{attachment_id}/item接口获取嵌套邮件的详情,再根据需求提取内容。不过此方法返回的是邮件JSON结构,如需完整.eml文件,方法1更直接。
权限错误排查
你之前调用/users/{userId}/messages/{message_id}/$value出现403,大概率是因为调用了错误的端点(该端点是获取原邮件的.eml内容,而非附件的)。确认使用上述附件专属的$value端点,并检查权限是否正确配置及授权完成。
内容的提问来源于stack exchange,提问作者MalcolmInTheCenter
相关产品推荐
相关产品推荐

