Reputation: 9013
I use GraphServiceClient to get messages from Outlook.
var messages = await _graphServiceClient.Me.MailFolders[folderId].Messages.Request()
.Header("Prefer", "outlook.body-content-type=\"text\"")
.Filter($"createdDateTime gt {greaterDate} and createdDateTime lt {lessDate}")
.Top(int.MaxValue).GetAsync();
Request gets max 1000 items.
I want to get other messages and follow documentation.
My code:
var pageIterator = PageIterator<Message>
.CreatePageIterator(
_graphServiceClient,
messages,
// Callback executed for each item in
// the collection
(m) =>
{
return true;
},
// Used to configure subsequent page
// requests
(req) =>
{
// Re-add the header to subsequent requests
req.Header("Prefer", "outlook.body-content-type=\"text\"");
return req;
});
await pageIterator.IterateAsync();
But nothing happened when I call my code. It looks like after pageIterator.IterateAsync();
it's infinity loop.
What is wrong?
Upvotes: 6
Views: 1843
Reputation: 15961
I found the limitation for list messages with Top
query. The following saying is from list message api.
Depending on the page size and mailbox data, getting messages from a mailbox can incur multiple requests. The default page size is 10 messages. Use $top to customize the page size, within the range of 1 and 1000.
Description from OData Top parameter.
The minimum value of $top is 1 and the maximum depends on the corresponding API.
=================================================
.Top(int.MaxValue)
I'm afraid you'd better to set the value to 999 since I'm not sure if it has a limit for the max value for it. And I also test the Iterator in my side and it really took much time, so I add a count
like the document showed.
public async Task<string> mailsAsync() {
//var mail = await _graphServiceClient.Me.Messages.Request().GetAsync();
int count = 0;
var messages = await _graphServiceClient.Me.Messages
.Request()
.Header("Prefer", "outlook.body-content-type=\"text\"")
.Select(e => new {
e.Sender,
e.Subject,
e.Body
})
.Top(300)
.GetAsync();
var pageIterator = PageIterator<Message>
.CreatePageIterator(
_graphServiceClient,
messages,
(m) =>
{
Console.WriteLine(m.Subject);
count++;
return true;
},
// Used to configure subsequent page
// requests
(req) =>
{
// Re-add the header to subsequent requests
req.Header("Prefer", "outlook.body-content-type=\"text\"");
return req;
}
);
await pageIterator.IterateAsync();
count = count + 1;
return "success";
}
Upvotes: 5