When an Exchange Server mailbox hits its limit, the symptoms land on other people first: senders get bounces, while the user only notices that nothing new arrives. The cause is always a quota, but there are several: database defaults, per-mailbox overrides and a separate quota for Recoverable Items. In this post I'll show how to find which one was hit, fix it properly and prove that mail flows again.
Errors this guide fixes
The recipient's mailbox is full and can't accept messages now.NDR (user-facing text)554 5.2.2 mailbox full; STOREDRV.Deliver.Exception:QuotaExceededException.MapiExceptionShutoffQuotaExceededNDR (diagnostic information)The message store has reached its maximum sizeOutlook
Symptoms#
Senders receive an NDR saying:
The recipient's mailbox is full and can't accept messages now.The diagnostic information for administrators shows the store driver's reason:
554 5.2.2 mailbox full; STOREDRV.Deliver.Exception:QuotaExceededException.MapiExceptionShutoffQuotaExceeded- The user was warned earlier that the mailbox was almost full, then could no longer send.
- Deleting items fails in Outlook with
The message store has reached its maximum size, even though the mailbox doesn't look full. That points at the Recoverable Items folder. - Admins also report meeting updates failing while ordinary mail still arrives, another Recoverable Items sign.
- Message tracking shows
FAILevents with5.2.2inRecipientStatus.
Why it happens#
Exchange applies three mailbox thresholds, set on the database and optionally overridden per mailbox:
| Setting | What happens at the limit | Database default |
|---|---|---|
IssueWarningQuota | The user gets a warning message. | 1.899 GB |
ProhibitSendQuota | The user can't send new messages. | 2 GB |
ProhibitSendReceiveQuota | Nothing in or out; senders get the 5.2.2 NDR. | 2,469,396,480 bytes (about 2.3 GB) |
RecoverableItemsWarningQuota | Exchange logs an Application log event. | 20 GB |
RecoverableItemsQuota | Recoverable Items stops accepting items, so deletes fail. | 30 GB |
Those defaults are small, and every new database starts with them. The common causes:
- A database was created with default limits nobody changed.
- The mailbox has
UseDatabaseQuotaDefaultsset to$falsewith old, lower custom values. - Recoverable Items is full because of Litigation Hold, an In-Place Hold or single item recovery. It has its own quota and doesn't count toward the normal mailbox limits. Calendar changes are logged there too (up to
CalendarLoggingQuota, 6 GB by default), so busy calendars fill it faster. - Steady growth with no archive or retention policy.
How to fix it#
- Find which limit was hit.
PowerShell
Get-Mailbox lina | Format-List Database, UseDatabaseQuotaDefaults, IssueWarningQuota, ProhibitSendQuota, ProhibitSendReceiveQuota Get-MailboxDatabase DB01 | Format-List IssueWarningQuota, ProhibitSendQuota, ProhibitSendReceiveQuota, RecoverableItems*Quota Get-MailboxStatistics lina | Format-List TotalItemSize, TotalDeletedItemSize, ItemCountTotalItemSizeis measured against the mailbox quotas;TotalDeletedItemSizeis the Recoverable Items side. - Check Recoverable Items and holds.
If a hold is filling the folder, don't purge it: raise the Recoverable Items quota (database-wide withPowerShell
Get-MailboxFolderStatistics lina -FolderScope RecoverableItems | Format-Table Name, FolderAndSubfolderSize, ItemsInFolderAndSubfolders -AutoSize Get-Mailbox lina | Format-List LitigationHoldEnabled, InPlaceHolds, SingleItemRecoveryEnabled, RetainDeletedItemsForSet-MailboxDatabase -RecoverableItemsQuotaand-RecoverableItemsWarningQuota, or on the mailbox) and agree the hold's scope with whoever owns it. - Give the mailbox room now. Override the database for this mailbox, keeping the warning at least half of the prohibit-send value (otherwise the warning message isn't sent):
In the Exchange admin center: Recipients › Mailboxes, edit the mailbox, Mailbox usage, More options, then Customize the quota settings for this mailbox.PowerShell
Set-Mailbox lina -UseDatabaseQuotaDefaults $false -IssueWarningQuota 9GB -ProhibitSendQuota 9.5GB -ProhibitSendReceiveQuota 10GB - Or fix the database default if most mailboxes on it are affected:
PowerShell
Set-MailboxDatabase DB01 -IssueWarningQuota 9GB -ProhibitSendQuota 9.5GB -ProhibitSendReceiveQuota 10GBIssueWarningQuotaandProhibitSendQuotamust not be greater thanProhibitSendReceiveQuota. The change applies to every mailbox on the database that uses the defaults.Watch out: higher quotas raise the worst-case size of the database. Check free space on the database and log volumes (and on every DAG copy) before you raise a database-wide limit.
- Free space for the long term. Enable an archive and let a retention policy with a move-to-archive tag do the work, then run the assistant once:
The user can also use File › Tools › Mailbox Cleanup in classic Outlook to find large and old items.PowerShell
Enable-Mailbox lina -Archive Start-ManagedFolderAssistant -Identity lina - Ask senders to resend. A 5.2.2 bounce is permanent; Exchange won't retry those messages.
Allow some time for a new limit to take effect before you retest.
Verify the fix#
Get-Mailbox lina | Format-List UseDatabaseQuotaDefaults, *Quotashows the values you set, andTotalItemSizeis comfortably belowProhibitSendReceiveQuota.- Send a test from outside and check message tracking. Good looks like
DELIVERrather thanFAIL:PowerShellGet-MessageTrackingLog -Recipients lina@contoso.com -Start (Get-Date).AddMinutes(-30) -ResultSize Unlimited | Format-Table Timestamp, EventId, Source, RecipientStatus -AutoSize - The user can send again and delete items without the store-size error.
Prevent it next time#
- Set realistic database quotas when you create a database, so nobody inherits the 2 GB defaults.
- Watch out for one gotcha: setting
UseDatabaseQuotaDefaults $falsewithout values applies the mailbox's own settings, which are oftenUnlimited. - Review the largest mailboxes regularly. This parses the byte count, so sorting works in the remote shell:
PowerShell
Get-MailboxStatistics -Database DB01 | Select-Object DisplayName, @{n='SizeGB';e={[math]::Round([int64]($_.TotalItemSize.ToString() -replace '.*\((.*) bytes\).*','$1' -replace '\D','')/1GB,2)}} | Sort-Object SizeGB -Descending | Select-Object -First 20 - Track Recoverable Items for mailboxes on hold, and plan disk space for holds.
- For the cloud side of the same NDR, see Mailbox full in Exchange Online. For other bounce codes, see the Exchange Server NDR quick reference.

