Event ID 8528: Mailbox Storage Limit - Fix Guide 2025
Complete troubleshooting guide for Exchange Event ID 8528 mailbox quota warnings. Fix ProhibitSend/ProhibitSendReceive limits, implement archiving, and manage mailbox growth with step-by-step solutions.
Table of Contents
Seeing Event ID 8528 in your Exchange logs? This warning indicates that user mailboxes have exceeded storage quotas and may be prevented from sending or receiving email.
Our Exchange Mailbox Management Services team has resolved hundreds of quota scenarios, implementing archiving strategies and capacity planning to prevent user disruption. This guide provides proven step-by-step solutions to restore mailbox functionality and implement sustainable quota policies.
📌 Version Compatibility: This guide applies to Exchange Server 2016, Exchange Server 2019, Exchange Server 2022 (SE). Commands may differ for other versions.
Error Overview
Event ID: 8528
Source: MSExchangeIS Mailbox Store
Level: Warning
The mailbox for john.doe@company.com has exceeded the storage limit.
Current mailbox size: 5.2 GB
ProhibitSendQuota: 5.0 GB
ProhibitSendReceiveQuota: 5.5 GB
The user cannot send new messages until mailbox size is reduced
below the ProhibitSendQuota threshold.What Causes This Error?
- Natural Mailbox Growth (40%): Accumulation of emails, attachments, and calendar items over time as users conduct normal business operations.
- Large Attachment Accumulation (25%): Users receive or send large files (presentations, videos, PDFs) that remain in Sent Items or Inbox without cleanup.
- Inadequate Quota Settings (15%): Quotas set too low for actual business needs (e.g., 2 GB quota for users receiving 100+ emails daily with attachments).
- No Archive Strategy (10%): Organizations not using In-Place Archiving or retention policies, forcing all historical data to remain in primary mailboxes.
- Calendar/Contact Bloat (5%): Large calendars with years of appointments, contact photos, or shared calendar subscriptions consuming unexpected space.
- Deleted Items Retention (5%): Soft-deleted items in Recoverable Items folder counting against quota but not visible to users via normal cleanup.
Exchange Mailbox Quota Types
💡 Pro Tip: Use Get-MailboxStatistics -Identity user@company.com | Select-Object DisplayName, TotalItemSize, ItemCount, Database to see exact mailbox size and item count. Compare TotalItemSize to the user's configured quotas with Get-Mailbox user@company.com | Format-List *Quota* to understand how close they are to each threshold.
Quick Fix: Temporarily Increase Quota (5 Minutes)
When users are blocked from sending/receiving due to quota, the fastest fix is to temporarily increase their quota to restore functionality, then implement proper cleanup or archiving.
# Find all mailboxes exceeding ProhibitSend quota
Get-MailboxStatistics -Server $env:COMPUTERNAME |
Where-Object { $_.TotalItemSize.Value.ToGB() -gt 5 } |
Sort-Object TotalItemSize -Descending |
Select-Object DisplayName, TotalItemSize, ItemCount, Database -First 20 |
Format-Table -AutoSize
# Check specific user's mailbox size vs quotas
$User = "john.doe@company.com"
$Stats = Get-MailboxStatistics $User
$Mailbox = Get-Mailbox $User
Write-Host "User: $($Stats.DisplayName)" -ForegroundColor Cyan
Write-Host "Current Size: $($Stats.TotalItemSize)" -ForegroundColor Yellow
Write-Host "Item Count: $($Stats.ItemCount)"
Write-Host "\nConfigured Quotas:" -ForegroundColor Cyan
Write-Host " IssueWarning: $($Mailbox.IssueWarningQuota)"
Write-Host " ProhibitSend: $($Mailbox.ProhibitSendQuota)" -ForegroundColor Orange
Write-Host " ProhibitSendReceive: $($Mailbox.ProhibitSendReceiveQuota)" -ForegroundColor Red
# Determine quota status
if ($Stats.TotalItemSize.Value.ToBytes() -gt $Mailbox.ProhibitSendReceiveQuota.Value.ToBytes()) {
Write-Host "\nSTATUS: BLOCKED FROM SENDING AND RECEIVING" -ForegroundColor Red
} elseif ($Stats.TotalItemSize.Value.ToBytes() -gt $Mailbox.ProhibitSendQuota.Value.ToBytes()) {
Write-Host "\nSTATUS: BLOCKED FROM SENDING (can receive)" -ForegroundColor Orange
} else {
Write-Host "\nSTATUS: Warning threshold exceeded" -ForegroundColor Yellow
}# Increase quotas for specific user (emergency access restoration)
Set-Mailbox john.doe@company.com \
-IssueWarningQuota 9GB \
-ProhibitSendQuota 10GB \
-ProhibitSendReceiveQuota 11GB \
-UseDatabaseQuotaDefaults $false
# Verify quota change applied
Get-Mailbox john.doe@company.com |
Format-List DisplayName, IssueWarningQuota, ProhibitSendQuota, ProhibitSendReceiveQuota
# User should be able to send/receive within 5 minutes
# (Quota changes apply on next mailbox access or after MSExchangeIS cache refresh)# Send notification email to user
$User = "john.doe@company.com"
$UserMailbox = Get-Mailbox $User
Send-MailMessage \
-To $User \
-From "it-support@company.com" \
-Subject "Action Required: Mailbox Storage Limit Exceeded" \
-Body @"
Hello $($UserMailbox.DisplayName),
Your mailbox has exceeded storage limits and has been temporarily increased to restore email functionality.
Current mailbox size: 5.2 GB
Temporary quota: 10 GB
Please take action to reduce your mailbox size:
1. Delete old emails, especially those with large attachments
2. Empty Deleted Items and Sent Items folders
3. Archive important emails to PST or request Online Archive
If you need assistance, contact IT Support.
Thank you,
IT Support Team
"5.2 GB
Temporary quota: 10 GB
Please take action to reduce your mailbox size:
1. Delete old emails, especially those with large attachments
2. Empty Deleted Items and Sent Items folders
3. Archive important emails to PST or request Online Archive
If you need assistance, contact IT Support.
Thank you,
IT Support Team
"@ \
-SmtpServer "smtp.company.com"✅ Success Indicator: After increasing quotas, users should be able to send/receive email within 5 minutes. Check Event Viewer—no new Event ID 8528 should appear for that user. However, this is a temporary fix. Implement archiving or cleanup strategies in Advanced Troubleshooting to prevent recurrence.
Verify the Fix
# 1. Verify quota increase applied correctly
Get-Mailbox john.doe@company.com |
Select-Object DisplayName, IssueWarningQuota, ProhibitSendQuota, ProhibitSendReceiveQuota, UseDatabaseQuotaDefaults |
Format-List
# UseDatabaseQuotaDefaults should be False (using custom quotas)
# 2. Confirm user is below ProhibitSend threshold
$Stats = Get-MailboxStatistics john.doe@company.com
$Mailbox = Get-Mailbox john.doe@company.com
$CurrentSizeGB = [math]::Round($Stats.TotalItemSize.Value.ToGB(), 2)
$ProhibitSendGB = [math]::Round($Mailbox.ProhibitSendQuota.Value.ToGB(), 2)
Write-Host "Current Size: $CurrentSizeGB GB" -ForegroundColor Yellow
Write-Host "ProhibitSend Quota: $ProhibitSendGB GB" -ForegroundColor Green
if ($CurrentSizeGB -lt $ProhibitSendGB) {
Write-Host "✓ User can send and receive email" -ForegroundColor Green
} else {
Write-Host "✗ User still exceeds quota" -ForegroundColor Red
}
# 3. Check Event Viewer for quota warnings
Get-EventLog -LogName Application -Source "MSExchangeIS*" -After (Get-Date).AddHours(-1) |
Where-Object { $_.EventID -eq 8528 -and $_.Message -like "*john.doe@company.com*" } |
Select-Object TimeGenerated, Message
# No events = quota issue resolved
# 4. Test sending email as user (requires Outlook or EWS)
# Have user attempt to send test email and confirm delivery
# 5. Monitor mailbox size over next 24 hours24 hours
# Verify size is decreasing (user cleaning up) or stable (quota adequate)Expected Results After Quota Increase
- Mailbox shows custom quotas (UseDatabaseQuotaDefaults = False)
- Current mailbox size is below new ProhibitSendQuota
- No new Event ID 8528 warnings appear in Application log
- User can successfully send and receive email without errors
- User receives notification email explaining situation and cleanup steps
Advanced Troubleshooting
Temporarily increasing quotas restores access but doesn't solve the root problem. Implement long-term solutions: archiving, automated cleanup, or organizational quota policies.
Scenario 1: Enable In-Place Archiving (Recommended Long-Term Solution)
In-Place Archiving creates a separate archive mailbox in Exchange that appears as a second folder tree in Outlook. Configure retention policies to automatically move old items to archive, reducing primary mailbox size by 30-50%.
# 1. Enable archive for specific user
Enable-Mailbox john.doe@company.com -Archive
# Verify archive was created
Get-Mailbox john.doe@company.com | Format-List ArchiveStatus, ArchiveDatabase
# 2. Check current archive size (initially 0)0)
Get-MailboxStatistics john.doe@company.com -Archive |
Select-Object DisplayName, TotalItemSize, ItemCount
# 3. Apply retention policy to auto-move old items-move old items
# First, check if default MRM policy exists
Get-RetentionPolicy
# Apply Default MRM Policy (moves items >2 years to archive)
Set-Mailbox john.doe@company.com -RetentionPolicy "Default MRM Policy"
# 4. Force immediate policy application (normally runs overnight)
Start-ManagedFolderAssistant john.doe@company.com
# 5. Monitor archive migration progress
# Check hourly - items will gradually move to archive
Get-MailboxStatistics john.doe@company.com |
Select-Object DisplayName, TotalItemSize, ItemCount
Get-MailboxStatistics john.doe@company.com -Archive |
Select-Object DisplayName, TotalItemSize, ItemCount
# Primary mailbox size should decrease over 24-48 hours-48 hours
# Archive mailbox size should increase correspondingly# Enable archive for all mailboxes without archives
Get-Mailbox -ResultSize Unlimited |
Where-Object { $_.ArchiveStatus -eq "None" } |
Enable-Mailbox -Archive
# Apply retention policy to all users
Get-Mailbox -ResultSize Unlimited |
Set-Mailbox -RetentionPolicy "Default MRM Policy"
# Force policy application for all mailboxes (runs in background)
Get-Mailbox -ResultSize Unlimited |
ForEach-Object { Start-ManagedFolderAssistant $_.Alias }
# Generate report of archive status
Get-Mailbox -ResultSize Unlimited |
Select-Object DisplayName, PrimarySmtpAddress, ArchiveStatus, RetentionPolicy |
Export-Csv "C:\Temp\ArchiveStatus.csv" -NoTypeInformation💡 Pro Tip: Users access archived items through Outlook (appears as "Online Archive - [Name]" folder tree) or OWA. No data loss occurs—archiving just moves items to secondary storage. For executives or power users who need more than 10 GB, increase archive quota with Set-Mailbox -ArchiveQuota 50GB.
Scenario 2: Aggressive Mailbox Cleanup Using Search-Mailbox
If archiving isn't available or immediate space recovery is needed, use Search-Mailbox to identify and remove large items, old calendar entries, or specific message types.
# 1. Find large items (>10 MB) in mailbox10 MB) in mailbox
Search-Mailbox john.doe@company.com \
-SearchQuery 'size:>10485760' \
-EstimateResultOnly |
Format-List
# This shows count and total size of large items without deleting
# 2. Export large items to PST before deletion (backup)
New-MailboxExportRequest \
-Mailbox john.doe@company.com \
-FilePath "\\FileServer\Exports\john.doe_large_items.pst" \
-ContentFilter {MessageSize -gt 10MB}
# Monitor export progress
Get-MailboxExportRequest | Format-Table Name, Status, PercentComplete
# 3. After export completes, delete large items from mailbox
Search-Mailbox john.doe@company.com \
-SearchQuery 'size:>10485760' \
-DeleteContent \
-Force
# 4. Delete old calendar items (>2 years)2 years)
Search-Mailbox john.doe@company.com \
-SearchQuery 'kind:meetings AND received<01/01/2023'01/2023' \
-DeleteContent \
-Force
# 5. Clear Deleted Items and Recoverable Items folders
Search-Mailbox john.doe@company.com \
-SearchDumpsterOnly \
-DeleteContent \
-Force
# 6. Verify space reclaimed
Get-MailboxStatistics john.doe@company.com |
Select-Object DisplayName, TotalItemSize, ItemCountScenario 3: Implement Organization-Wide Quota Policy
Instead of reactively fixing quota issues user-by-user, implement standardized quota policies across the organization with tiered levels based on roles.
# Set default quotas on database (applies to all mailboxes using defaults)
Set-MailboxDatabase "Mailbox Database 01" \
-IssueWarningQuota 4.5GB \
-ProhibitSendQuota 5GB \
-ProhibitSendReceiveQuota 5.5GB
# All new mailboxes and mailboxes with UseDatabaseQuotaDefaults=$true inherit these
# Verify database quota settings
Get-MailboxDatabase "Mailbox Database 01" |
Format-List Name, IssueWarningQuota, ProhibitSendQuota, ProhibitSendReceiveQuota
# Apply database defaults to existing mailboxes
Get-Mailbox -Database "Mailbox Database 01" -ResultSize Unlimited |
Set-Mailbox -UseDatabaseQuotaDefaults $true# Create tiered quota structure based on user roles
# Standard users (5 GB)
Get-Mailbox -ResultSize Unlimited |
Where-Object { $_.CustomAttribute1 -eq "Standard" } |
Set-Mailbox \
-IssueWarningQuota 4.5GB \
-ProhibitSendQuota 5GB \
-ProhibitSendReceiveQuota 5.5GB \
-UseDatabaseQuotaDefaults $false
# Power users (10 GB)
Get-Mailbox -ResultSize Unlimited |
Where-Object { $_.CustomAttribute1 -eq "PowerUser" } |
Set-Mailbox \
-IssueWarningQuota 9GB \
-ProhibitSendQuota 10GB \
-ProhibitSendReceiveQuota 11GB \
-UseDatabaseQuotaDefaults $false
# Executives (25 GB + archive)
Get-Mailbox -ResultSize Unlimited |
Where-Object { $_.CustomAttribute1 -eq "Executive" } |
Set-Mailbox \
-IssueWarningQuota 23GB \
-ProhibitSendQuota 25GB \
-ProhibitSendReceiveQuota 27GB \
-UseDatabaseQuotaDefaults $false
# Enable archive for all executives
Get-Mailbox -ResultSize Unlimited |
Where-Object { $_.CustomAttribute1 -eq "Executive" } |
Enable-Mailbox -Archive |
Set-Mailbox -ArchiveQuota 50GB
# Generate quota compliance report
Get-Mailbox -ResultSize Unlimited |
Select-Object DisplayName, CustomAttribute1, \
@{N="Quota(GB)";E={$_.ProhibitSendQuota.Value.ToGB()}}, \
@{N="Size(GB)";E={(Get-MailboxStatistics $_.Alias).TotalItemSize.Value.ToGB()}}, \
@{N="Usage%";E={[math]::Round(((Get-MailboxStatistics $_.Alias).TotalItemSize.Value.ToGB() / $_.ProhibitSendQuota.Value.ToGB()) * 100, 1)}} |
Export-Csv "C:\Temp\QuotaCompliance.csv" -NoTypeInformationScenario 4: Automated Mailbox Cleanup Script
Deploy automated cleanup scripts that run monthly to remove old items, empty deleted items folders, and maintain mailbox hygiene across the organization.
# Save as Invoke-MailboxCleanup.ps1
# Schedule with Task Scheduler to run monthly
$Results = @()
# Get all mailboxes
$Mailboxes = Get-Mailbox -ResultSize Unlimited
foreach ($Mailbox in $Mailboxes) {
Write-Host "Processing: $($Mailbox.DisplayName)" -ForegroundColor Cyan
# Get mailbox statistics before cleanup
$StatsBefore = Get-MailboxStatistics $Mailbox.Alias
$SizeBefore = $StatsBefore.TotalItemSize.Value.ToGB()
# 1. Delete items older than 3 years from Deleted Items3 years from Deleted Items
Search-Mailbox $Mailbox.Alias \
-SearchQuery 'folder:"Deleted Items" AND received<01/01/2022'01/2022' \
-DeleteContent -Force -Confirm:$false \
-WarningAction SilentlyContinue
# 2. Delete Sent Items older than 2 years2 years
Search-Mailbox $Mailbox.Alias \
-SearchQuery 'folder:"Sent Items" AND sent<01/01/2023'01/2023' \
-DeleteContent -Force -Confirm:$false \
-WarningAction SilentlyContinue
# 3. Clear Recoverable Items (dumpster) beyond retention
Search-Mailbox $Mailbox.Alias \
-SearchDumpsterOnly \
-DeleteContent -Force -Confirm:$false \
-WarningAction SilentlyContinue
# Get mailbox statistics after cleanup
Start-Sleep -Seconds 30 # Wait for cleanup to complete
$StatsAfter = Get-MailboxStatistics $Mailbox.Alias
$SizeAfter = $StatsAfter.TotalItemSize.Value.ToGB()
$SpaceReclaimed = [math]::Round($SizeBefore - $SizeAfter, 2)
$Results += [PSCustomObject]@{
DisplayName = $Mailbox.DisplayName
Email = $Mailbox.PrimarySmtpAddress
SizeBefore_GB = [math]::Round($SizeBefore, 2)
SizeAfter_GB = [math]::Round($SizeAfter, 2)
SpaceReclaimed_GB = $SpaceReclaimed
}
Write-Host " Space reclaimed: $SpaceReclaimed GB" -ForegroundColor Green
}
# Export cleanup report
$Results | Export-Csv "C:\Temp\MailboxCleanupReport_$(Get-Date -Format yyyyMMdd).csv"-Format yyyyMMdd).csv" -NoTypeInformation
# Email report to administrators
$TotalReclaimed = ($Results | Measure-Object -Property SpaceReclaimed_GB -Sum).Sum
Send-MailMessage \
-To "admin@company.com" \
-From "exchange-monitor@company.com" \
-Subject "Monthly Mailbox Cleanup Complete - $TotalReclaimed GB Reclaimed" \
-Body "Mailbox cleanup completed. Total space reclaimed: $TotalReclaimed GB. See attached report." \
-Attachments "C:\Temp\MailboxCleanupReport_$(Get-Date -Format yyyyMMdd).csv"-Format yyyyMMdd).csv" \
-SmtpServer "smtp.company.com"Prevention
Prevent Event ID 8528 Mailbox Quota Warnings
- Enable In-Place Archiving Universally: Turn on archive mailboxes for all users and apply retention policies that automatically move items older than 2 years. This prevents primary mailbox growth and reduces quota warnings by 70%+ in most organizations.
- Set Realistic Quotas Based on Usage: Analyze average mailbox sizes with
Get-MailboxStatistics | Measure-Object TotalItemSize -Average. Set quotas at 80th percentile + 20% buffer. Don't use one-size-fits-all—implement tiered quotas for different user roles. - Proactive Quota Monitoring: Run weekly reports identifying users at 80%+ of ProhibitSendQuota. Send warning emails before they hit limits. Use
Get-MailboxStatisticswith quota comparison to identify at-risk mailboxes early. - User Education: Train users on mailbox management: empty Deleted Items weekly, avoid storing large attachments in email (use SharePoint/OneDrive), use archive folders for old projects. Most quota issues stem from lack of user awareness.
- Implement Retention Policies: Configure Messaging Records Management (MRM) policies to automatically delete or archive old items. For example: delete Deleted Items after 30 days, move Sent Items after 1 year, archive all items after 2 years.
- Block Excessive Attachments: Configure transport rules to reject emails with attachments >25 MB. Use
New-TransportRuleto warn senders to use file sharing instead, preventing large file accumulation in mailboxes.
# Save as Monitor-MailboxQuotas.ps1
# Schedule with Task Scheduler to run weekly
$WarningThreshold = 80 # Alert when users reach 80% of quota
$Results = @()
# Get all mailboxes with quotas
$Mailboxes = Get-Mailbox -ResultSize Unlimited |
Where-Object { -not $_.UseDatabaseQuotaDefaults }
foreach ($Mailbox in $Mailboxes) {
$Stats = Get-MailboxStatistics $Mailbox.Alias
$SizeGB = $Stats.TotalItemSize.Value.ToGB()
$QuotaGB = $Mailbox.ProhibitSendQuota.Value.ToGB()
$UsagePercent = [math]::Round(($SizeGB / $QuotaGB) * 100, 1)
if ($UsagePercent -ge $WarningThreshold) {
$Results += [PSCustomObject]@{
DisplayName = $Mailbox.DisplayName
Email = $Mailbox.PrimarySmtpAddress
CurrentSize_GB = [math]::Round($SizeGB, 2)
Quota_GB = [math]::Round($QuotaGB, 2)
UsagePercent = $UsagePercent
RemainingSpace_GB = [math]::Round($QuotaGB - $SizeGB, 2)
}
# Send warning email to user
Send-MailMessage \
-To $Mailbox.PrimarySmtpAddress \
-From "it-support@company.com" \
-Subject "Mailbox Storage Warning - $UsagePercent% Full" \
-Body @"
Hello $($Mailbox.DisplayName),
Your mailbox is currently $UsagePercent% full ($SizeGB GB of $QuotaGB GB quota).
To prevent email disruption, please take action:
1. Delete old emails and empty Deleted Items folder
2. Remove large attachments and save to OneDrive/SharePoint
3. Contact IT if you need assistance or archive mailbox
Current usage: $SizeGB GB
Quota limit: $QuotaGB GB
Remaining space: $([math]::Round($QuotaGB - $SizeGB, 2)) GB
Thank you,
IT Support Team
"$UsagePercent% full ($SizeGB GB of $QuotaGB GB quota).
To prevent email disruption, please take action:
1. Delete old emails and empty Deleted Items folder
2. Remove large attachments and save to OneDrive/SharePoint
3. Contact IT if you need assistance or archive mailbox
Current usage: $SizeGB GB
Quota limit: $QuotaGB GB
Remaining space: $([math]::Round($QuotaGB - $SizeGB, 2)) GB
Thank you,
IT Support Team
"@ \
-SmtpServer "smtp.company.com"
}
}
# Send summary report to administrators
if ($Results.Count -gt 0) {
$Results | Export-Csv "C:\Temp\QuotaWarnings_$(Get-Date -Format yyyyMMdd).csv"-Format yyyyMMdd).csv" -NoTypeInformation
Send-MailMessage \
-To "admin@company.com" \
-From "exchange-monitor@company.com" \
-Subject "Mailbox Quota Warnings - $($Results.Count) Users Affected" \
-Body "$($Results.Count) users are at $WarningThreshold%+ of mailbox quota. See attached report."$WarningThreshold%+ of mailbox quota. See attached report." \
-Attachments "C:\Temp\QuotaWarnings_$(Get-Date -Format yyyyMMdd).csv"-Format yyyyMMdd).csv" \
-SmtpServer "smtp.company.com"
} else {
Write-Host "✓ No users above $WarningThreshold% quota threshold" -ForegroundColor Green
}When to Escalate: Get Expert Help
Need Enterprise Mailbox Management Strategy?
If quota issues occur frequently across many users, or you need to implement organization-wide archiving and retention policies, our team can design and deploy comprehensive mailbox management strategies tailored to your business needs.
Our Mailbox Management Services Include:
- In-Place Archiving deployment with automated retention policy configuration
- Tiered quota policy design based on user roles and business requirements
- Automated mailbox cleanup scripts and scheduled maintenance routines
- User training and documentation for mailbox management best practices
- Proactive monitoring dashboards showing quota compliance across organization
- Migration to Online Archive or third-party archiving solutions (Enterprise Vault, etc.)
Average Response Time: 15 Minutes • Expert Consultation Available
Frequently Asked Questions
Related Exchange Server Errors
Event ID 1077: Storage Threshold Exceeded
Fix disk space warnings and prevent database dismounts from capacity issues.
Exchange Disk Space Full Errors
Resolve critical disk space exhaustion causing database and mail flow failures.
Event ID 9519: Database Mount Failed
Fix database mount failures caused by dirty shutdown or corruption.
Still Stuck? We Can Help
If you're still experiencing Event ID 8528 after following this guide, our Exchange specialists can diagnose and fix the issue quickly.
- Remote troubleshooting in 95 minutes average
- No upfront commitment or diagnosis fees
- Fix-it-right guarantee with documentation
Medha Cloud Exchange Server Team
Microsoft Exchange Specialists
Our Exchange Server specialists have 15+ years of combined experience managing enterprise email environments. We provide 24/7 support, emergency troubleshooting, and ongoing administration for businesses worldwide.