Viewing total incoming/outgoing email statistics

Posted: January 26, 2012 in Exchange 2010, Powershell
Tags: , , , , , , , , , , , , , , , , , ,

The follwing script generates e-mail statistics of your exchange environment looking like this:
(Download the script HERE!)

Generated on Server: MAILSERVER
Date: 17.01.2012
Sent mails: 532435
Size of sent mails: 4.419,24 MB
Size of biggest mail out: 21,74 MB
Average size out: 217,69 KB
Quantity incoming mails: 66496
Size of received mails : 4.609,09 MB
Size of biggest mail in: 22,52 MB
Average size in : 161,96 KB
Overall quantity : 43172
Overall size : 9.028,33 MB

You have to change the following parameters:

$SmtpClient.Host = “YOUR_HT_SERVER”
$mailmessage.from = “Exchange_2010_NoReply@YOURDOMAIN.COM”
# $mailmessage.CC.add(“CC_RECIPIENT@YOURDOMAIN.COM”)
$mailmessage.Subject = “Exchange daily message Report

$Localhost = $env:COMPUTERNAME
#Load Exchange PS Snapin
If ((Get-PSSnapin | Where-Object {$_.Name -eq “Microsoft.Exchange.Management.PowerShell.E2010”} ).name -eq ‘Microsoft.Exchange.Management.PowerShell.E2010’)
Write-Host “Exchange Snapin is already loaded….”

Write-Host “Loading Exchange Snapin Please Wait….”; Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
Write-Host “running…”

$hubs = Get-TransportServer

# Get the start date for the tracking log search
$Start = (Get-Date -Hour 00 -Minute 00 -Second 00).AddDays(-1)

# Get the end date for the tracking log search
$End = (Get-Date -Hour 23 -Minute 59 -Second 59).AddDays(-1)

$Datum = $Start.ToShortDateString()

$receive = $hubs | get-messagetrackinglog -Start $Start -End $End -EventID “RECEIVE” -ResultSize Unlimited | select Sender,RecipientCount,TotalBytes,Recipients
$send = $hubs | get-messagetrackinglog -Start $Start -End $End -EventID “SEND” -ResultSize Unlimited | select Sender,RecipientCount,TotalBytes
$mreceive = $receive | Measure-Object TotalBytes -maximum -minimum -average -sum
$msend = $send | Measure-Object TotalBytes -maximum -minimum -average -sum

$anzahl = $mreceive.count + $msend.count
$volumen = ($mreceive.sum + $msend.sum) / (1024 * 1024)

$volumen = “{0:N2}” -f $volumen + ” MB”

$msendmb = $msend.sum / (1024 * 1024)
$vsend = “{0:N2}” -f $msendmb + ” MB”
$bigsend = $msend.maximum / (1024 * 1024)
$avsend = $msend.average / 1024

$bigsendmb = “{0:N2}” -f $bigsend + ” MB”
$avsendkb = “{0:N2}” -f $avsend + ” KB”

$mreceivemb = $mreceive.sum / (1024 * 1024)
$vreceive = “{0:N2}” -f $mreceivemb + ” MB”
$bigreceive = $mreceive.maximum / (1024 * 1024)
$avreceive = $mreceive.average / 1024

$bigreceivemb = “{0:N2}” -f $bigreceive + ” MB”
$avreceivekb = “{0:N2}” -f $avreceive + ” KB”

#$senders = $send | Group-Object Sender | Sort-Object Count -Descending
#$topsender = $senders[0].Name
#$topsender += $senders[0].Count

#$receivers = $receive | Group-Object Recipients | Sort-Object Count -Descending
#$topreceiver = $receivers[0]

$computer = gc env:computername
$obj = new-object psObject

