如何使用令牌中的适当权限阅读电子邮件

How to read email with proper rights in token

我正在尝试将应用程序(它应该每隔几分钟从邮箱中提取一次电子邮件)从已弃用的 Microsoft EWS API 升级到新的 Graph API,但我遇到了一些问题。

这是我的 class 连接器 :

public class O365graphApiConnector {

  private final GraphServiceClient<Request> graphClient;

  public O365graphApiConnector(String clientId, String username, String password) {

    final UsernamePasswordCredential usernamePasswordCredential =
        new UsernamePasswordCredentialBuilder()
            .clientId(clientId)
            .username(username)
            .password(password)
            .build();

    final TokenCredentialAuthProvider tokenCredentialAuthProvider =
        new TokenCredentialAuthProvider(usernamePasswordCredential);

    graphClient=GraphServiceClient.builder()
        .authenticationProvider(tokenCredentialAuthProvider)
        .buildClient();
  }

  public User getUserProfile() {
    return graphClient.me().buildRequest().get();
  }

  public MessageCollectionPage getOutlookEmails() {
    return graphClient.me().messages().buildRequest().get();
  }

}

我正在使用 com.azure:azure-identity:1.4.2com.microsoft.graph:microsoft-graph:5.8.0

我构建了连接器,传递了 clientIdusernamepassword。我可以打电话 getUserProfile ,我得到了一些东西,所以身份验证“有效”。

但是,我在调用 getOutlookEmails 时收到 404:

SEVERE: Throwable detail: com.microsoft.graph.http.GraphServiceException: Error code: ResourceNotFound Error message: Resource could not be discovered.

GET https://graph.microsoft.com/v1.0/me/messages SdkVersion : graph-java/v5.8.0

404 : Not Found [...]

当我在调试模式下 运行 拦截令牌时,它似乎没问题:我拥有我的管理员授予应用程序帐户的一系列权限:

 "scp": "EWS.AccessAsUser.All Mail.Read Mail.Read.Shared Mail.ReadBasic Mail.ReadWrite
 Mail.ReadWrite.Shared Mail.Send Mail.Send.Shared MailboxSettings.ReadWrite User.Read User.Read.All User.ReadWrite profile openid email"

这是我们在管理员端看到的部分内容(截图后添加了更多权限):

我的理解是,这应该足以以编程方式访问给定邮箱的电子邮件,但显然,事实并非如此。

知道我遗漏了什么吗?

实际上,我使用的技术“用户”并没有真正的邮箱(尽管用户名是一个电子邮件地址……这让我很困惑)。

它已经获得了我感兴趣的给定邮箱的权限,所以修复只是在检索邮件之前 select mailbox/user :

public MessageCollectionPage getOutlookEmailsFor(String mailbox) {
  return graphClient.users(mailbox).messages().buildRequest().get();
}