When Gmail rejects a legitimate message for header size, the first wrong assumption is usually that the message body must be too large.
Often it is the opposite. The body can be normal. The attachments can be small. The failure is in the metadata wrapped around the message.
Google now documents these header limits clearly:
500KB500032KBThat third one matters more than many teams expect. A message does not need to have overall header bloat to fail. One giant ARC-Seal, List-Unsubscribe, Authentication-Results, or custom tracking header can be enough.
Google's Gmail message header limits page shows the relevant rejection family as 552-5.3.4.
The error text tells you which limit was crossed:
512000500032768 bytes32768 bytesThat is a useful distinction because the troubleshooting path is different.
If the SMTP reply says a standard header is too large, focus on things like ARC, Received, list headers, Authentication-Results, or other RFC-defined fields.
If the reply says one of the headers exceeded the limit without naming it, Google is usually referring to a custom header. In real mail flows, that often means tracking, feedback, campaign, routing, or internal analytics metadata.
For real operational mail, header-size failures usually cluster into three buckets:
Sometimes you get two or all three at once.
ARC is useful because intermediaries can preserve authentication context across forwarding and modification. But ARC is not free. Every ARC hop adds three headers:
ARC-Authentication-ResultsARC-Message-SignatureARC-SealRFC 8617 explicitly calls out increased header field size as a security and operational consideration, and it caps ARC instance values at 1 through 50 partly to limit header growth.
That does not mean Gmail waits until 50 ARC sets before mail becomes risky. Long before that point, the accumulated headers can become bulky enough to cause delivery trouble, especially when each hop records verbose authentication results or uses long DKIM-style signature values.
This is the usual shape:
Received and sometimes more Authentication-ResultsThis is especially common in environments where mail loops through:
If you need the protocol background first, What is ARC in email and how does it work? and How to read ARC headers in practice are the best companion posts.
Count how many ARC sets exist by looking at the highest i= value.
Then check whether the ARC headers are unusually verbose. A single hop can add a lot of text if:
ARC-Authentication-Results records many sub-results and propertiesb= values and broad h= coverageIf the message passed through eight or ten intermediaries, the problem may be architectural more than accidental.
Mailing-list headers are legitimate and standardized. RFC 2369 defines headers such as:
List-HelpList-SubscribeList-UnsubscribeList-PostList-OwnerList-ArchiveRFC 8058 adds List-Unsubscribe-Post for one-click unsubscribe signaling.
None of those headers are bad by themselves. The issue is that they can become surprisingly large when they contain:
Google's single-header 32KB limit applies to these headers too.
List-UnsubscribeThat header can legitimately contain more than one URI. RFC 2369 allows multiple angle-bracketed URLs in order of preference, and RFC 8058 requires enough information in the HTTPS URI for one-click processing.
That means a sender can end up with something like:
List-Unsubscribe: <mailto:list-request@example.com?subject=unsubscribe>, <https://example.com/unsubscribe/very-long-opaque-token-and-other-parameters>
List-Unsubscribe-Post: List-Unsubscribe=One-ClickNow combine that with campaign parameters, per-recipient encoding, and a downstream platform that rewrites or appends more metadata. That single header can get large quickly.
List traffic often accumulates more than just List-* fields:
Received linesAuthentication-ResultsSo even if no one List-* header is enormous, the list path can still push the total header section toward Gmail's 500KB limit.
For the broader indirect-flow background, DMARC forwarding and mailing lists: why SPF and DKIM fail (and how ARC helps) is the right nearby read.
This is the category teams miss most often because the message still looks normal in the mail client.
The visible message may be short, but the sending platform can attach a pile of metadata such as:
X-Campaign-*X-Feedback-IDX-Entity-*X-Trace-*Individually these may seem harmless. But if a platform stores long JSON-like blobs, many UUIDs, encoded URLs, or repeated audience metadata in custom headers, Google may reject the message as a non-standard header over 32KB.
This gets worse when multiple systems add their own custom headers and nobody owns the final assembled message.
If Gmail's error text does not name the offending header, start here.
This order usually gets to the root cause fastest.
i= value.List-*, Authentication-Results, ARC-*, and Received first for standard-header failures.X-* and provider-specific metadata first for unnamed non-standard-header failures.That sequence matters because Gmail evaluates the message after all your intermediaries have finished modifying it.
The message your app generated may be fine. The message your final MTA emitted may not be.
RFC 5322 allows header folding so long headers can wrap across lines. But folding is presentation, not a true size reduction. Gmail's documented limits apply to the actual header content, not the way it is visually wrapped in a raw source view.
So this can be misleading:
List-Unsubscribe:
<https://example.com/unsubscribe/...>It looks split across lines, but logically it is still one header value.
The same applies to long ARC signatures and giant custom headers.
In practice, standard-header failures tend to come from one of these:
ARC-SealARC-Message-SignatureARC-Authentication-ResultsAuthentication-ResultsList-UnsubscribeReceivedGoogle's exception for To:, Cc:, and References: not having the same single-header 32KB limit is useful, but those are usually not the problem in the ARC/list/tracking scenarios anyway.
ARC is often still the right feature. The fix is usually to reduce unnecessary sealing and unnecessary hops.
Start here:
If a secure email gateway is part of the chain, How to stop secure email gateways from breaking DMARC covers the trust-order side of that design.
The safest cleanup steps are usually:
List-* field as intended by the standardsThat last point matters. RFC 2369 says there must be no more than one of each list header in a given message. Duplicate list headers are not just messy. They also waste header budget.
This is usually the fastest win.
Ask a blunt question: which custom headers are operationally required at final delivery, and which exist only because no one cleaned them up?
Then:
X-* headersGoogle's own remediation advice for header-limit failures is simple: truncate header values or move information into the message body. In practice, for internal telemetry, the better answer is often to move the data out of the email entirely.
If Gmail says:
512000 total header bytes or 5000 header fields: think cumulative growth across ARC, Received, list headers, and custom metadata32768: inspect ARC, list headers, Authentication-Results, or Received32768: inspect tracking and custom X-* metadata firstThat one split will save a lot of time.
Header-size rejections are often architecture problems, not content problems. The message body is frequently innocent. The header section tells the real story.
Gmail header-size rejections for legitimate mail usually come from metadata accretion:
Use Gmail's rejection text to separate total-header failures from single-header failures. Then inspect the fully assembled outbound message, count the ARC hops, measure unfolded header sizes, and be ruthless about removing metadata that does not need to ride with the message.
The fix is rarely "change the email copy." The fix is usually "send a smaller story about the email."