[英]Microsoft Exchange Folders.findItems results limited to a 1000
我正在嘗試從 Microsoft Exchange 的聯系人文件夾中獲取聯系人列表。
即使文件夾中有更多項目,結果也只返回 1000 個項目。
這是我的代碼。
FindFoldersResults r = service.FindFolders(new FolderId(WellKnownFolderName.PublicFoldersRoot), new FolderView(10));
Folder folder = getFolder("test", r.Folders);
ContactsFolder contactsfolder = ContactsFolder.Bind(service, new FolderId(folder.Id.ToString()), new PropertySet(BasePropertySet.IdOnly, FolderSchema.TotalCount));
FindItemsResults<Item> items = folder.FindItems(new ItemView(contactsfolder.TotalCount));
我怎樣才能讓它退回所有物品?
正如 Jason 引用的文章所暗示的那樣,分頁是關鍵。 這是我在 Office365 Exchange Server 上使用的代碼,用於獲取給定文件夾中所有電子郵件的列表(超過 20,000 封電子郵件,頁面大小為 100 時運行速度非常快):
// via https://msdn.microsoft.com/en-us/library/office/dn592093(v=exchg.150).aspx
int pageSize = 100;
int offset = 0;
ItemView view = new ItemView(pageSize + 1, offset);
view.PropertySet = new PropertySet(ItemSchema.Subject, ItemSchema.DateTimeSent);
view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
view.Traversal = ItemTraversal.Shallow;
bool moreItems = true;
ItemId anchorId = null;
while (moreItems)
{
FindItemsResults<Item> results = service.FindItems(buildsFolderId, view);
moreItems = results.MoreAvailable;
if (moreItems && anchorId != null)
{
// Check the first result to make sure it matches
// the last result (anchor) from the previous page.
// If it doesn't, that means that something was added
// or deleted since you started the search.
if (results.Items.First<Item>().Id != anchorId)
{
Console.Error.WriteLine("The collection has changed while paging. Some results may be missed.");
}
}
if (moreItems)
{
view.Offset += pageSize;
}
anchorId = results.Items.Last<Item>().Id;
// Because you’re including an additional item on the end of your results
// as an anchor, you don't want to display it.
// Set the number to loop as the smaller value between
// the number of items in the collection and the page size.
int displayCount = results.Items.Count > pageSize ? pageSize : results.Items.Count;
for (int i = 0; i < displayCount; i++)
{
Item item = results.Items[i];
Console.WriteLine("[" + item.DateTimeSent + "] " + item.Subject);
}
Console.Error.WriteLine("Current offset: {0}/{1}", view.Offset, folder.TotalCount);
}
我發現這篇文章描述了 EWSFindCountLimit 設置,該設置可能導致限制為 1000 個項目。
這似乎僅適用於 Exchange Server 2010。
Set-ThrottlingPolicy -Identity <ThrottlingPolicyIdParameter> [-EWSFindCountLimit <UInt32>]
這是相同答案的 PowerShell 版本:
$allItems = @()
$pageSize = 1000
$offset = 0
$ItemView = New-Object Microsoft.Exchange.WebServices.Data.ItemView -ArgumentList ($pageSize + 1), $offset
$ItemView.PropertySet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet ([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties,[Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::DateTimeReceived)
$ItemView.OrderBy.Add([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::DateTimeReceived, 'Descending')
$SearchQuery = "sent:>=1/23/2020 AND sent:<=1/24/2020"
$Folder = 'SentItems'
do
{
$items = $exchangeService.FindItems($Folder, $SearchQuery, $ItemView)
Write-Host "Items Count: $($items.Items.Count), offset: $($ItemView.Offset)"
if ($items.MoreAvailable)
{
$ItemView.Offset += $pageSize
}
$items.Items | ForEach-Object {
$allItems += $PSItem
}
}
while ($items.MoreAvailable)
$allItems.Count
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.