Mailbox Size Report

Modified on Tue, 30 Jun at 5:13 PM

<#

=============================================================================================

Name:           Microsoft 365 Mailbox Size Report

Description:    This script exports Microsoft 365 mailbox size report to CSV

Version:        2.0

website:        o365reports.com

Script by:      O365Reports Team

For detailed Script execution: https://o365reports.com/2020/10/21/export-office-365-mailbox-size-report-using-powershell/

============================================================================================

#>

Param

(

    [Parameter(Mandatory = $false)]

    [switch]$MFA,

    [switch]$SharedMBOnly,

    [switch]$UserMBOnly,

    [string]$MBNamesFile,

    [string]$UserName,

    [string]$Password

)


Function Get_MailboxSize

{

 $Stats=Get-MailboxStatistics -Identity $UPN

 $ItemCount=$Stats.ItemCount

 $TotalItemSize=$Stats.TotalItemSize

 $TotalItemSizeinBytes= $TotalItemSize –replace “(.*\()|,| [a-z]*\)”, “”

 $TotalSize=$stats.TotalItemSize.value -replace "\(.*",""

 $DeletedItemCount=$Stats.DeletedItemCount

 $TotalDeletedItemSize=$Stats.TotalDeletedItemSize


 #Export result to csv

 $Result=@{'Display Name'=$DisplayName;'User Principal Name'=$upn;'Mailbox Type'=$MailboxType;'Primary SMTP Address'=$PrimarySMTPAddress;'Archive Status'=$Archivestatus;'Item Count'=$ItemCount;'Total Size'=$TotalSize;'Total Size (Bytes)'=$TotalItemSizeinBytes;'Deleted Item Count'=$DeletedItemCount;'Deleted Item Size'=$TotalDeletedItemSize;'Issue Warning Quota'=$IssueWarningQuota;'Prohibit Send Quota'=$ProhibitSendQuota;'Prohibit send Receive Quota'=$ProhibitSendReceiveQuota}

 $Results= New-Object PSObject -Property $Result  

 $Results | Select-Object 'Display Name','User Principal Name','Mailbox Type','Primary SMTP Address','Item Count','Total Size','Total Size (Bytes)','Archive Status','Deleted Item Count','Deleted Item Size','Issue Warning Quota','Prohibit Send Quota','Prohibit Send Receive Quota' | Export-Csv -Path $ExportCSV -Notype -Append 

}


Function main()

