From 523dac35c7f29404932d6bdad81935a624b289e2 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Wed, 8 May 2019 17:14:35 +0100 Subject: [PATCH] messages: Encode emails as quoted-printable and remove MIME multipart headers Signed-off-by: Michael Tremer --- src/backend/messages.py | 63 ++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/src/backend/messages.py b/src/backend/messages.py index bc0aabba..5f90047f 100644 --- a/src/backend/messages.py +++ b/src/backend/messages.py @@ -1,7 +1,8 @@ #!/usr/bin/python3 import email -import email.mime.multipart +import email.charset +import email.mime.nonmultipart import email.utils import logging import subprocess @@ -99,47 +100,37 @@ class Messages(misc.Object): } namespace.update(kwargs) - # Create a MIMEMultipart message. - message = email.mime.multipart.MIMEMultipart() + # Create a non-multipart message + message = email.mime.nonmultipart.MIMENonMultipart( + "text", "plain", charset="utf-8", + ) - # Create an alternating multipart message to show HTML or text - alternative = email.mime.multipart.MIMEMultipart("alternative") + # Load template + t = self.template_loader.load("%s.txt" % template_name) - for extension, mime_type in (("txt", "plain"), ("html", "html")): - try: - t = self.template_loader.load("%s.%s" % (template_name, extension)) - except IOError: - continue - - # Render the message - try: - message_part = t.generate(**namespace) - - # Reset the rendered template when it could not be rendered - except: - self.template_loader.reset() - raise - - # Parse the message and extract the header - message_part = email.message_from_string(message_part.decode()) - for k, v in list(message_part.items()): - try: - message.replace_header(k, v) - except KeyError: - message.add_header(k, v) + # Render the message + try: + message_part = t.generate(**namespace) - message_body = message_part.get_payload() + # Reset the rendered template when it could not be rendered + except: + self.template_loader.reset() + raise - # Create a MIMEText object out of it - message_part = email.mime.text.MIMEText(message_body, mime_type, "utf-8") + # Parse the message and extract the header + message_part = email.message_from_string(message_part.decode()) + for k, v in list(message_part.items()): + try: + message.replace_header(k, v) + except KeyError: + message.add_header(k, v) - # Attach the parts to the mime container. - # According to RFC2046, the last part of a multipart message - # is preferred. - alternative.attach(message_part) + # Do not encode emails in base64 + charset = email.charset.Charset("utf-8") + charset.body_encoding = email.charset.QP - # Add alternative section to outer message - message.attach(alternative) + # Set payload + message.set_payload(message_part.get_payload(), charset=charset) # Send the message self.send(recipients, message, priority=priority, headers=headers) -- 2.47.3