cls
# Загрузка сборки EWS Managed API
Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
# Создание объекта службы EWS
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013)
# Указание учетных данных пользователя
$service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials("----\-----", "-------")
# Указание URL сервера EWS
$service.Url = New-Object Uri("https://---.-------.ru/EWS/Exchange.asmx")
# Указание периода и диапазона размера письма
$startDate = [DateTime]::Parse("2022-01-01")
$endDate = [DateTime]::Parse("2023-01-01")
$minSize = 1048576 # Минимальный размер в байтах
$maxSize = 10485760 # Максимальный размер в байтах
# Функция для рекурсивного обхода всех папок
function SearchEmailsInFolder {
param (
[Microsoft.Exchange.WebServices.Data.Folder]$folder
)
# Создание фильтра по дате
$dateFilter = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThanOrEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeSent, $startDate)
$dateFilter2 = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsLessThanOrEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeSent, $endDate)
# Создание фильтра по размеру
$sizeFilter = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThanOrEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::Size, $minSize)
$sizeFilter2 = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsLessThanOrEqualTo([Microsoft.Exchange.WebServices.Data.ItemSchema]::Size, $maxSize)
# Объединение фильтров
$searchFilterCollection = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::And)
$searchFilterCollection.Add($dateFilter)
$searchFilterCollection.Add($dateFilter2)
$searchFilterCollection.Add($sizeFilter)
$searchFilterCollection.Add($sizeFilter2)
# Создание запроса на поиск элементов в текущей папке
$itemView = New-Object Microsoft.Exchange.WebServices.Data.ItemView(50) # Получаем до 50 элементов за один запрос
$findResults = $folder.FindItems($searchFilterCollection, $itemView)
# Вывод списка найденных писем
foreach ($item in $findResults.Items) {
$email = [Microsoft.Exchange.WebServices.Data.EmailMessage]::Bind($service, $item.Id)
# Проверка на наличие вложений
if ($email.HasAttachments -and $email.Attachments.Count -gt 0) {
Write-Host "Письмо с вложениями найдено! Удаление вложений..."
$attachmentsToRemove = @()
foreach ($attachment in $email.Attachments) {
try {
# Добавляем вложения в список для удаления
$attachmentsToRemove += $attachment
Write-Host "Вложение для удаления: " $attachment.Name
} catch {
Write-Host "Ошибка при подготовке вложения для удаления: " $_.Exception.Message
}
}
# Удаление вложений из письма
foreach ($attachment in $attachmentsToRemove) {
try {
$email.Attachments.Remove($attachment) # Удаляем вложение из коллекции Attachments
Write-Host "Вложение удалено: " $attachment.Name
} catch {
Write-Host "Ошибка при удалении вложения: " $_.Exception.Message
}
}
# Сохранение изменений после удаления вложений
$email.Update([Microsoft.Exchange.WebServices.Data.ConflictResolutionMode]::AlwaysOverwrite)
}
Write-Host "Тема: " $email.Subject
Write-Host "Кому: " $email.ToRecipients.Address
Write-Host "Дата отправки: " $email.DateTimeSent
Write-Host "Размер: " $email.Size " байт"
Write-Host "Папка: " $folder.DisplayName
Write-Host "-------------------------"
}
# Поиск и обработка подкаталогов (рекурсивно)
$folderView = New-Object Microsoft.Exchange.WebServices.Data.FolderView(100) # Получаем до 100 папок за один запрос
$subfolders = $folder.FindFolders($folderView)
foreach ($subfolder in $subfolders.Folders) {
SearchEmailsInFolder -folder $subfolder # Рекурсивно вызываем функцию для каждой подкатегории
}
}
# Получение корневой папки "MsgFolderRoot"
$rootFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service, [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot)
# Запуск поиска по всем папкам
SearchEmailsInFolder -folder $rootFolder
Если бы мне приспичило - решил бы задачу скриптами на бэш.
Нужно сделать такой скрипт, который бы запускался периодически из крона, а суть его работы - брать откуда-то эталонные записи и дописывать/удалять их из локального хостс.