java 通过 microsoft graph 调用outlook

废话不多说

一 官方文档

先看一下官方文档,https://learn.microsoft.com/zh-cn/graph/tutorials/java?context=outlook%2Fcontext&tabs=aad&tutorial-step=1

其中的代码,可以通过地址下载:https://developer.microsoft.com/en-us/graph/quick-start 

二 授权方式

microsoft登录授权方式有很多种,

上面的是OAuth 2.0 授权代码授予  这个方式

但是这个方式,直接将enter code打印在在控制台,我没办法获取到(知道的小伙伴可以分享一下)。

因此我换成了 客户端密码  方式

三 代码示例

官方文档:https://learn.microsoft.com/zh-cn/entra/identity-platform/quickstart-daemon-app-java-acquire-token#register-and-download-your-quickstart-app

1 注册应用 (官方文档的step1)https://learn.microsoft.com/zh-cn/graph/tutorials/java?context=outlook%2Fcontext&tabs=aad&tutorial-step=1

2 应用授权

进入应用后,API权限--添加权限--选择权限(我选了Mail.ReadWrite和User.Read.All)

然后管理员点击  代表xxx授予管理员同意

3 获取应用配置信息

获取秘钥

证书和密码--新客户端密码--记录密码(密码只显示一次,请记录!),

虽然密码只显示一次,但我们可以生成新密码来获取新的。

 获取信息

4 代码

pom文件

        <!--    office 365    --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>32.1.3-jre</version></dependency><dependency><groupId>com.azure</groupId><artifactId>azure-identity</artifactId><version>1.11.1</version><scope>compile</scope></dependency><dependency><groupId>com.microsoft.graph</groupId><artifactId>microsoft-graph</artifactId><version>5.77.0</version></dependency><!--    office 365    --><dependency><groupId>com.microsoft.graph</groupId><artifactId>microsoft-graph-auth</artifactId><version>0.3.0</version></dependency><dependency><!-- Include the sdk as a dependency --><groupId>com.microsoft.graph</groupId><artifactId>microsoft-graph-core</artifactId><version>2.0.14</version></dependency>

java代码

