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 SharedMailboxScript
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/PrimarySmtpAddressMailboxTypeTotalItemCount/TotalItemSizeGBDeletedItemCount/DeletedItemSizeGBLastLogonTimeIssueWarningQuotaGB/ProhibitSendQuotaGB/ProhibitSendRecvGB
Sorted by DisplayName.
Last updated on