首页 > 编程语言 >java 通过 microsoft graph 调用outlook

java 通过 microsoft graph 调用outlook

时间:2024-02-27 13:58:25浏览次数:17  
标签:outlook java graph import message com microsoft

废话不多说

一 官方文档

先看一下官方文档,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;
    }
}

 

四 结果

 

标签:outlook,java,graph,import,message,com,microsoft
From: https://www.cnblogs.com/hanjun0612/p/18036729

相关文章

  • Java面向对象之接口和抽象类的区别一目了然
    介绍相信对于Java面向对象部分,很多人很长一段时间对于接口和抽象类的区别,使用场景都不是很熟悉,同是作为抽象层重要的对象,工作中到底什么情况下使用抽象类,不是很清楚。本文就一次性把这些概念一次性说清楚,不用再烦恼了,哈哈!核心概念接口与抽象类最明显的区别可能就是使用上的......
  • Large Scale Product Graph Construction for Recommendation in E-commerce论文阅读
    Abstract​ 大规模的推荐系统通常严重依赖于预先构建的产品索引来加速推荐服务,从而使等待时间较长。一个重要的索引结构是产品-产品索引,在这里可以检索给定种子产品的排名产品列表。该指数可以看作是一个加权的产品-产品图。​ 在本文中,我们提出了一种能够有效地构建这类索引产......
  • java读取resource下的文件 下载
    点击查看代码publicvoiddownloadKsxxYzyTemplate(HttpServletRequestrequest,HttpServletResponseresponse){try{//FileDownloadUtils.downloadFileFromResource(response,YZYMB_NAME,YZYMB_URL);FileDownloadUtils.downloadFileFro......
  • C#与Java的继承与实现上的差异
    虽然C#和Java都支持继承和接口实现这两种面向对象编程的基本概念,但它们在一些细节上有一些差异。继承(Inheritance)单继承vs多继承:C#支持单继承,一个类只能直接继承自一个父类。Java也支持单继承,一个类只能直接继承自一个父类。基类构造函数的调用:在C#中,如果......
  • 【13.0】JavaScript之流程控制
    【一】if判断【1】语法//if-elseif(条件){条件成立执行的代码块}else{条件不成立时执行的代码块}//if-elseif-elseif(条件){条件成立执行的代码块}elseif(条件){条件成立执行的代码块}else{条件不成立时执行的代码块}//()条件{}执行的代码块【2】if~e......
  • 【16.0】JavaScript之对象
    【一】对象js中的对象是无序的属性集合我们可以把js中的对象想象成键值对,其中值可以是数据或者函数特征-在对象中属性表示行为-在对象中用方法表示可以看成Python中的字典,但是在JS中的自定义对象要比Python里面的字典操作起来更方便【二】对象创建【1】对象字面量(Objec......
  • 【15.0】JavaScript之函数
    【一】函数函数function,也叫做功能,方法,函数可以将一段代码封装起来,函数就具备了特定的功能函数的作用就是封装一段代码,将来可以重复使用在Python中定义函数需要用def在JavaScript中定义函数需要用function【二】函数声明【1】先声明再调用函数必须先声明,才能......
  • 【14.0】JavaScript之数组
    【一】什么是数组数组是一组有序的数据集合,数组内部可以存放多个数据,不限制数据类型,数组的长度可以动态调整数组类似于Python当中的列表【二】创建数组创建数据的最简单方式是通过字面量vararr=[]也可以通过数组对象去创建vararr=newArray()存放多个......
  • 【18.0】JavaScript之JS事件案例
    【一】开关灯示例<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>.c1{height:400px;width:40......
  • 【17.0】JavaScript之DOM
    【一】什么是DOM/BOM文档对象模型(DocumentObjectModel,简称DOM)浏览器对象模型(BrowserObjectModel,简称BOM)是JavaScript与网页内容及浏览器环境进行交互的两种核心概念。【1】DOM(1)概述文档对象模型(DOM)是一个编程接口,它以树状结构来表示HTML或XML文档。在D......