Читаем письма из ящика Outlook с помощью PowerShell

Читаем письма из ящика Outlook с помощью PowerShell

В некоторых сценариях вам нужно погромно анализировать входящие письма в почтовом ящике и извлекать из них различную информацию (отправитель, тема, тело письма). API Outlook позволяет получить прямой доступ к содержимому почтового ящика, отрыть список писем в ящике и прочитать их содержимое. В этой статье мы рассмотрим, как обращаться и обрабатывать письма в почтовом ящике Outlook из PowerShell.

Данный сценарий предполагает, что на компьютере установлен Outlook и настроен почтовый профиль (возможно подключение ящика с любого почтового сервера, будь то Exchange, Яндекс, Gmail или mail.ru).

Чтобы 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 ""

PowerShell - список папок в ящике Outlook

Чтобы определить папку по умолчанию для входящих писем, выполните команду (в зависимости от языковых/региональных настроек ящика, папка может называться Inbox или Входящие):

$inbox = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)

Вывести список писем в папке Входящие в формате: отправитель, получатель, тема письма, размер, дата получения.

$inbox.Items | ft SenderEmailAddress, To, Subject, Size, ReceivedTime

Вывести список полученных писем в Outlook с помощью PowerShell

Можно использовать фильтры для поиска определенных писем. Например, нужно получить список писем, полученных за сегодня от определенного 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

Прочитать содержимое письма из PowerShell

Если письмо содержит вложение, вы можете сохранить файл вложения на диск:

$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 при получении письма от пользователя.

PowerShell
Читаем письма из ящика Outlook с помощью PowerShell