Читаем письма из ящика 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_x000D_{ _x000D_ param($Folders, $Indent)_x000D_ ForEach ($Folder in $Folders | sort-object name)_x000D_ {_x000D_ write-host $Indent$($Folder.Name)" ("$($Folder.Items.Count)")"_x000D_ Listfolders $Folder.Folders $Indent" " _x000D_ }_x000D_}_x000D_ListFolders $namespace.Folders ""_x000D_

Чтобы определить папку по умолчанию для входящих писем, выполните команду (в зависимости от языковых/региональных настроек ящика , папка может называться 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

С помощью атрибута UnRead , вы можете проверить, было ли прочитано письмо в ящике пользователем .

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

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

admin

Share
Published by
admin

Recent Posts

Консоль удаленного рабочего стола(rdp console)

Клиент удаленного рабочего стола (rdp) предоставляет нам возможность войти на сервер терминалов через консоль. Что…

2 недели ago

Настройка сети в VMware Workstation

В VMware Workstation есть несколько способов настройки сети гостевой машины: 1) Bridged networking 2) Network…

2 недели ago

Логи брандмауэра Windows

Встроенный брандмауэр Windows может не только остановить нежелательный трафик на вашем пороге, но и может…

2 недели ago

Правильный способ отключения IPv6

Вопреки распространенному мнению, отключить IPv6 в Windows Vista и Server 2008 это не просто снять…

2 недели ago

Ключи реестра Windows, отвечающие за параметры экранной заставки

Параметры экранной заставки для текущего пользователя можно править из системного реестра, для чего: Запустите редактор…

2 недели ago

Как управлять журналами событий из командной строки

В этой статье расскажу про возможность просмотра журналов событий из командной строки. Эти возможности можно…

2 недели ago