Email server script

This topic contains 2 replies, has 2 voices, and was last updated by Profile photo of Karl Forster Karl Forster 5 months, 2 weeks ago.

Viewing 3 posts - 1 through 3 (of 3 total)
  • Author
    Posts
  • #37402
    Profile photo of Karl Forster
    Karl Forster
    Participant

    Hi Everyone

    We are going through a rebrand at the moment and was asked by my Head of IT to produce a report from exchange 2007 to list out all the SMTP addresses for each user, fairly straight forward task.

    Then he asked me to add extra statistics
    For each email SMTP addresses he wanted to know how many emails were Received from external addresses, Sent to external addresses and received internally.

    The reason for these extra tasks were to do a cleanup of the environment at the same time.

    Below is my code that I have created, just wondering if anyone had comments on the code or better ways to do it.

    Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin
    
    # Output File
    $strOutFile = ".\MailboxExport.csv"
    
    #Gets all mailboxes with 
    $mailboxes = get-recipient -resultsize unlimited | get-mailbox -resultsize unlimited | Select Name, forwardingaddress -ExpandProperty EmailAddresses | select name, SMTPaddress, forwardingaddress
    
    #Gets message tracking last 30 days count for recieved SMTP items based on external email address 
    
    $output = @()
    foreach ($mailbox in $mailboxes)
    {
    
    #Count for Recieved emails from External SMTP Addresses
    $RecievedExternal = Get-MessageTrackingLog -server mail5 -eventid "RECEIVE" -start ((get-date).adddays(-30)) -recipients $mailbox.SMTPaddress | where {$_.source -eq "SMTP" -AND $_.Recipients -eq $mailbox.SMTPaddress} | measure | select count
    
    #Count for Sent emails to External SMTP Addresses
    $Sent = Get-MessageTrackingLog -server mail5 -eventid "SEND" -start ((get-date).adddays(-30)) -Sender $mailbox.SMTPaddress | where {$_.source -eq "SMTP" -AND $_.Sender -eq $mailbox.SMTPaddress} | measure | select count
    
    ##Count for Recieved emails on internal server
    $RecievedInternal = Get-MessageTrackingLog -server mail5 -eventid "RECEIVE" -start ((get-date).adddays(-30)) -Recipients $mailbox.SMTPaddress | where {$_.source -eq "STOREDRIVER" -AND $_.Recipients -eq $mailbox.SMTPaddress} | measure | select count
    
    #Build the custom array
    $output = "" | Select-Object Name, SMTPAddress, Forwardingaddress, RecievedExternal, Sent
    $output.Name = $mailbox.name
    $output.SMTPaddress = $mailbox.SMTPaddress
    $output.forwardingaddress = $mailbox.forwardingaddress
    $output.RecievedExternal = $RecievedExternal.count
    $output.Sent = $Sent.count
    $output.RecievedInternal = $RecievedInternal.count
    
    #Export to CSV File
    $output | export-csv -Append $strOutFile
    }
    
    #37410
    Profile photo of Dave Wyatt
    Dave Wyatt
    Moderator

    Looks reasonable to me. You might get a slight performance increase, if you're running at least PowerShell v3, by slightly tweaking how you create your objects:

        $output = [pscustomobject] @{
            Name              = $mailbox.Name
            SMTPaddress       = $mailbox.SMTPaddress
            forwardingaddress = $mailbox.forwardingaddress
            RecievedExternal  = $RecievedExternal.count
            Sent              = $Sent.count
            RecievedInternal  = $RecievedInternal.Count
        }
    
    #37414
    Profile photo of Karl Forster
    Karl Forster
    Participant

    Thanks for taking the time to review the script Dave, will give that a try.

    Karl

Viewing 3 posts - 1 through 3 (of 3 total)

You must be logged in to reply to this topic.