{

 #Check for EXO v2 module inatallation

 $Module = Get-Module ExchangeOnlineManagement -ListAvailable

 if($Module.count -eq 0) 

 { 

  Write-Host Exchange Online PowerShell V2 module is not available  -ForegroundColor yellow  

  $Confirm= Read-Host Are you sure you want to install module? [Y] Yes [N] No 

  if($Confirm -match "[yY]") 

  { 

   Write-host "Installing Exchange Online PowerShell module"

   Install-Module ExchangeOnlineManagement -Repository PSGallery -AllowClobber -Force

  } 

  else 

  { 

   Write-Host EXO V2 module is required to connect Exchange Online.Please install module using Install-Module ExchangeOnlineManagement cmdlet. 

   Exit

  }

 } 


 #Connect Exchange Online with MFA

 if($MFA.IsPresent)

 {

  Connect-ExchangeOnline

 }


 #Authentication using non-MFA

 else

 {

  #Storing credential in script for scheduling purpose/ Passing credential as parameter

  if(($UserName -ne "") -and ($Password -ne ""))

  {

   $SecuredPassword = ConvertTo-SecureString -AsPlainText $Password -Force

   $Credential  = New-Object System.Management.Automation.PSCredential $UserName,$SecuredPassword

  }

  else

  {

   $Credential=Get-Credential -Credential $null

  }

  Connect-ExchangeOnline -Credential $Credential

 }


 #Output file declaration 

 $ExportCSV=".\MailboxSizeReport_$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv" 


 $Result=""   

 $Results=@()  

 $MBCount=0

 $PrintedMBCount=0

 Write-Host Generating mailbox size report...

 

 #Check for input file

 if([string]$MBNamesFile -ne "") 

 { 

  #We have an input file, read it into memory 

  $Mailboxes=@()

  $Mailboxes=Import-Csv -Header "MBIdentity" $MBNamesFile

  foreach($item in $Mailboxes)

  {

   $MBDetails=Get-Mailbox -Identity $item.MBIdentity

   $UPN=$MBDetails.UserPrincipalName  

   $MailboxType=$MBDetails.RecipientTypeDetails

   $DisplayName=$MBDetails.DisplayName

   $PrimarySMTPAddress=$MBDetails.PrimarySMTPAddress

   $IssueWarningQuota=$MBDetails.IssueWarningQuota -replace "\(.*",""

   $ProhibitSendQuota=$MBDetails.ProhibitSendQuota -replace "\(.*",""

   $ProhibitSendReceiveQuota=$MBDetails.ProhibitSendReceiveQuota -replace "\(.*",""

   #Check for archive enabled mailbox

   if(($MBDetails.ArchiveDatabase -eq $null) -and ($MBDetails.ArchiveDatabaseGuid -eq $MBDetails.ArchiveGuid))

   {

    $ArchiveStatus = "Disabled"

   }

   else

   {

    $ArchiveStatus= "Active"

   }

   $MBCount++

   Write-Progress -Activity "`n     Processed mailbox count: $MBCount "`n"  Currently Processing: $DisplayName"

   Get_MailboxSize

   $PrintedMBCount++

  }

 }


 #Get all mailboxes from Office 365

 else

 {

  Get-Mailbox -ResultSize Unlimited | foreach {

   $UPN=$_.UserPrincipalName

   $Mailboxtype=$_.RecipientTypeDetails

   $DisplayName=$_.DisplayName

   $PrimarySMTPAddress=$_.PrimarySMTPAddress

   $IssueWarningQuota=$_.IssueWarningQuota -replace "\(.*",""

   $ProhibitSendQuota=$_.ProhibitSendQuota -replace "\(.*",""

   $ProhibitSendReceiveQuota=$_.ProhibitSendReceiveQuota -replace "\(.*",""

   $MBCount++

   Write-Progress -Activity "`n     Processed mailbox count: $MBCount "`n"  Currently Processing: $DisplayName"

   if($SharedMBOnly.IsPresent -and ($Mailboxtype -ne "SharedMailbox"))

   {

    return

   }

   if($UserMBOnly.IsPresent -and ($MailboxType -ne "UserMailbox"))

   {

    return

   }  

   #Check for archive enabled mailbox

   if(($_.ArchiveDatabase -eq $null) -and ($_.ArchiveDatabaseGuid -eq $_.ArchiveGuid))

   {

    $ArchiveStatus = "Disabled"

   }

   else

   {

    $ArchiveStatus= "Active"

   }

   Get_MailboxSize

   $PrintedMBCount++

  }

 }


 #Open output file after execution 

 If($PrintedMBCount -eq 0)

 {

  Write-Host No mailbox found

 }

 else

 {

  Write-Host `nThe output file contains $PrintedMBCount mailboxes.

  if((Test-Path -Path $ExportCSV) -eq "True") 

  {

   Write-Host `nThe Output file available in $ExportCSV -ForegroundColor Green

   $Prompt = New-Object -ComObject wscript.shell   

  $UserInput = $Prompt.popup("Do you want to open output file?",`   

 0,"Open Output File",4)   

  If ($UserInput -eq 6)   

   {   

    Invoke-Item "$ExportCSV"   

   } 

  }

 }

 #Disconnect Exchange Online session

 Disconnect-ExchangeOnline -Confirm:$false | Out-Null

}

 . main


Was this article helpful?

That’s Great!

Thank you for your feedback

Sorry! We couldn't be helpful

Thank you for your feedback

Let us know how can we improve this article!

Select at least one of the reasons
CAPTCHA verification is required.

Feedback sent

We appreciate your effort and will try to fix the article