microsoft.graph 中国服邮箱发送失败问题,如何解决??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  microsoft.graph 中国服邮箱发送失败问题。在用java语言使用microsoft.graph 发送邮件时使用的是由世纪互联运营的中国服,根据 https://microsoftgraph.chinacloudapi.cn/.default 获取token ;但是在发送邮件时一直提示:

Throwable detail: com.microsoft.graph.http.GraphServiceException: Error code: InvalidAuthenticationToken
Error message: Access token validation failure. Invalid audience.

  查找相关资料后(https://zhuanlan.zhihu.com/p/621741681) 发现可能是因为地址设置的不匹配造成的 但是在代码层级怎么去设置发送邮箱地址。

相关代码如下:

 private void auth() {
        ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
                .clientId(clientId)
                .tenantId(tenantId)
                .clientSecret(clientSecret)
                .authorityHost(AzureAuthorityHosts.AZURE_CHINA)
                .build();
        //https://microsoftgraph.chinacloudapi.cn/.default
        authProvider = new TokenCredentialAuthProvider(
                Arrays.asList("https://microsoftgraph.chinacloudapi.cn/.default")
                , clientSecretCredential
        );
    }
 
 
 public Message sendMail(String sender, List<String> recipients, String subject, String body, List<FileAttachment> files) throws Exception {
        // Ensure client isn't null
        if (graphClient == null) {
            throw new Exception("Graph has not been initialized for user auth");
        }
        // Create a new message
        Message message = new Message();
        message.subject = subject;
        message.body = new ItemBody();
        message.body.content = body;
        message.body.contentType = BodyType.HTML;
        //收件人
        if (recipients != null && recipients.size() > 0) {
            message.toRecipients = new ArrayList<>();
            for (String item : recipients) {
                Recipient toRecipient = new Recipient();
                toRecipient.emailAddress = new EmailAddress();
                toRecipient.emailAddress.address = item;
                message.toRecipients.add(toRecipient);
            }
        }
        //附件
        message = addAttarchment(message, files);
 
        // Send the message
        graphClient
                .users(sender)
                .sendMail(UserSendMailParameterSet.newBuilder()
                        .withMessage(message)
                        .build())
                .buildRequest()
                .post();
        return message;
    }

相关帮助链接 :
https://blog.csdn.net/hanjun0612/article/details/136319440?spm=1001.2014.3001.5501
https://blog.csdn.net/hanjun0612/article/details/136806768?spm=1001.2014.3001.5501

友情提示:
  如上问题有的来自我自身项目开发,有的收集网站,有的来自读者…如有侵权,立马删除。再者,针对此专栏中部分问题及其问题的解答思路或步骤等,存在少部分搜集于全网社区及人工智能问答等渠道,若最后实在是没能帮助到你,还望见谅!并非所有的解答都能解决每个人的问题,在此希望屏幕前的你能够给予宝贵的理解,而不是立刻指责或者抱怨!如果你有更优解,那建议你出教程写方案,一同学习!共同进步。

解决方案

  如下是上述问题的解决方案,仅供参考:

  在使用 Microsoft Graph API 通过 Java 发送邮件时,如果遇到 “InvalidAuthenticationToken” 错误,这通常意味着提供的访问令牌无效或其受众(audience)与请求的资源不匹配。根据您提供的信息和代码示例,这里有几个可能的解决方案:

  1. 确保受众(Audience)正确

    • 您需要确保获取的访问令牌的受众与您请求访问的资源匹配。对于中国区的 Microsoft Graph API,受众应该是 https://microsoftgraph.chinacloudapi.cn
  2. 修改 TokenCredentialAuthProvider

    • 您提供的 TokenCredentialAuthProvider 应该使用正确的资源 URL。请确保您在获取令牌时使用的是正确的资源标识符。
  3. 检查权限和作用域

    • 确保您的应用在 Azure AD 应用注册中拥有发送邮件所需的权限和作用域。您可能需要在 Azure 门户中为应用添加 Mail.Send 权限,并确保已获得管理员同意。
  4. 使用正确的发送者邮箱

    • 确保 sender 参数是有效的邮箱地址,并且该邮箱地址与获取令牌的用户相关联。
  5. 检查 AuthorityHost

    • 您已经设置了 authorityHostAzureAuthorityHosts.AZURE_CHINA,这看起来是正确的。确保这个设置与您的 Azure China Cloud 环境匹配。
  6. 检查令牌获取逻辑

    • 确保您使用的 ClientSecretCredential 实例正确获取了访问令牌。您可以打印出获取到的令牌并使用 jwt.ms 等工具检查其受众和其他声明。
  7. 检查 Microsoft Graph API 版本

    • 确保您使用的 Microsoft Graph SDK 版本支持中国区服务,并且与您使用的 Graph API 版本兼容。
  8. 错误处理

    • sendMail 方法中添加错误处理逻辑,捕获 GraphServiceException 并打印出错误信息,这有助于进一步诊断问题。
  9. 联系支持

    • 如果问题依然无法解决,您可能需要联系 Microsoft 支持或查看 Microsoft Graph API 的官方文档获取更多帮助。

  最后,您提供的代码示例中的 auth 方法已经设置了中国区的 authorityHost,但请确保其他所有配置项都正确无误,包括客户端 ID、租户 ID 和客户端密钥。同时,确保您的应用已经在中国区 Azure AD 中正确注册,并且具有相应的权限。

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bug菌¹

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值