Количество отправленных и полученных писем по дням
Возникла потребность просмотреть на сервере exchange сколько писем отправляют и получают пользователи по дням со статистикой в мегабайтах, после изучения интернета был найден скрипт Nuno Mota не устроило что скрипт делает текстовый вывод, что не удобно для постоянного использования и для генерации html отчетов. Скрипт был переработан:
![3e26ef4dc5c8478994670d9363ab8a8c.jpg](https://habrastorage.org/files/3e2/6ef/4dc/3e26ef4dc5c8478994670d9363ab8a8c.jpg)
Получение количества отправленных и полученных писем по дням с exchange сервера.
Чтобы получить красивый html отчет, например чтобы отправить по почте ниже дополненный скрипт:
Последний сгенерирует html-файл и положит по дефолту в каталог С.
- вывод сделан объектами
- добавлены поля
- исправлен баг когда первая запись выводилась неправильно
![3e26ef4dc5c8478994670d9363ab8a8c.jpg](https://habrastorage.org/files/3e2/6ef/4dc/3e26ef4dc5c8478994670d9363ab8a8c.jpg)
Получение количества отправленных и полученных писем по дням с exchange сервера.
#### Variables #####
# период за который будем смотреть статистику, считается от сегодня
$PeriodIndays = 7
# если пишешь вручную помни что дата задается наоброт ММ/ДД/ГГГГ тоесть "09/5/2016"
$StartPeriod = (Get-Date).AddDays( -$PeriodIndays )
# дата по которую смотрим, должна быть меньше чем стартовая
$EndPeriod = $StartPeriod.AddDays( $PeriodIndays )
####################################################################################
$From = $StartPeriod
$To = $EndPeriod
[Int64] $intSent = 0
[Int64] $intRec = 0
[Int64] $intSentSize = 0
[Int64] $intRecSize = 0
$Total = 0
$TotalSent = 0
$TotalRec = 0
$MailPerDay = @()
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
Do {
$From = $From.AddDays(1)
$To = $From.AddDays(1)
$intSent = $intRec = $intSentSize = $intRecSize = 0
(Get-TransportServer) | Get-MessageTrackingLog -ResultSize Unlimited -Start $From -End $To | ForEach {
# Sent E-mails
If ($_.EventId -eq "RECEIVE" -and $_.Source -eq "STOREDRIVER")
{
$intSent++
$intSentSize += $_.TotalBytes
}
# Received E-mails
If ($_.EventId -eq "DELIVER")
{
$intRec++
$intRecSize += $_.TotalBytes
}
}
$props = [ordered]@{ Date=$From
Sent=$intSent
SentSizeMB=[Math]::Round($intSentSize/1MB, 0)
Recived=$intRec
RecivedSizeMB=[Math]::Round($intRecSize/1MB, 0)
TotalPerDayInMB=[Math]::Round(($intRecSize+$intSentSize)/1MB, 2)
TotalPerDayInGB=[Math]::Round(($intRecSize+$intSentSize)/1GB, 2)
}
$obj = New-Object -TypeName PSObject -Property $props
$MailPerDay += $obj
$TotalSent += $intSentSize
$TotalRec += $intRecSize
} While ($To -lt (Get-Date))
$MailPerDay | ft
Write-Host "всего отправлено за отчетный период $([Math]::Round( $TotalSent/1GB, 2)) гигабайт"
Write-Host "всего получено за отчетный период $([Math]::Round( $TotalRec/1GB, 2)) гигайбайт"
Write-Host "всего получено и отправлено за период $([Math]::Round( ($TotalSent + $TotalRec)/1GB, 2)) гигабайт"
Чтобы получить красивый html отчет, например чтобы отправить по почте ниже дополненный скрипт:
#### Variables #####
# период за который будем смотреть статистику, считается от сегодня
$PeriodIndays = 7
# если пишешь вручную помни что дата задается наоброт ММ/ДД/ГГГГ тоесть "09/5/2016"
$StartPeriod = (Get-Date).AddDays( -$PeriodIndays )
# дата по которую смотрим, должна быть меньше чем стартовая
$EndPeriod = $StartPeriod.AddDays( $PeriodIndays )
# путь до html файла
$PathFile = 'c:\EmailSendAndrecived.html'
####################################################################################
$From = $StartPeriod
$To = $EndPeriod
[Int64] $intSent = 0
[Int64] $intRec = 0
[Int64] $intSentSize = 0
[Int64] $intRecSize = 0
$Total = 0
$TotalSent = 0
$TotalRec = 0
$MailPerDay = @()
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
Do {
$From = $From.AddDays(1)
$To = $From.AddDays(1)
$intSent = $intRec = $intSentSize = $intRecSize = 0
(Get-TransportServer) | Get-MessageTrackingLog -ResultSize Unlimited -Start $From -End $To | ForEach {
# Sent E-mails
If ($_.EventId -eq "RECEIVE" -and $_.Source -eq "STOREDRIVER")
{
$intSent++
$intSentSize += $_.TotalBytes
}
# Received E-mails
If ($_.EventId -eq "DELIVER")
{
$intRec++
$intRecSize += $_.TotalBytes
}
}
$props = [ordered]@{ Date=$From
Sent=$intSent
SentSizeMB=[Math]::Round($intSentSize/1MB, 0)
Recived=$intRec
RecivedSizeMB=[Math]::Round($intRecSize/1MB, 0)
TotalPerDayInMB=[Math]::Round(($intRecSize+$intSentSize)/1MB, 2)
TotalPerDayInGB=[Math]::Round(($intRecSize+$intSentSize)/1GB, 2)
}
$obj = New-Object -TypeName PSObject -Property $props
$MailPerDay += $obj
$TotalSent += $intSentSize
$TotalRec += $intRecSize
} While ($To -lt (Get-Date))
$MailPerDay | ft
Write-Host "всего отправлено за отчетный период $([Math]::Round( $TotalSent/1GB, 2)) гигабайт"
Write-Host "всего получено за отчетный период $([Math]::Round( $TotalRec/1GB, 2)) гигайбайт"
Write-Host "всего получено и отправлено за период $([Math]::Round( ($TotalSent + $TotalRec)/1GB, 2)) гигабайт"
############# HTML generating #############
$frag1 = $MailPerDay | sort -Property Date -Descending | ConvertTo-Html -As table -Fragment -PreContent "всего получено за период $([Math]::Round( $TotalSent/1GB, 2))
всего отправлено за период $([Math]::Round( $TotalRec/1GB, 2))
всего отправлено и получено за период $([Math]::Round( ($TotalSent + $TotalRec)/1GB, 2))
" | Out-String
Write-Verbose 'definiting CSS'
$head = @'
'@
$Date = Get-Date
$rep = ConvertTo-HTML -head $head -PostContent $frag1 -PreContent "Email Sent recived $Date
" | Out-String
$rep | Out-File $PathFile
Последний сгенерирует html-файл и положит по дефолту в каталог С.
Комментарии (3)
19 сентября 2016 в 14:59
0↑
↓
Get-TransportServer лучше заменить на Get-TransportService, т.к. он скоро будет исключенТак же неплохо было бы исключить из общей статистики письма HealthMailbox и inboundproxy
19 сентября 2016 в 15:01
0↑
↓
может стать несовместимым с exchange 201019 сентября 2016 в 15:18
0↑
↓
хм, действительно, только начиная с 2013.Еще наверное удобнее время считать с начала дня, что-то вроде этого:
$EndPeriod = (Get-date -hour 0 -minute 0 -second 0)
$StartPeriod = ($EndPeriod).AddDays( -$PeriodIndays )