feat: test patch for gmail/utf8
All checks were successful
perso/offlineimap/pipeline/head This commit looks good

This commit is contained in:
Julien Cabillot
2026-03-19 09:50:15 -04:00
parent 379ad22d7b
commit 65c73469ed
2 changed files with 31 additions and 1 deletions

View File

@@ -2,12 +2,16 @@ FROM "alpine:3.23"
LABEL maintainer="Cabillot Julien <dockerimages@cabillot.eu>"
COPY entrypoint.sh /entrypoint.sh
COPY patch.py /tmp/patch.py
RUN apk add --no-cache offlineimap openssl && \
adduser -D offlineimap && \
# Force SECLEVEL=1 in imaplib2 to allow connecting to servers with weak DH keys (DH_KEY_TOO_SMALL)
# This is required because OpenSSL 3.x in Alpine 3.23 defaults to SECLEVEL=2
sed -i 's/ctx = ssl.SSLContext(ssl_version)/ctx = ssl.SSLContext(ssl_version)\n ctx.set_ciphers("DEFAULT:@SECLEVEL=1")/' /usr/lib/python3.*/site-packages/imaplib2/imaplib2.py
sed -i 's/ctx = ssl.SSLContext(ssl_version)/ctx = ssl.SSLContext(ssl_version)\n ctx.set_ciphers("DEFAULT:@SECLEVEL=1")/' /usr/lib/python3.*/site-packages/imaplib2/imaplib2.py && \
# Patch offlineimap email generator bug for defective messages
python3 /tmp/patch.py && rm /tmp/patch.py
COPY --chown=offlineimap offlineimaprc.*.tmpl /home/offlineimap/
# Add Tini

26
patch.py Normal file
View File

@@ -0,0 +1,26 @@
import sys, os
maildir_path = "/usr/lib/python3.12/site-packages/offlineimap/folder/Maildir.py"
with open(maildir_path, "r") as f:
maildir = f.read()
maildir = maildir.replace(
"fd.write(msg.as_bytes(policy=output_policy))",
"try:\n fd.write(msg.as_bytes(policy=output_policy))\n except UnicodeEncodeError:\n fd.write(msg.as_string(policy=output_policy).encode('utf-8'))"
)
with open(maildir_path, "w") as f:
f.write(maildir)
imap_path = "/usr/lib/python3.12/site-packages/offlineimap/folder/IMAP.py"
with open(imap_path, "r") as f:
imap_py = f.read()
imap_patch = """
def get_msg_bytes(msg, policy):
try:
return msg.as_bytes(policy=policy)
except UnicodeEncodeError:
return msg.as_string(policy=policy).encode('utf-8')
"""
imap_py = imap_patch + imap_py.replace("msg.as_bytes(policy=output_policy)", "get_msg_bytes(msg, output_policy)")
with open(imap_path, "w") as f:
f.write(imap_py)