Из комментария @bluuf я заглянул в EWS (веб-сервис обмена) и нашел это решение, которое примерно на 50% быстрее вашего сценария. Может быть, оно вам поможет
$startDate = Get-Date
$MailboxSMTP = "peter.parker@home.com"
$dllpath = "C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Mashup\Microsoft.Exchange.WebServices.dll"
[void][Reflection.Assembly]::LoadFile($dllpath)
$service = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1)
$service.UseDefaultCredentials = $true
$service.AutodiscoverURL($mailboxSMTP)
$mbMailbox = new-object Microsoft.Exchange.WebServices.Data.Mailbox($mailboxSMTP)
$inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
write-host "Number or unread Messages : " $inbox.UnreadCount
$emails = $inbox.FindItems(10000) | Where-Object { $_.DateTimeSent -gt '27-Oct-2019 12:00 PM'}
$endDate = Get-Date
New-TimeSpan -Start $startDate -End $endDate
Здесь вы найдете скрипт https://www.msxfaq.de/code/testews.htm
РЕДАКТИРОВАТЬ:
Вы можете отфильтровать результаты с помощью EWS так же, как в @Dmitry solution
write-host "Number or unread Messages : " $inbox.UnreadCount
$view = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1)
$x = $inbox.FindItems($(New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThanOrEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::DateTimeReceived, '2019-10-27')),$view)
ИлиВы можете использовать его для фильтрации различных атрибутов
$filter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::IsRead, $false)
Или
$filter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsLessThanOrEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeReceived,'2019-10-10')
$x = $inbox.FindItems($filter,$view)