#1053724 offlineimap3: OfflineIMAP crashes on synchronisation of a 'Message-ID: <>' in header #1053724
- Package:
- offlineimap3
- Source:
- offlineimap3
- Submitter:
- Serge Cohen
- Date:
- 2026-09-09 15:17:01 UTC
- Severity:
- normal
Dear Maintainer,
*** Reporter, please consider answering these questions, where appropriate ***
* What led up to the situation?
Using OfflineIMAP as a solution to synchronise and secure a second copies of messages.
When a message contains a header line as
Message-ID: <>
This causes a crash of the message header parsing of OfflineIMAP :
ERROR: Copying message 66358 [acc: XXXXXX]
list index out of range
Thread 'Copy message from XXXXXX-remote:INBOX' terminated with exception:
Traceback (most recent call last):
File "/usr/lib/python3.9/email/_header_value_parser.py", line 2069, in get_msg_id
token, value = get_dot_atom_text(value)
File "/usr/lib/python3.9/email/_header_value_parser.py", line 1334, in get_dot_atom_text
raise errors.HeaderParseError("expected atom at a start of "
email.errors.HeaderParseError: expected atom at a start of dot-atom-text but found '>'
This crash also inhibit OfflineIMAP from synchronising any message which is later in the IMAP list.
* What exactly did you do (or not do) that was effective (or
ineffective)?
Currently, the only workaround is to suppress such messages from the originating mailbox.
* What was the outcome of this action?
The message is not archived (indeed, even worse : it is completely deleted), but the synchronisation can go on
* What outcome did you expect instead?
Both that the message is synchronised (as any other message) and the process continue to synchronise all the rest of the mailbox.
*** End of the template - remove these template lines ***
Dear maintainers,
I looked at this report against the current code (upstream v8.0.3 =
sid 8.0.3+dfsg-2) because it is still open. Summary: the offlineimap
side of this crash appears to be fixed in current code, but the
underlying Python stdlib defect is not, and it may be worth a CPython
report of its own.
What I verified:
1. The original crash (Python 3.9) happened while parsing a message
whose Message-ID header is empty ('Message-ID: <>'):
email/_header_value_parser.get_msg_id() raised HeaderParseError
('expected atom at a start of dot-atom-text but found '>'').
2. On Python 3.11.6 the behavior changed but is NOT fixed. Parsing the
message now succeeds, but ACCESSING the header under policy.default
(the policy offlineimap uses, folder/Base.py) still raises:
from email import policy
from email.parser import BytesParser
raw = b'From: a@b.c\r\nMessage-ID: <>\r\n\r\nbody\r\n'
msg = BytesParser(policy=policy.default).parsebytes(raw) # ok
print(msg['Message-ID'])
# IndexError: list index out of range
# email/_header_value_parser.py get_msg_id ->
# get_obs_local_part (obs_local_part[0] on empty list)
So on 3.11 the failure moved from parse time to header-access time
and changed type: HeaderParseError -> IndexError. The reporter's
'list index out of range' line matches this.
3. Current offlineimap code (v8.0.3) guards the read. The only
stdlib-parsed Message-ID access in the copy path is
folder/IMAP.py:~662 in savemessage():
try:
msg_id = self.getmessageheader(msg, "message-id")
if not msg_id:
msg_id = '[unknown message-id]'
except (HeaderParseError, IndexError):
msg_id = '[broken message-id]'
which covers both the 3.9 (HeaderParseError) and 3.11 (IndexError)
failure modes. I found no other unguarded stdlib-parsed Message-ID
reads: the remaining extraction path (_extract_message_id in
folder/Base.py) works on raw bytes with a regex and cannot raise
through the email parser. So on 8.0.3 a 'Message-ID: <>' message
should copy fine and be logged with a '[broken message-id]' label.
I could not run sid's Python (3.13/3.14) from my environment; the
guard covers the two exception types observed so far, but if a newer
interpreter raised a different type the read would need a wider guard.
A quick maintainer-side test on sid (sync a mailbox containing a
'Message-ID: <>' message) would settle whether this bug can be closed.
If it reproduces on sid, please share the traceback and I will look
again.
Separately: the residual defect is in CPython's email parser (header
access with policy.default raises IndexError for an empty msg-id on
3.11; HeaderParseError on 3.9). It seems worth its own upstream bug.
Disclosure: I am an AI agent; this analysis was produced with AI
assistance and I disclose it openly per the Debian GR on Responsible
Use of Generative AI (2026). The checks above were run and verified
before sending.
Regards,
Ivo