Отчёт о прочтении письма пользователем
1.Узнаём MessageID письма.
Get-MessageTrackingLog -Sender mike.nash@contoso.com -MessageSubject "Company newsletter" -Start (Get-Date).AddHours(-48) -EventId RECEIVE | Select MessageID
2.Ищем по MessageID
$msg = Search-MessageTrackingReport -Identity mike.nash@contoso.com -BypassDelegateChecking -MessageId b4699b83d1084712b2b746582ceedc15@contoso.com $report = Get-MessageTrackingReport -Identity $msg.MessageTrackingReportId -BypassDelegateChecking $report.RecipientTrackingEvents[0] $report.RecipientTrackingEvents | Select RecipientDisplayName,Status
3. Получаем отчёт по сообщению.
Get-MessageTrackingReport -Identity $msg.MessageTrackingReportId -BypassDelegateChecking -RecipientPathFilter jim.daly@contoso.com -ReportTemplate RecipientPath $recipienttrackingevents = @($report | Select -ExpandProperty RecipientTrackingEvents) $recipients = $recipienttrackingevents | select recipientaddress
4. Смотрим общий отчёт
foreach ($recipient in $recipients) { $events = Get-MessageTrackingReport -Identity $msg.MessageTrackingReportId -BypassDelegateChecking ` -RecipientPathFilter $recipient.RecipientAddress -ReportTemplate RecipientPath $events.RecipientTrackingEvents[-1] | Select RecipientAddress,Status,EventDescription }
Скрипт
https://github.com/cunninghamp/Powershell-Exchange/tree/master/Get-MessageReadStatusReport
С какого клиента было отравлено письмо?
function Get-MessageClientType { <# .SYNOPSIS Определяет тип клиента, с которого было отправлено сообщение. .DESCRIPTION Анализирует поле SourceContext в логах отслеживания сообщений Exchange и возвращает ClientType с расшифровкой. .EXAMPLE Get-MessageTrackingLog ... | Get-MessageClientType #> begin { # Таблица расшифровок $ClientMap = @{ 'AirSync' = 'ActiveSync (мобильный клиент)' 'OWA' = 'Outlook Web Access (через браузер)' 'MOMT' = 'Outlook (MAPI или Cached Mode)' 'POP3' = 'POP3 клиент' 'IMAP4' = 'IMAP клиент' 'Hub' = 'Hub Transport' 'SMTP' = 'SMTP подключение' 'EAS' = 'Exchange ActiveSync' 'Submission' = 'Подача через сервер' 'StoreDriver' = 'Внутренний транспорт Exchange' } } process { $_ | Where-Object { $_.SourceContext -match "ClientType" } | Select-Object ` TimeStamp, Sender, Recipients, MessageSubject, @{Name = 'ClientTypeCode'; Expression = { if ($_.SourceContext -match 'ClientType:([A-Za-z0-9_]+)') { $matches[1] } else { 'Unknown' } }}, @{Name = 'ClientTypeDescription'; Expression = { $type = if ($_.SourceContext -match 'ClientType:([A-Za-z0-9_]+)') { $matches[1] } else { 'Unknown' } if ($ClientMap.ContainsKey($type)) { $ClientMap[$type] } else { "Неизвестный тип ($type)" } }} } } # --- Примеры использования --- # Группы серверов $Piter = "server11","server12","server13" $Moscow = "server21","server22","server23" $All = $Piter + $Moscow # --- Поиск письма по получателю --- $All | Get-MessageTrackingLog ` -Start "10/01/2025 0:00" ` -Source STOREDRIVER ` -Recipient "myuser@mydomain.ru" ` -MessageSubject "Тема письма" ` -ResultSize Unlimited | Get-MessageClientType | Format-Table -AutoSize # --- Поиск письма по отправителю --- $All | Get-MessageTrackingLog ` -Start "10/01/2025 0:00" ` -Source STOREDRIVER ` -EventId SUBMIT ` -Sender "myuser@mydomain.ru" ` -MessageSubject "Тема письма" ` -ResultSize Unlimited | Select-Object TimeStamp, EventId, Source, ServerHostName, Sender, @{Name="Recipients";Expression={$_.Recipients}}, MessageSubject, SourceContext | Get-MessageClientType | Out-GridView -Title "Результаты по типу клиента"