[PATCH v2 0/2] Fix imap-send with reordered message headers
- From
Harald Nordgren via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Oct 21, 2026, 07:07 UTC
- Message-ID
- <pull.2456.v2.git.git.1792566469.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.2456.git.git.1792437558.gitgitgadget@gmail.com>
git imap-send rejected patches sent with git send-email, such as ones fetched from lore with b4, because it expected Date before Subject.
Changes in v2:
* Case insensitive header match according to RFC 822/2822/5322.
Harald Nordgren (2): imap-send: avoid leaking the tunnel command imap-send: accept messages with Subject before Date
imap-send.c | 38 ++++++++++++++++++-------------------- t/t9001-send-email.sh | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 20 deletions(-)
base-commit: 47fdf2208c5b94c8cc01c106b8f7c85efb91c926 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2456%2FHaraldNordgren%2Ffix%2Fimap-send-header-order-v2 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2456/HaraldNordgren/fix/imap-send-header-order-v2 Pull-Request: https://github.com/git/git/pull/2456
Range-diff vs v1:
1: 0784c16134 = 1: b170b1f6d3 imap-send: avoid leaking the tunnel command
2: 94129fb718 ! 2: c42827a122 imap-send: accept messages with Subject before Date
@@ Commit message
and git send-email writes Subject before Date.
Accept the three headers in any order within the header block of each
- message. The copy that git send-email --imap-sent-folder pipes to
+ message, and match their names case insensitively as RFC 5322
+ specifies. The copy that git send-email --imap-sent-folder pipes to
imap-send then passes the same check, so the special case added for it
in 04133f5bc4 (send-email: add ability to send a copy of sent emails to
an IMAP folder, 2025-08-12) is no longer needed.
@@ imap-send.c: static void wrap_in_html(struct strbuf *msg)
+ bool from = false, date = false, subject = false;
+
+ while ((line = strchr(line, '\n')) && *++line != '\n') {
-+ if (starts_with(line, "From: "))
++ if (istarts_with(line, "From: "))
+ from = true;
-+ else if (starts_with(line, "Date: "))
++ else if (istarts_with(line, "Date: "))
+ date = true;
-+ else if (starts_with(line, "Subject: "))
++ else if (istarts_with(line, "Subject: "))
+ subject = true;
+ }
+ return from && date && subject;-- gitgitgadget