Медленный вывод в Outlook через Powershell - PullRequest
1 голос
/ 28 октября 2019

Я использую Powershell для доступа к почте Outlook, создав COM-объект. Когда я ищу конкретную почту. PowerShell Выполняет итерацию по всем почтовым сообщениям, из-за чего мой результат вывода очень медленный и занимает очень много времени.

Я уже пытался использовать параметр Descending в Sort-Object или отфильтровать по дате, но результаты все еще медленные.

$outlook = New-Object -comobject outlook.application
$inbox = $outlook.GetNamespace("MAPI")
$find = $inbox.GetDefaultFolder(6)
$find.Items | Where-Object{$_.SentOn -gt '27-Oct-2019 12:00 PM'}| Select- 
Object -Property Subject,SentOn

Может ли кто-нибудь помочь мне сгенерировать более быстрые результаты или предоставить способ фильтрации моего поиска за определенный период времени.

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Никогда не просматривайте все элементы в вашем коде. В конце концов, вы бы не написали запрос SELECT на SQL без предложения WHERE, не так ли?

Используйте Items.Find/FindNext или Items.Restrict, чтобы позволить провайдеру магазина делать эту работу.

0 голосов
/ 29 октября 2019

Из комментария @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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...