#!/usr/bin/python3
import email
-import email.mime.multipart
+import email.charset
+import email.mime.nonmultipart
import email.utils
import logging
import subprocess
}
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)