Недавно прилетел кейс: « Можем ли мы получать статус письма (прочтенне прочтен) не зависимо от того, было ли включено ‘Уведомление о прочтении’ во время отправки, и нажал ли пользователь на уведомление о прочтении или нет? «. В этой статье поговорим об отслеживании статуса прочтения писем в on-prem Exchange Server и несколько слов об этой функции в Exchange Online (Microsoft 365).
Для чего может понадобится получать статус прочтения сообщения?
Можно ли получить статус прочтения письма в ящике Exchange независимо от того, запросил ли отправитель уведомление о прочтении?
Рассмотрим, как получить статус прочтения письма пользователем в ящике 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
В нашем примере письмо от этого отправителя с этой темой было отправлено несколько раз за последние 48 часов. Можно применить другие фильтры для получения точного MessageID.
А можно сделать проще — открыть нужное письмо в Outlook, нажать Файл — Свойства, и найти в пункте «Заголовки интернета» Message-ID письма.
Далее откройте Exchange Management Shell и запустите скрипт Get-MessageReadStatusReport.ps1 (выложен ниже). Нужно указать имя ящика и Message-ID письма.
В итоге вы получите 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
Сам скрипт 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 с помощью с помощью PowerShell модуля Exchange Online я проверил, включено ли в Exchange Online отслеживание статуса прочтения писем. По-умолчанию опция messageTrackingReadStatusEnabled включена для всех ящиков в тенанте.
Get-EXOMailbox -Properties messageTrackingReadStatusEnabled|select UserPrincipalName,messageTrackingReadStatusEnabled
В скрипт нужно внести изменения, т.к. для отслеживания писем в 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 ).
Если говорить о том, какие лучшие дистрибутивы Linux мы знаем, то этот список может быть…
Хотя Ubuntu и поставляется со встроенным обозревателем Firefox многие пользователи считают что это не самая…
Что такое Remmina? Remmina — это совершенно бесплатный и свободный клиент так называемого удаленного рабочего…
Как мы знаем, Ubuntu это самая популярная сборка из систем на базе ядра Linux. У…
Выбор ноутбука для каждого пользователя это довольно кропотливый процесс. Люди стараются подобрать ноутбук который будет…
Если вы решили ознакомиться с операционной системой Linux более детально и задались вопросом как установить…