В некоторых сценариях вам нужно погромно анализировать входящие письма в почтовом ящике и извлекать из них различную информацию (отправитель, тема, тело письма). API Outlook позволяет получить прямой доступ к содержимому почтового ящика, отрыть список писем в ящике и прочитать их содержимое. В этой статье мы рассмотрим, как обращаться и обрабатывать письма в почтовом ящике Outlook из PowerShell.
Чтобы PowerShell мог получать доступ к содержимому ящика, Outlook должен быть запущен на компьютере. Вы можете проверить, запущен ли процесс outlook.exe, и запустить его в фоновом режиме с помощью команды:
$OutlookProc = ( Get-Process | where { $_.Name -eq "OUTLOOK" } )
if ( $OutlookProc -eq $null ) { Start-Process outlook.exe -WindowStyle Hidden; Start-Sleep -Seconds 5 }
Теперь нужно загрузить класс и создать экземпляр для доступа к Outlook:
Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
$Outlook = New-Object -ComObject Outlook.Application
Для доступа к содержимому ящика используется пространство имен протокола MAPI:
$namespace = $Outlook.GetNameSpace("MAPI")
В почтовом ящике может быть несколько папок. Вы можете вывести список папок в ящике:
$NameSpace.Folders.Item(1).Folders | FT FolderPath
Можно вывести список папок в древовидном виде и посчитать количество писем в каждой папке:
Function Listfolders { param($Folders, $Indent) ForEach ($Folder in $Folders | sort-object name) { write-host $Indent$($Folder.Name)" ("$($Folder.Items.Count)")" Listfolders $Folder.Folders $Indent" " } } ListFolders $namespace.Folders ""
Чтобы определить папку по умолчанию для входящих писем, выполните команду (в зависимости от языковых/региональных настроек ящика, папка может называться Inbox или Входящие):
$inbox = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)
Вывести список писем в папке Входящие в формате: отправитель, получатель, тема письма, размер, дата получения.
$inbox.Items | ft SenderEmailAddress, To, Subject, Size, ReceivedTime
Можно использовать фильтры для поиска определенных писем. Например, нужно получить список писем, полученных за сегодня от определенного email адреса отправителя:
$currentDate = Get-Date -Format "MM/dd/yyyy"
$inbox.Items | Where-Object { $_.ReceivedTime -like "*$currentDate*" -and $_.SenderEmailAddress -eq "[email protected]"}
Можно вывести тему и содержимое письма. Можно получить текст письма в plaintext формате (свойство Body) или вывести HTML содержимое (HTMLBody). В этом примере мы выводим на экран текст последнего полученного письма :
$inbox.Items($inbox.Items.Count)|select SenderEmailAddress,subject,Body,HTMLBody|fl
Если письмо содержит вложение, вы можете сохранить файл вложения на диск:
$email= $inbox.Items($inbox.Items.Count)
if ($Email.Attachments.Count -gt 0) {
$Attachment = $Email.Attachments.Item(1)
$Attachment.SaveAsFile("C:\Downloads\$($Email.Attachments.Item(1).FileName)")
}
Чтобы удалить из ящика последнее полученное письмо:
$email= $inbox.Items($inbox.Items.Count)
$Email.Delete()
Возможность получать доступ к содержимому ящика Outlook из PowerShell можно использовать в различных сценариях автоматизации, когда нужно выполнять определенные действия при получении писем. Можно добавить скрипт проверки ящика в Task Sheduller и запускать его по расписанию. Например, так вы можете настроить простейший транслятор сообщений из почтового ящика в Телеграм, или завести заявку в ITSM при получении письма от пользователя.