5

MicrosoftExchangeの連絡先フォルダから連絡先のリストを取得しようとしています。
フォルダにさらにアイテムがある場合でも、結果は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));   

どうすればすべてのアイテムを返品できますか?

4

3 に答える 3

6

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);
            }
于 2015-04-22T19:46:54.723 に答える
1

1000アイテムの制限を引き起こしている可能性のあるEWSFindCountLimit設定について説明しているこの記事を見つけました。

これは、ExchangeServer2010にのみ適用されるようです。

スロットリングポリシーとEWSFindCountLimit

New-ThrottlingPolicyから、

Set-ThrottlingPolicy -Identity <ThrottlingPolicyIdParameter> [-EWSFindCountLimit <UInt32>] 
于 2012-09-02T07:55:22.710 に答える
0

同じ答えの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 
于 2020-02-04T04:42:21.843 に答える