如何通过Microsoft Graph API SDK读取S/MIME邮件及附件
处理Microsoft Graph API读取S/MIME加密邮件的方案
权限前置检查
确保你的应用已申请Mail.Read或Mail.ReadWrite权限:
- 若使用Delegated权限,需用户完成授权;
- 若使用Application权限,需管理员提前授权,且Exchange Online已配置证书同步(用于解密)。
同时目标邮箱必须已导入对应的S/MIME私钥证书,否则无法完成解密。
获取解密后的邮件内容
常规的getMessage方法只能获取加密后的原始邮件数据,必须调用Graph API的decrypt动作获取明文内容。Java SDK示例代码:
// 初始化已授权的GraphServiceClient GraphServiceClient<Request> graphClient = GraphServiceClient.builder() .authenticationProvider(yourAuthProvider) .buildClient(); // 调用decrypt接口获取解密后的邮件 Message decryptedMsg = graphClient.me().messages("目标邮件ID") .decrypt(DecryptPostRequestBody.newBuilder().build()) .buildRequest() .post(); // 读取明文邮件内容 String plainContent = decryptedMsg.body.content;
提取解密后的附件
解密后的邮件对象中,attachments集合已包含明文附件,直接遍历处理即可:
for (Attachment att : decryptedMsg.attachments) { if (att instanceof FileAttachment) { FileAttachment fileAtt = (FileAttachment) att; // 获取附件字节数据 byte[] attContent = fileAtt.contentBytes; // 示例:保存到本地文件 Files.write(Paths.get("本地保存路径/" + fileAtt.name), attContent); } }
处理仅签名的S/MIME邮件
对于仅签名未加密的邮件,Graph API会自动返回明文内容,若需验证签名有效性,可调用verifySignature动作:
VerifySignatureResponse sigResult = graphClient.me().messages("目标邮件ID") .verifySignature(VerifySignaturePostRequestBody.newBuilder().build()) .buildRequest() .post(); // 检查签名是否有效 boolean isSigValid = sigResult.isValid();
常见问题
- 解密失败返回403/400:检查邮箱是否有对应私钥、应用权限是否正确、Exchange证书同步是否完成;
- SDK调用报错:确保使用最新版Microsoft Graph Java SDK(建议v5及以上),旧版本可能不支持
decrypt动作。
内容的提问来源于stack exchange,提问作者Alexandre
相关产品推荐
相关产品推荐

