Скрипт вывода статистики ящика (EWS)

Данный скрипт сделает поиск почты в ящике за последние 18 месяцев в папке “входящие” и вложенных подпапках, и посчитает количество писем по дням недели. К примеру - сколько за 18 месяцев было получено почты по понедельникам, сколько по вторникам и т.д. Результаты будут выведены в консоли.

Для работы требуется EWS Managed API 2.2 и данные учётной записи, обладающей правами на ящик, в котором происходит поиск.

# Загрузить EWS Managed API
Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"

# Учетные данные
$mailbox = "user@arasaka.local"
$username = "arasaka\user"
$password = "password"

$secure = ConvertTo-SecureString $password -AsPlainText -Force
$cred = New-Object System.Net.NetworkCredential($username,$secure)

# Создаем сервис EWS
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService(
    [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2016
)

$service.Credentials = $cred
$service.AutodiscoverUrl($mailbox, {$true})

# Дата начала (6 месяцев назад)
$startDate = (Get-Date).AddMonths(-18)

# Счетчик дней недели
$stats = @{
    "Monday" = 0
    "Tuesday" = 0
    "Wednesday" = 0
    "Thursday" = 0
    "Friday" = 0
    "Saturday" = 0
    "Sunday" = 0
}

# Найти Inbox
$Inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind(
    $service,
    [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox
)

# Получить все подпапки Inbox
$folderView = New-Object Microsoft.Exchange.WebServices.Data.FolderView(1000)
$folderView.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep

$folders = $service.FindFolders($Inbox.Id,$folderView)

# Добавить сам Inbox
$allFolders = @($Inbox)
$allFolders += $folders.Folders

foreach ($folder in $allFolders)
{
    Write-Host "Scanning:" $folder.DisplayName

    $itemView = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1000)

    do {

        $results = $service.FindItems($folder.Id,$itemView)

        foreach ($item in $results.Items)
        {
            if ($item.DateTimeReceived -ge $startDate)
            {
                $day = $item.DateTimeReceived.DayOfWeek.ToString()
                $stats[$day]++
            }
        }

        $itemView.Offset += $results.Items.Count

    } while ($results.MoreAvailable)
}

# Вывод результата
Write-Host ""
Write-Host "Mail statistics for last 18 months:"
$stats.GetEnumerator() | Sort-Object Name | Format-Table -AutoSize