$obj |Add-Member -MemberType noteproperty -Name “Generated on server:” -Value $Computer
$obj |Add-Member -MemberType noteproperty -Name “Date :” -Value $Datum
$obj |Add-Member -MemberType noteproperty -Name “Sent mails :” -Value $msend.Count
$obj |Add-Member -MemberType noteproperty -Name “Size of sent mails:” -Value $vsend
$obj |Add-Member -MemberType noteproperty -Name “Size of biggest mail out:” -value $bigsendmb
$obj |Add-Member -MemberType noteproperty -Name “Average size out :” -value $avsendkb
$obj |Add-Member -MemberType noteproperty -Name “Quantity incoming mails :” -Value $mreceive.Count
$obj |Add-Member -MemberType noteproperty -Name “Size of received mails :” -Value $vreceive
$obj |Add-Member -MemberType noteproperty -Name “Size of biggest mail in :” -value $bigreceivemb
$obj |Add-Member -MemberType noteproperty -Name “Average size in :” -value $avreceivekb
$obj |Add-Member -MemberType noteproperty -Name “Overall quantity :” -Value $anzahl
$obj |Add-Member -MemberType noteproperty -Name “Overall size :” -Value $volumen

$out = $Datum + “;” + $msend.count + “;” + $vsend + “;” + $mreceive.count + “;” + $vreceive + “;” + $anzahl + “;” + $volumen
$out | out-file c:\daily.csv -append -encoding default

function sendmail($body)
$SmtpClient = new-object
$MailMessage = New-Object
$SmtpClient.Host = “YOUR_HT_SERVER”
$mailmessage.from = “Exchange_2010_NoReply@YOURDOMAIN.COM”
# $mailmessage.CC.add(“CC_RECIPIENT@YOURDOMAIN.COM”)
$mailmessage.Subject = “Exchange daily message Report $Datum”
$MailMessage.IsBodyHtml = $false
$mailmessage.Body = $body


