Skip to content

[FIX] jakarta.mail.internet.ParseException: Unbalanced quoted string#3002

Open
chibenwa wants to merge 2 commits intoapache:masterfrom
chibenwa:fix-spooler-parsing
Open

[FIX] jakarta.mail.internet.ParseException: Unbalanced quoted string#3002
chibenwa wants to merge 2 commits intoapache:masterfrom
chibenwa:fix-spooler-parsing

Conversation

@chibenwa
Copy link
Copy Markdown
Contributor

A broken mail could not be taken out of the spooler and ended up being dead-lettered.

This simple fix makes it possible to process it.

Performance gain: in the fast path (source != null && !isBodyModified()), saveChanges() was called every time a mailet had modified a header — for example the Received: header added on reception. Yet
saveChanges():

  1. Recursively traverses the entire MIME tree (MimeMultipart → MimeBodyPart → sub-parts...)
  2. For each part, re-parses Content-Type, Content-Disposition, recalculates encodings...
  3. Regenerates automatic headers

...only to end up writing the already-in-memory headers (this.headers) and copying the body from the raw source unchanged. Completely wasted work.

The fast path was introduced precisely to avoid parsing the message. But the saveChanges() call was negating a large part of that benefit for every mail that had any header modified — which is essentially every mail James processes (at minimum the Received header is always added).

For large multipart messages with many attachments, the saving can be substantial.

@chibenwa chibenwa self-assigned this Apr 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant