Здесь я уже писал о логах почтового сервера, но там вывод предполагался в файл csv. Все посты о Exchange можно найти по этому тегу.
Внезапная новость даже для меня: это сотый пост блога!
Виновник этого поста — скрипт для получения приятного отчёта о доставленной или отправленной почте через почтовый сервер Exchange в виде одиночного html файла с табличкой и простым оформлением на css.
Предполагается три режима работы:
- вывод лога получателя за последние $hours часов;
- вывод лога отправителя за последние $hours часов;
- вывод лога отправителя и получателя за последние $hours часов.
Переменная $hours хранит количество часов, которое отнимается от текущего момента. Можете поменять на любое удобное для Вас число.
## Заголовок окна консоли ##
[System.Console]::Title = "Логи почтового сервера"
## Имя почтового сервера (IP не указывать) ##
Write-Host "Рекомендуется указывать DNS имя почтового сервера Exchange!" -ForegroundColor Yellow -BackgroundColor Black
Write-Host
$server = Read-Host "Имя почтового сервера Exchange"
$ping = Test-Connection -ComputerName $server -Count 1 -Quiet
## Выборка (указывается в часах) ##
$hours = 24 # <== Можно менять
## Header HTML ##
$header = @"
<title>Журнал с сервера $server за последние $hours час(а/ов)</title>
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse; margin-left:auto; margin-right:auto}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #87cefa;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
H1 {text-align: center;}
</style>
"@
## Получение даты/времени ##
$date = [DateTime]::Now.ToString("yyyyMMdd-HHmmss")
## Подключение к серверу ##
if ($ping)
{
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://$server/PowerShell/ -Authentication Kerberos
Import-PSSession $session
## Цикл вывода меню ##
while($true)
{
Write-Host
Write-Host "1. Вывод лога получателя за последние $hours час(а/ов)" -ForegroundColor Green
Write-Host "2. Вывод лога отправителя за последние $hours час(а/ов)" -ForegroundColor Green
Write-Host "3. Вывод лога отправителя и получателя за последние $hours час(а/ов)" -ForegroundColor Green
Write-Host "4. Завершить работу скрипта" -ForegroundColor Red
Write-Host
$choice = Read-Host "Выберите вариант"
Write-Host
Switch($choice)
{
## Вывод лога получателя ##
1{
$filtermail = Read-Host "Почтовый ящик получателя"
$path = [Environment]::GetFolderPath("Desktop") + "\$date-$server-$filtermail.html"
Get-MessageTrackingLog -Start (Get-Date).AddHours(-$hours) -ResultSize unlimited |
Where-Object {[string]$_.recipients -like "$filtermail"} |
Sort-Object Timestamp | ## <== Сортировка по дате/времени
Select-Object @{Label="Дата/Время события"; Expression={$_.Timestamp}}, `
@{Label="Событие"; Expression={$_.EventId}}, `
@{Label="Источник"; Expression={$_.Source}}, `
@{Label="Отправитель"; Expression={$_.Sender}}, `
@{Label="Получатель"; Expression={$_.Recipients}}, `
@{Label="Тема письма"; Expression={$_.MessageSubject}} |
ConvertTo-Html -Head $header `
-PreContent "<H1>Журнал получения почтового ящика $filtermail за $hours час(а/ов)</H1>" |
Out-File $path -Verbose
}
## Вывод лога отправителя ##
2{
$filtermail = Read-Host "Почтовый ящик отправителя"
$path = [Environment]::GetFolderPath("Desktop") + "\$date-$server-$filtermail.html"
Get-MessageTrackingLog -Start (Get-Date).AddHours(-$hours) -ResultSize unlimited |
Where-Object {[string]$_.sender -like "$filtermail"} |
Sort-Object Timestamp | ## <== Сортировка по дате/времени
Select-Object @{Label="Дата/Время события"; Expression={$_.Timestamp}}, `
@{Label="Событие"; Expression={$_.EventId}}, `
@{Label="Источник"; Expression={$_.Source}}, `
@{Label="Отправитель"; Expression={$_.Sender}}, `
@{Label="Получатель"; Expression={$_.Recipients}}, `
@{Label="Тема письма"; Expression={$_.MessageSubject}} |
ConvertTo-Html -Head $header `
-PreContent "<H1>Журнал отправки почтового ящика $filtermail за $hours час(а/ов)</H1>" |
Out-File $path -Verbose
}
## Вывод лога отправителя и получателя ##
3{
$sender = Read-Host "Почтовый ящик отправителя"
$recipient = Read-Host "Почтовый ящик получателя"
$path = [Environment]::GetFolderPath("Desktop") + "\$date-$server-$sender-TO-$recipient.html"
Get-MessageTrackingLog -Start (Get-Date).AddHours(-$hours) -ResultSize unlimited `
-Sender $sender -Recipients $recipient |
Sort-Object Timestamp | ## <== Сортировка по дате/времени
Select-Object @{Label="Дата/Время события"; Expression={$_.Timestamp}}, `
@{Label="Событие"; Expression={$_.EventId}}, `
@{Label="Источник"; Expression={$_.Source}}, `
@{Label="Отправитель"; Expression={$_.Sender}}, `
@{Label="Получатель"; Expression={$_.Recipients}}, `
@{Label="Тема письма"; Expression={$_.MessageSubject}} |
ConvertTo-Html -Head $header `
-PreContent "<H1>Журнал отправки от отправителя $sender получателю $recipient за $hours час(а/ов)</H1>" |
Out-File $path -Verbose
}
## Завершить работу скрипта ##
4{ Exit }
## Неверный выбор ##
default { Write-Host "Неверный выбор. Попробуйте снова." -ForegroundColor Red }
}
}
}
else
{
Write-Host "Сервер $server недоступен!" -ForegroundColor Red
Write-Host
Read-Host "Нажмите любую клавишу для выхода..."
}
Html файл с результатом работы скрипта сохраняется на рабочий стол текущего пользователя.
Вторую часть поста читать здесь.