Skip to Content

Mailbox Usage

Reports mailbox size, item counts, quota thresholds, and last logon time for all user or shared mailboxes.

Usage

# Report on user mailboxes .\get-mailbox-usage.ps1 -MailboxType UserMailbox # Report on shared mailboxes .\get-mailbox-usage.ps1 -MailboxType SharedMailbox

Script

param( [Parameter(Mandatory=$true)] [ValidateSet("UserMailbox", "SharedMailbox")] [string]$MailboxType ) # Output path - dynamically set based on mailbox type $OutFile = ".\$MailboxType`Usage.csv" $RecipientTypeDetails = $MailboxType # Get only user mailboxes $mbxs = Get-EXOMailbox -ResultSize Unlimited -RecipientTypeDetails $RecipientTypeDetails ` -Properties DisplayName,PrimarySmtpAddress # Get mailbox statistics in bulk for efficiency # Note: Get-EXOMailboxStatistics doesn’t accept multiple identities at once, # so we pipeline and select needed fields. $results = $mbxs | ForEach-Object { $stats = Get-EXOMailboxStatistics -Identity $_.Identity # Calculate sizes in GB for readability $totalGB = [math]::Round(($stats.TotalItemSize.Value.ToBytes() / 1GB), 2) $quotaGB = $null $issueGB = $null $prohibitGB= $null # Pull quota values from mailbox (these can be 'Unlimited' or sized) $issueQuota = $_.IssueWarningQuota $prohibitQuota = $_.ProhibitSendQuota $prohibitRecp = $_.ProhibitSendReceiveQuota if ($issueQuota -and $issueQuota -ne "Unlimited") { $issueGB = [math]::Round(($issueQuota.ToBytes() / 1GB), 2) } if ($prohibitQuota -and $prohibitQuota -ne "Unlimited") { $prohibitGB = [math]::Round(($prohibitQuota.ToBytes() / 1GB), 2) } if ($prohibitRecp -and $prohibitRecp -ne "Unlimited") { $quotaGB = [math]::Round(($prohibitRecp.ToBytes() / 1GB), 2) } [pscustomobject]@{ UserPrincipalName = $_.UserPrincipalName DisplayName = $_.DisplayName PrimarySmtpAddress = $_.PrimarySmtpAddress MailboxType = $RecipientTypeDetails TotalItemCount = $stats.ItemCount TotalItemSizeGB = $totalGB DeletedItemCount = $stats.DeletedItemCount DeletedItemSizeGB = [math]::Round(($stats.TotalDeletedItemSize.Value.ToBytes() / 1GB), 2) LastLogonTime = $stats.LastLogonTime Database = $stats.Database IssueWarningQuotaGB = $issueGB ProhibitSendQuotaGB = $prohibitGB ProhibitSendRecvGB = $quotaGB } } # Export to CSV $results | Sort-Object DisplayName | Export-Csv -Path $OutFile -NoTypeInformation -Encoding UTF8 Write-Host "Export complete: $OutFile"

Output

Exports a CSV (UserMailboxUsage.csv or SharedMailboxUsage.csv) with:

  • UserPrincipalName / DisplayName / PrimarySmtpAddress
  • MailboxType
  • TotalItemCount / TotalItemSizeGB
  • DeletedItemCount / DeletedItemSizeGB
  • LastLogonTime
  • IssueWarningQuotaGB / ProhibitSendQuotaGB / ProhibitSendRecvGB

Sorted by DisplayName.

Last updated on