Every email provider enforces its own attachment size cap, and most encode attachments in a way that adds 30%+ overhead. This reference table lists the current send and receive limits for major providers — and links to real sample files you can use to validate your app’s upload flow against each limit.
Provider-by-provider limits
Send = max size you can compose and send · Receive = max size your inbox accepts. All sizes are after MIME encoding unless noted.
Provider
Send limit
Receive limit
Test with
Gmail
Files larger than 25 MB are uploaded to Google Drive automatically and shared as a link. Gmail counts MIME-encoded size, so the practical limit on raw files is ~17–18 MB.
Default send limit is 20 MB for personal accounts and up to 150 MB on Microsoft 365, configurable by administrators. Exchange Server admins can also set custom limits.
Why your 24 MB file gets rejected at a 25 MB limit
Email attachments are MIME-encoded as base64, which inflates raw binary data by roughly 33%. A 20 MB file becomes ~27 MB on the wire. Most providers measure the encoded size, so the practical limit on a raw file you attach is well below the advertised number. Plan validation against the encoded size:
// Rough rule of thumb
const PROVIDER_LIMIT_MB = 25;
const SAFE_RAW_LIMIT_MB = Math.floor(PROVIDER_LIMIT_MB / 1.37);
// SAFE_RAW_LIMIT_MB === 18
Test your upload validation with real sample files
Don’t rely on a synthesized File blob in your tests — use real sample files at the boundary sizes:
5MB sample files — default Outlook attachment size on some Exchange configs.
100MB PDF sample — exceeds every email provider, perfect for the rejection path.
What to do when files exceed the limit
Major providers integrate their own cloud storage — Gmail with Google Drive, Outlook with OneDrive, iCloud with Mail Drop — and replace the attachment with a share link. For your own apps, the standard pattern is the same: upload to S3/R2/GCS, generate a time-limited signed URL, and email the link instead of the file. Validate the cutoff client-side first to give users an actionable error before the upload starts.