Количество отправленных и полученных писем по дням

Возникла потребность просмотреть на сервере exchange сколько писем отправляют и получают пользователи по дням со статистикой в мегабайтах, после изучения интернета был найден скрипт Nuno Mota не устроило что скрипт делает текстовый вывод, что не удобно для постоянного использования и для генерации html отчетов. Скрипт был переработан:
  • вывод сделан объектами
  • добавлены поля
  • исправлен баг когда первая запись выводилась неправильно

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 отчет, например чтобы отправить по почте ниже дополненный скрипт:

7c37cafce8724fb7ab8d190d10f0d60e.jpg


#### 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 2010
      • 19 сентября 2016 в 15:18

        0

        хм, действительно, только начиная с 2013.

        Еще наверное удобнее время считать с начала дня, что-то вроде этого:

        $EndPeriod = (Get-date -hour 0 -minute 0 -second 0)
        $StartPeriod = ($EndPeriod).AddDays( -$PeriodIndays )

© Habrahabr.ru