From d701b84110e0f47cbfdeb05131a2d28b6f40d92e Mon Sep 17 00:00:00 2001 From: Son Date: Mon, 25 Oct 2021 14:34:13 +0200 Subject: [PATCH] decode and encode email payload for quoted-printable email in replace() --- app/email_utils.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/app/email_utils.py b/app/email_utils.py index 8958b61c..4aa467f4 100644 --- a/app/email_utils.py +++ b/app/email_utils.py @@ -964,12 +964,22 @@ def replace(msg: Message, old, new) -> Message: encoding = get_encoding(msg) payload = msg.get_payload() if type(payload) is str: - clone_msg = copy(msg) - new_payload = payload.replace( - encode_text(old, encoding), encode_text(new, encoding) - ) - clone_msg.set_payload(new_payload) - return clone_msg + if encoding == EmailEncoding.QUOTED: + LOG.d("handle quoted-printable replace %s -> %s", old, new) + # first decode the payload + new_payload = quopri.decodestring(payload).decode("utf-8") + # then replace the old text + new_payload = new_payload.replace(old, new) + clone_msg = copy(msg) + clone_msg.set_payload(quopri.encodestring(new_payload.encode())) + return clone_msg + else: + clone_msg = copy(msg) + new_payload = payload.replace( + encode_text(old, encoding), encode_text(new, encoding) + ) + clone_msg.set_payload(new_payload) + return clone_msg elif content_type in ( "multipart/alternative",