3

我正在尝试使用 MS Graph API 从特定邮箱读取电子邮件。

var client = await GetClient(); //getting a client with client id, secret
var users = await client.Users.Request()
                 .Filter("startswith(displayName,'roger')")
                 .GetAsync(); //getting the users matching a criteria

var user = users.First(); //get the first user

//log the user name, this works fine
log.LogInformation("Found user " +  user.DisplayName);

//this is null
var messages = user.MailFolders?.FirstOrDefault();

我从这里获取的用户那里获得了所有正确的数据,但用户mailFolders属性是null.

为什么是这样?

我们想要扫描特定邮箱中的电子邮件并处理这些电子邮件和附件。我认为这可能是做到这一点的正确方法。但我坚持上述做法,MS Graph 上的文档,尤其是 .NET API 的文档是如此。

是不是权限的事情,我能不能通过某种方式增加我们AD应用注册的权限来获得这个权限?

还是这里发生了其他事情?

4

1 回答 1

5

Graph Client 只是 REST API 的包装器,它不会延迟加载对象。

User对象来自 AAD,而MailFolders来自 Exchange,并且每个都是它自己的端点。

正如您所指出的,您的Users请求工作正常。为了检索用户的MailFolders,您需要从中获取Idor并使用它来对. 您还需要发出另一个请求以获取消息:UserPrincipalNameUserMailFolders

// Get all users with a displayName of roger*
var users = await graphClient
    .Users
    .Request()
    .Filter("startswith(displayName,'roger')")
    .GetAsync();

// Get the first user's mail folders
var mailFolders = await graphClient
    .Users[users[0].Id] // first user's id
    .MailFolders
    .Request()
    .GetAsync();

// Get messages from the first mail folder
var messages = await graphClient
    .Users[users[0].Id] // first user'd id
    .MailFolders[mailFolders[0].Id] // first mail folder's id
    .Messages
    .Request()
    .GetAsync();

如果您只关心“知名”邮件文件夹,您可以通过使用知名名称来简化此请求。例如,您可以inbox这样请求:

// Get message from the user's inbox
var inboxMessages = await graphClient
    .Users[users[0].Id] // first user'd id
    .MailFolders["inbox"]
    .Messages
    .Request()
    .GetAsync();

鉴于您只使用id值,您可以通过仅请求id属性来优化它:

// Get all users with a displayName of roger*
var users = await graphClient
    .Users
    .Request()
    .Select("id") // only get the id
    .Filter("startswith(displayName,'roger')")
    .GetAsync();

// Get the first user's mail folders
var mailFolders = await graphClient
    .Users[users[0].Id] // first user's id
    .MailFolders
    .Request()
    .Select("id") // only get the id
    .GetAsync();
于 2019-03-25T15:38:47.273 回答