Update: 2017-08-16 – I have published a new version of this script here
This is a simple PowerShell script that pulls all of the send/received e-mails from the Message Tracking log in Exchange 2010 and counts the unique header IDs.
It’s fairly accurate but I don’t think it’s 100% bang on. My testing showed the numbers generated to be off by about 10%.
This script was built for generic mailboxes but should work on individual mailboxes as well.
#################################### # Exchange 2010 send/receive weekly report generator # Created by: Eric Schewe # Created on: 2014-10-02 # #################################### # Summary: # This script will count the unique message IDs send and recieved by a mailbox # on a weekly basis and e-mail a report to the designated recipients. We are # specifically using this script to track mailflow to and from a generic account # in our enviroment. # # This script is meant to be run on a Monday so it can gather the previous weeks # e-mails (Monday - Sunday). # #################################### # Instructions: # 1. Set $mailbox to the generic account you want stats from # 2. Set $emailFrom to the e-mail address that the report will be sent from # 3. Set $emailTo to the people who will receive the report # 4. Set $smtpServer to a SMTP server you can send e-mail from # #################################### #Powershell Garbage $nl = [Environment]::NewLine #Mailbox to gather stats on $mailbox="" #Get todays date twice $startDate=Get-Date $endDate=Get-Date #Subtract 1 day from todays date (report ending day) and 7 days from todays date (report starting day) $startDateFormatted=$startDate.AddDays(-7).ToShortDateString() $endDateFormatted=$endDate.AddDays(-1).ToShortDateString() #Who to send the e-mail report to. #Multiple e-mail addresses should be in this format "<[email protected]>, <[email protected]>" $emailFrom = "[email protected]" $emailTo = "" $subject = "Weekly e-mail report for $mailbox for $startDateFormatted - $endDateFormatted" $smtpServer = "" # Sent e-mails $sendCount = Get-TransportServer | Get-MessageTrackingLog -Start "$startDateFormatted 00:00:00" -End "$endDateFormatted 23:59:59" -Sender $mailbox -resultsize unlimited | select-object -unique MessageId # Received e-mails - This works but not on generic accounts $receiveCount = Get-TransportServer | Get-MessageTrackingLog -Start "$startDateFormatted 00:00:00" -End "$endDateFormatted 23:59:59" -Recipients $mailbox -resultsize unlimited | select-object -unique MessageId $sendCountString = $sendCount.count $receiveCountString = $receiveCount.count $body = "Mailbox stats for: $mailbox $nl Report date range: $startDateFormatted 00:00:00 - $endDateFormatted 23:59:59 $nl Total e-mails sent: $sendCountString $nl Total e-mails received: $receiveCountString" $smtp = new-object Net.Mail.SmtpClient($smtpServer) $smtp.Send($emailFrom, $emailTo, $subject, $body)
I have a scheduled task configured on one of our Exchange servers that runs this every Monday morning and provide me the stats on a generic mailbox for the previous week (Monday – Sunday).