]> git.ipfire.org Git - ipfire.org.git/commitdiff
messages: Encode emails as quoted-printable and remove MIME multipart headers
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 8 May 2019 16:14:35 +0000 (17:14 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 8 May 2019 16:14:35 +0000 (17:14 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/backend/messages.py

index bc0aabba04f0a08be06ef6658f0b12453374be03..5f90047f197c478571c7b449990b7d84f8daa3ab 100644 (file)
@@ -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)