使用 Microsoft Graph 获取所有电子邮件 - 版本 5.2.0 或更高版本

问题描述 投票:0回答:3

我的原始代码是:

   var messages = await graphClient.Users["[email protected]"].MailFolders[folderName].Messages.GetAsync();

我正在使用 Microsoft.Graph 5.2.0。 不幸的是,这一次只能返回 10 封电子邮件。

我尝试了发布的代码来回答这个问题:在 c# 中使用 Microsoft Graph API 获取所有电子邮件。但是,我遇到了 .Request 方法不可用的问题。这是我引用的代码:

var client = new GraphServiceClient(authenticationProvider);
var messages = await client.Users["[email protected]"].Messages
     .Request()
     .Top(100)
     .GetAsync();

当我这样编码时。 .Request() 显示红色波浪线,表示 MailFolderItemRequestBuilder 不包含“请求”的定义。 即使升级到 Microsoft.Graph 5.5.0 也没有帮助。

有人可以帮我吗?

c# microsoft-graph-api microsoft-graph-sdks
3个回答
2
投票

在 v5 中你可以这样指定页面大小

var messages = await graphClient.Users["[email protected]"]
            .MailFolders[folderName]
            .Messages
            .GetAsync(x =>
            {
                x.QueryParameters.Top = 100;
            });

其他查询选项如

Select
Filter
等都是用类似的代码设置的。

资源:

查询参数选项


1
投票

在 v5 中,语法发生了更改。在 v5.x 中获取消息的首页的正确代码是:

var page = await graphServiceClient
    .Users[userId]
    .MailFolders[folderName]
    .Messages
    .GetAsync(config => config.QueryParameters.Top = 50);

返回值

page
的类型为
MessageCollectionResponse
。它有一个属性
OdataNextLink
,它指向消息的下一页。要遍历消息的所有可用页面,您可以使用以下扩展方法:

public static async Task<IReadOnlyList<Message>> GetAll(this Task<MessageCollectionResponse> collectionTask, GraphServiceClient serviceClient, int maxCount = int.MaxValue)
{
    if (collectionTask == null)
        throw new ArgumentNullException(nameof(collectionTask));

    var response = await collectionTask;
    var items = new List<Message>();

    var iterator = PageIterator<Message, MessageCollectionResponse>.CreatePageIterator(serviceClient, response,
        item => { items.Add(item); return items.Count < maxCount; });

    await iterator.IterateAsync();

    return items;
}

这将允许采用如下代码示例:

var page = await graphServiceClient
    .Users[userId]
    .MailFolders[folderName]
    .Messages
    .GetAsync()
    .GetAll(/*500*/);

Graph SDK 中任何返回

.GetAsync()
CollectionResponse
调用都可以采用此方法。不幸的是,不可能以通用方式编写上述扩展方法,因为集合基类型没有给出有关集合元素类型的任何提示(或者我们必须使用反射)。因此,对于您想要迭代的每个集合响应,您必须复制/粘贴上述
.GetAll()
方法并相应地替换类型(例如,将
Message
替换为
User
)。

此外,根据您的用例,您必须决定是在

Top
调用中设置
.GetAsync()
参数,还是在
.GetAll()
调用中提供所需的号码。两种方法的区别在于您要向图表发送多少请求以及每个请求应返回多少条目。另请注意,
Top
参数有记录的最大值(大部分为 999)。如果您需要/期望比这个数字更多的元素,您必须使用
.GetAll()
。在所有其他情况下,这取决于您处理数据的懒惰程度。


0
投票

如何迭代消息并保存到本地驱动器? var messages = wait graphClient.Users["[电子邮件受保护]"] .MailFolders[文件夹名称] .消息 .GetAsync(x => { x.QueryParameters.Top = 100; });

© www.soinside.com 2019 - 2024. All rights reserved.