package com.example.test_project.graphtutorial;import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import com.microsoft.graph.authentication.IAuthenticationProvider;
import com.microsoft.graph.authentication.TokenCredentialAuthProvider;
import com.microsoft.graph.models.Message;
import com.microsoft.graph.models.User;
import com.microsoft.graph.requests.GraphServiceClient;
import com.microsoft.graph.requests.MessageCollectionPage;
import okhttp3.Request;import java.io.IOException;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Arrays;public class TestGraph {public static void main(String[] args) throws IOException {ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder().clientId("clientId").clientSecret("clientSecret").tenantId("tenantId").build();final TokenCredentialAuthProvider tokenCredAuthProvider = new TokenCredentialAuthProvider(Arrays.asList("https://graph.microsoft.com/.default"), clientSecretCredential);System.out.println("First Step Reached. ");User user = getUser(tokenCredAuthProvider);System.out.println("User : "+user.displayName+" , Email : "+user.mail);MessageCollectionPage mailMessage=getMail(tokenCredAuthProvider);for (Message message: mailMessage.getCurrentPage()) {
//            System.out.println("Id: " + message.id);System.out.println("Message: " + message.subject);System.out.println("  From: " + message.from.emailAddress.name);System.out.println("  Status: " + (message.isRead ? "Read" : "Unread"));System.out.println("  Received: " + message.receivedDateTime// Values are returned in UTC, convert to local time zone.atZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime().format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)));}}public static User getUser(IAuthenticationProvider authProvider) throws IOException {GraphServiceClient<Request> graphClient = GraphServiceClient.builder().authenticationProvider(authProvider).buildClient();User user=graphClient.users("你的邮箱").buildRequest().select("displayName,mail,userPrincipalName").get();return user;}public static MessageCollectionPage getMail(IAuthenticationProvider authProvider) throws IOException {GraphServiceClient<Request> graphClient = GraphServiceClient.builder().authenticationProvider(authProvider).buildClient();MessageCollectionPage message = graphClient.users("你的邮箱")
//            .mailFolders("inbox").messages().buildRequest().select("id,from,isRead,receivedDateTime,subject").top(5).orderBy("receivedDateTime DESC").get();return message;}
}

四 结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NutUI + taro +vue 开发遇到的问题 使用popup组件 内部元素滚动遇到的的问题

1 popup 弹出内容时 弹出的框内元素数据很长需要滚动时 本地可以正常滚动 打包成小程序后无法滚动 如这样的免责条款内容 代码如下 解决办法 1 把2处的单位换成百分比 弹框能滚动但是 是popup 里面所有的元素都一起滚动 导致标题都滚走了 2 scroll-y 改成&#xff1a; :scrol…

单片机05__串口USART通信__按键控制向上位机传输字符串

串口USART通信 通用UART介绍 1.通信的概念 计算机与外界进行信息交换的过程称之为通信。 在通信的过程中&#xff0c;通信双方都需要遵守的规则称之为通信协议。 硬件协议&#xff1a;将数据以什么样的方式传输过去 软件协议&#xff1a;将数据以什么样的顺序传输过去 2.常用…

Android 通知--判断通知是否有跳转

一. 从应用层来分析 在 Android 中&#xff0c;可以通过 PendingIntent 来实现有跳转的通知和没有跳转的通知的区别。具体来说&#xff0c;有跳转的通知会设置一个 PendingIntent&#xff0c;当用户点击通知时会触发该 PendingIntent&#xff0c;打开指定的界面或执行特…

C++ 高级面试题:解释 C++ 中的抽象基类和纯虚函数

解释 C 中的抽象基类和纯虚函数 在C中&#xff0c;抽象基类和纯虚函数是面向对象编程中的重要概念&#xff0c;用于实现多态性和接口规范。它们通常与继承和多态结合使用&#xff0c;以实现接口的统一定义和派生类的不同实现。 抽象基类&#xff08;Abstract Base Class&…

SpringBoot-集成Elasticsearch

依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId…

微服务之qiankun主项目+子项目搭建

主项目使用history&#xff0c;子项目使用hash模式 1. 下载安装"qiankun": "^2.10.13"2. 手动调用qiankun,使用vue脚手架搭建的项目1. 主项目配置&#xff08;我使用的是手动调用乾坤&#xff0c;在指定页面显示内容&#xff09;1. 要使用的页面中引入乾坤…

MyBatis概述

三层架构 表现层&#xff1a;直接和前端交互&#xff0c;接受AJAX请求&#xff0c;返回json数据业务层&#xff1a;一是处理前端的请求&#xff0c;二是返回持久层获取的数据持久层(数据访问层)&#xff1a;直接操作数据库&#xff0c;完成CRUD&#xff0c;返回数据给业务层 …

李沐动手学习深度学习——3.2练习

以下是个人理解&#xff0c;希望进行讨论求解。 练习 1. 如果我们将权重初始化为零&#xff0c;会发生什么。算法仍然有效吗&#xff1f; 根据SGD算法公式如上&#xff0c;第一次迭代的值可知w只与b相关&#xff0c;而对于b的迭代更新&#xff0c;只是与b的初始值相关&#x…

docker中hyperf项目配置虚拟域名

在使用hyperf框架时&#xff0c;直接用了docker环境进行开发 下载镜像运行容器 docker run --name hyperf -v /data/project:/data/project -p 9501:9501 -itd -w /data/project --privileged -u root --entrypoint /bin/sh 镜像ID配置docker-compose.yml version: "3.…

也谈AIGC和ChatGPT的区别?

AIGC 和 ChatGPT 的区别 定义 AIGC (人工智能生成内容)&#xff1a;一种人工智能技术&#xff0c;用于生成类似人类的文本、图像、音频和视频等内容。ChatGPT&#xff1a;OpenAI 开发的大型语言模型&#xff0c;是 AIGC 的一种具体实现。 目的 AIGC&#xff1a;广泛用于内容…

亚马逊自养号测评:如何安全搭建环境,有效规避风险

要在亚马逊上进行自养号测评&#xff0c;构建一个真实的国外环境至关重要。这包括模拟国外的服务器、IP地址、浏览器环境&#xff0c;甚至支付方式&#xff0c;以创建一个完整的国际操作环境。这样的环境能让我们自由注册、养号并下单&#xff0c;确保所有操作均符合国际规范。…

Gin 框架简单上手

引言 Gin 是一个基于 Go 语言的 Web 框架&#xff0c;旨在提供高性能和高效的方式来构建 Web 应用程序。它简单易用&#xff0c;同时又提供了丰富的功能和灵活的扩展性。本文将带你深入学习 Gin 框架&#xff0c;从安装开始&#xff0c;逐步深入探索其各项功能&#xff0c;包括…

企业级指针仪表读数YOLOV8NANO

企业级指针仪表读数&#xff0c;采用YOLOV8NANO训练&#xff0c;检测表盘和表芯&#xff0c;得到PT模型&#xff0c;然后转换ONNX&#xff0c;让OPENCV调用。然后提取表芯区域&#xff0c;通过极坐标转换为直角坐标&#xff0c;再通过检测指针和刻度&#xff0c;换算成比例&…

Chapter 8 - 19. Congestion Management in TCP Storage Networks

Queue Depth Monitoring and Microburst Detection Queue depth monitoring and microburst detection capture the events that may cause congestion at a lower granularity but are unnoticed by other means due to long polling intervals. 队列深度监控和微爆检测可捕捉…

Ubuntu 安装 Android Studio

一. 步骤 通过以上步骤&#xff0c;可以在 Ubuntu 上成功安装 Android Studio&#xff0c;并开始进行 Android 应用程序的开发。 打开终端&#xff08;Terminal&#xff09;。 首先&#xff0c;确保你已经安装了 Java 开发工具包&#xff08;JDK&#xff09;。Android Studio …

notejs+nvm+angular+typescript.js环境 Hertzbeat 配置

D:\Program Files\nodejs\ D:\Users\Administrator\AppData\Roaming\nvm nvm命令提示 nvm arch&#xff1a;显示node是运行在32位还是64位。 nvm install <version> [arch] &#xff1a;安装node&#xff0c; version是特定版本也可以是最新稳定版本latest。 可选参…

前端-BOM和DOM的区别和用法

首先上图&#xff0c;这是整个JAVASCRIPTD 结构&#xff0c;因此我们可以得出一个关系等式 JavaScript ECMAscript BOM DOMECMAscript&#xff1a; 是一种由 ECMA国际&#xff08;前身为欧洲计算机制造商协会&#xff09;通过 ECMA-262 标准化的脚本程序设计语言&#xff0…

二分图---染色法(判断二分图),匈牙利算法(二分图的最大匹配) //概念,应用场景,判定证明,算法思路,示例

目录 二分图概念 二分图应用场景 如何判定一个图是否可以划分成二分图 证明 染色法 原理步骤 时间复杂度 算法思路 例子 匈牙利算法 概念 匈牙利使用算法前提,场景 时间复杂度 算法思路 例子 二分图概念 二分图是图论中的一个重要概念&#xff0c;指的是一个图的…

如何将算法部署于云平台

算法部署&#xff1a;指将开发完成的算法模型应用到实际的生产环境中的过程。通常包括将算法模型转换为可以在特定硬件和软件环境中运行的服务或应用程序&#xff0c;并使其能够接收输入数据&#xff0c;处理这些数据&#xff0c;并返回预测或分析结果。 要将一个离线的强化学…

Java四大引用类型

四大引用类型 从JDK 1.2版本开始&#xff0c;对象的引用被划分为4种级别&#xff0c;从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为&#xff1a;强引用、软引用、弱引用和虚引用 不同的引用类型&#xff0c;主要体现的是对象不同的可达性&#xff08;r…