Проверка статуса сообщений (прочитаноне прочитано) в Exchange

Недавно прилетел кейс: « Можем ли мы получать статус письма (прочтенне прочтен) не зависимо от того, было ли включено ‘Уведомление о прочтении’ во время отправки, и нажал ли пользователь на уведомление о прочтении или нет? «. В этой статье поговорим об отслеживании статуса прочтения писем в on-prem Exchange Server и несколько слов об этой функции в Exchange Online (Microsoft 365).

Для чего может понадобится получать статус прочтения сообщения?

  1. Если письмо очень важное, и необходимо, чтобы каждый сотрудник ознакомился с ним;
  2. Во многих компаниях существуют рассылки новостидни рождениядокументы, и необходимо собрать статистику, насколько такие рассылки эффективны.

Можно ли получить статус прочтения письма в ящике Exchange независимо от того, запросил ли отправитель уведомление о прочтении?

Получаем статус прочтения письма в Exchange Server

Рассмотрим, как получить статус прочтения письма пользователем в ящике on-prem Exchange Server. Для начала проверьте, включено ли в вашей организации Exchange журналирование статуса прочтение писем:

Get-OrganizationConfig | Select ReadTrackingEnabled

True — включена, false — отключена.

Включите журналирование прочтения сообщений командой:

Set-OrganizationConfig -ReadTrackingEnabled $true

Только после этой команды в журналы Exchange Server будет вноситься информация о прочтении письма.

Можно отключить ведение журнала прочтения для определенных (например, сервисных или общих) ящиков командой:

Set-Mailbox email_name@companyname -MessageTrackingReadStatusEnabled $false

Следующим этапом нам необходимо получить ID сообщения, т.к. каждое сообщение имеет уникальный ID, а с email адресом и темой мы можем запутаться.

Получаем ID письма с помощью командлета Get-MessageTrackingLog :

Get-MessageTrackingLog -Sender email_name@companyname -MessageSubject "тема письма" -Start (Get-Date).AddHours(-48) -EventId RECEIVE | Select MessageID

Get-MessageTrackingLog получение messageid письма

В нашем примере письмо от этого отправителя с этой темой было отправлено несколько раз за последние 48 часов. Можно применить другие фильтры для получения точного MessageID.
А можно сделать проще — открыть нужное письмо в Outlook, нажать Файл — Свойства, и найти в пункте «Заголовки интернета» Message-ID письма.

получить messag-id письма в outlook

Далее откройте Exchange Management Shell и запустите скрипт Get-MessageReadStatusReport.ps1 (выложен ниже). Нужно указать имя ящика и Message-ID письма.

powershell скрипт Get-MessageReadStatusReport

В итоге вы получите CSV файл со статусами прочтения этого письма во всех ящиках пользователей. Возможны два статусу после того, как письма доставлено в ящик (Delivered):

  • Read – The message is marked as Read in the user’s mailbox
  • Unread – The message is marked as Unread in the user’s mailbox

таблица со статусами прочтения рассылки в ящиках пользователей exchange

Сам скрипт Get-MessageReadStatusReport.ps1 :
[CmdletBinding()]
param (
[Parameter( Mandatory=$true)]
[string]$Mailbox,
[Parameter( Mandatory=$true)]
[string]$MessageId
)
$output = @()
#Проверяем журналирование
if (!(Get-OrganizationConfig).ReadTrackingEnabled) {
throw "Трекинг статуса письма выключен"
}
#Берем ID письма
$msg = Search-MessageTrackingReport -Identity $Mailbox -BypassDelegateChecking -MessageId $MessageId
#Должно быть одно письмо
if ($msg.count -ne 1) {
throw "$($msg).count писем найдено по этому ID"
}
#Получаем отчет
$report = Get-MessageTrackingReport -Identity $msg.MessageTrackingReportId -BypassDelegateChecking
#Получаем события
$recipienttrackingevents = @($report | Select -ExpandProperty RecipientTrackingEvents)
#Генерируем список получателей
$recipients = $recipienttrackingevents | select recipientaddress
#Получаем статус письма для каждого получателя
foreach ($recipient in $recipients) {
$events = Get-MessageTrackingReport -Identity $msg.MessageTrackingReportId -BypassDelegateChecking `
-RecipientPathFilter $recipient.RecipientAddress -ReportTemplate RecipientPath
$outputline = $events.RecipientTrackingEvents[-1] | Select RecipientAddress,Status,EventDescription
$output += $outputline
}
$output
$directory = "C:logRSR"
$filename = 'ReadStatusReport'
$file = "$filename.csv"
#Выводим отчет в csv
$output | Export-Csv -NoTypeInformation -Append -Path "$directory$file"

Отслеживание статуса прочтения письма в Exchange Online (Microsoft 365)

Я попробовал немного модифицировать данный скрипт чтобы получить статус прочтения писем в ящиках пользователей облачного Exchange Online.

После подключения к своему тенанту Microsoft 365 с помощью с помощью PowerShell модуля Exchange Online я проверил, включено ли в Exchange Online отслеживание статуса прочтения писем. По-умолчанию опция messageTrackingReadStatusEnabled включена для всех ящиков в тенанте.

Get-EXOMailbox -Properties messageTrackingReadStatusEnabled|select UserPrincipalName,messageTrackingReadStatusEnabled

messageTrackingReadStatusEnabled включен в ящиках exchange online

В скрипт нужно внести изменения, т.к. для отслеживания писем в Exchange Online вместо командлетов Get-MessageTrackingLog и Search-MessageTrackingReport используются Get-MessageTrace и Get-MessageTraceDetail . Но к сожалению, командлет Get-MessageTraceDetail облачного Exchange Online не позволяет получать статус письма. Возможно в будущем Microsoft доведет функционал командлета Get-MessageTraceDetail до уровня наземного Search-MessageTrackingReport, но пока это увы не работает.

Получается, единственный доступный на сегодня способ проверки прочтения статуса письма в ящике Exchange Online – Microsoft Graph API . Нужно проверить свойство isRead письма. ( https://docs.microsoft.com/en-us/graph/api/message-get?view=graph-rest-1.0&tabs=http ).

EnglishRussianUkrainian