$obj = $obj -replace(“@{“,””)
$obj = $obj -replace(“=”,”:`t”)
$obj = $obj -replace(“; “,”`n”)
$obj = $obj -replace(“}”,”`n”)

sendmail $obj


  1. Hamid Aiche says:

    Hi Chris,

    I have tested your script just right now ! It works great.

    Thanks for the good job

  2. John Smith says:


    Why have you commented out in your script topsenders and topreceivers ?

    • Chris says:

      Hi John,

      I commented it out because we’re using mailgateways in front of our Exchange environment an this mailgateways always would be our topsenders/topreceivers so this information isn’t useful in this envrionment.



  3. Aleks says:

    Could you please add thi code in a raw format, or as an attachment ? As copy/paste breaks the formatting! Example ″ becomes “?” when pasted and etc. Thank you

  4. Chappe says:

    Great script to have an overview of the mail traffic.

    One question this script also count the system email like mailbox quota messages, delivery and read receipts, etc?


  5. Leif says:

    Hi Chris,
    I have tested your script and it is a good one. You get a good overview of the email traffic. I have one question. This script counts all email right? This means that system generated messages (mailbox quota messages, delivery and read receipts, etc) are also counted?


  6. Jeremy says:

    After changing the mentioned parameters, I ran your script on my Exchange 2007 server running Server 2003 x64, but all the totals come back with no totals — “0.00MB” or “0.00KB”.

    Also, I’d like to use date range, such as monthly total. I’ve tried to adjust the .AddDays(-1) start date to (-31), but no changes.

    Any ideas?

  7. Jeremy says:

    Ah! I found my problem. Your script is for Exchange 2010 and to run with Exchange 2007, I needed to change “Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010” to “Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin”.

    I substituted “Admin” for “.E2010” in all references and the script ran great.

    Thank you again for the script!! And thank you for sharing with the IT world!

  8. Huseyin Unal says:

    Hiya Chris,

    Great work! Thanks a lot

  9. Nec Camargo says:

    Hello Chris,

    It works like a charm but when I enable #$topsender and #$topreceiver it stuck at running state.

    Do you have any idea about that issue?


  10. Christian says:

    Hello Chris,

    Thanks for sharing!

    A question about the parameters to fill in:
    $mailmessage.from = “Exchange_2010_NoReply@YOURDOMAIN.COM”
    # $mailmessage.CC.add(“CC_RECIPIENT@YOURDOMAIN.COM”)

    Do i need to fill in a specific account?

    Thanks in advance.

    • Christian says:

      Hello Chris,

      Or do i just need to fill in mij


      • Chris says:

        Hi Chrisitan,

        you have to fill out sender AND recipient matching to your domain. E.g. $mailmessage.from = “”

        Cheers, Chris

  11. Nec Camargo says:

    Hi Chris,

    We would like to add top senders and top receivers to the reports, is it enough to add following two lines to the script and remove # from the $topsender and $topreceiver?

    $obj |Add-Member -MemberType noteproperty -Name “Top senders :” -Value $topsender
    $obj |Add-Member -MemberType noteproperty -Name “Top receivers :” -Value $topreceiver



  12. Almir says:

    By adding -Recipients or -Sender params the repport can be spesified by account. Thanks for sharing!

  13. Pelin says:

    Hi Chris,
    Important correction: EventID RECEIVE is not for received emails, it is for sent emails. You should replace RECEIVE as DELIVER to get the correct number of received emails.
    BTW, Senders include internal and external senders, so it is total of inbound and outbound traffic, not only outbound.
    Your scripts counts senders (inbound and outbound) and recipients (internal), you might need to change your titles accordingly.

  14. Sam says:

    hi chris,

    We have exchange 2007 on windows 2003. Will this script work .


  15. david says:

    How to find the sent item counts for shared mailbox?

  16. Tash bhairo says:

    hi, quick question, what date range is this calculating on? is only one day? as per # Get the start date for the tracking log search
    $Start = (Get-Date -Hour 00 -Minute 00 -Second 00).AddDays(-1)

    # Get the end date for the tracking log search
    $End = (Get-Date -Hour 23 -Minute 59 -Second 59).AddDays(-1

    is there no way to calculate for an entire month?

  17. […] Viewing total incoming/outgoing email statistics (Script) […]

  18. Suzy I says:

    Hi Chris, thank you for being so kind as to put this out there!

    I have a shared mail box in outlook 2010 and I want to calculate how many emails have come into the inbox over a 7 day / week period and mail me the result – is this possible? Ive tried all combos of all the information above but not luck, just lots of errors…


  19. Keith Robitaille says:

    Hello Chris,

    Thank-you for the useful script.

    What can be done to modify the script to pull date from an entire month or manually specifying a specific day ?



    • salvador mateu says:

      hi Keith
      I had the same question and playing around with numbers I found if you change the last number you get as many days you want, in this example I got a month 30 days

      # Get the start date for the tracking log search
      $Start = (Get-Date -Hour 00 -Minute 00 -Second 00).AddDays(-30)

      I hope this help

    • salvamate78 says:

      # Get the start date for the tracking log search
      $Start = (Get-Date -Hour 00 -Minute 00 -Second 00).AddDays(-30)

      change the number at the end and you can get a month

  20. John says:

    Why does the subject need modifying? I get an error after running the script for the subject.
    $mailmessage.Subject = “Exchange daily message Report

    Error: The term ‘â?oExchange’ is not recognized as the name of a cmdlet, function, script file, or operable program.

  21. Deepak Rai says:

    I tried to run it but its showing error as below:please suggest:
    Exception calling “Send” with “1” argument(s): “The SMTP server requires a secu
    re connection or the client was not authenticated. The server response was: 5.7
    .1 Client was not authenticated”
    At E:\MailFlow\TotalEmailsSentReceivedPerDay.ps1:89 char:21
    + $smtpclient.Send <<<< ($mailmessage)
    + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

  22. David Hepler says:

    For those looking to increase the range of the search beyond one day… Keep in mind the $Start is the past day and $end is today. He uses a strange to me way of getting those but Im no PS expert. If you change $Start = (Get-Date -Hour 00 -Minute 00 -Second 00).AddDays(-30) It will pull 30 days as long as your logs go back that far.

  23. Subhas says:

    hi how do i set a date range? i.e. i need stats for a month’s worth of emails…any help would be most appreciated.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s