Skip to main content

Monitor Site Collections Storage Usage

Inspired by Salaudeen Rajack

<#
.SYNOPSIS
Monitor Site Collections storage usage and send an email.
.DESCRIPTION
Monitor Site Collections storage usage and send an email with sites over the designated storage threshold.
.EXAMPLE
PS C:\> Send-SiteCollectionStorageReport -storageThreshold 60 -sendTo john.smith@contoso.com
Running this function with send an email to John Smith with all the sites over 60% storage used.
.INPUTS
Inputs (if any)
.OUTPUTS
Output (if any)
.NOTES
None.
#>
function Send-SiteCollectionStorageReport {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true, HelpMessage = "Number for the threshold percentage (i.e.: 50 for every sites above 50% storage used")]
[int]$storageThreshold,
[Parameter(Mandatory = $true, HelpMessage = "User email address to send the report to")]
[string]$sendTo
)
#Declare variables
$allSites = m365 spo site list | ConvertFrom-Json
$largeSites = $allSites | Where-Object { $_.StorageUsage -gt 1 }
$results = @()

# Format the headers for the email
$style = "<style>BODY{font-family: Arial; font-size: 10pt;}"
$style = $style + "TABLE{border: 1px solid black; border-collapse: collapse;}"
$style = $style + "TH{border: 1px solid black; background: #dddddd; padding: 5px; }"
$style = $style + "TD{border: 1px solid black; padding: 5px; }"
$style = $style + "</style>"

#Format the data
foreach ($site in $largeSites) {
$results += [pscustomobject][ordered]@{
SiteName = $site.Title
"StorageUsed (GB)" = ({0:N2}-f ($site.StorageUsage / 1024))
"StorageLimit (GB)" = ($site.StorageMaximumLevel / 1024)
StorageUsedInPercent = ({0:P2}-f ($site.StorageUsage / $site.StorageMaximumLevel))
}
}

#Filter to only sites above the threshold limit
$siteExceeding = $results | Where-Object { $_.StorageUsedInPercent -gt $storageThreshold }

#Send an email if sites are over the designated threshold limit
if ($null -ne $siteExceeding) {
$emailBody = $siteExceeding | ConvertTo-Html -Head $style
$emailBody = $emailBody -replace '"', '\"' ## To be parsed correctly by Node.js when sending the email
m365 outlook mail send --to $sendTo --subject "Site Collections Storage Report" --bodyContents "$emailBody" --bodyContentType HTML --saveToSentItems false
}
}
CTRL + M