-#
-# email.py
-#
-# This module is essentially a wrapper for Python's premailer and whatever
-# the default mail handler is.
-#
+"""
+This module is essentially a wrapper for Python's premailer and whatever the
+default mail transfer is (usually Postfix). Note that the premailer package
+(https://pypi.org/project/premailer/) is required for style embedding.
+
+This module provides the following methods:
+ - `mailprep`: embed CSS styles into inline HTML tags
+ - `sendmail`: send HTML or plaintext email using default mail handler
+"""
import logging
logger = logging.getLogger(__name__)
from os.path import isfile
-from premailer import transform
+import premailer
from email.mime.text import MIMEText
import subprocess
+
def mailprep(htmlin, stylesheet):
+ """
+ Embed CSS styles from a file into inline HTML tags. Requires the premailer
+ package (https://pypi.org/project/premailer/).
+ """
+
logger.debug("Converting stylesheet " + stylesheet + " to inline tags")
if not isfile(stylesheet):
logger.warning("Cannot read stylesheet {}: file does not exist".format(stylesheet))
return htmlout
-def sendmail(mailbin, body, recipient, subject, *sender):
+def sendmail(mailbin, body, recipient, subject, html=True, sender=""):
+ """
+ Prepare and send an email in either HTML or plain text format. The default
+ MTA path is usually correct, but can be modified in the config option
+ "mailbin" in the [mail] section.
+ """
+
logger.debug("Sending email")
- msg = MIMEText(body)
+ msg = MIMEText(body, 'html' if html else 'plain')
if sender:
msg["From"] = sender
msg["To"] = recipient
+ msg["Content-type"] = "text/html: te: text/html" if html else "text/plain: te: text/plain"
msg["Subject"] = subject
- mailproc = subprocess.Popen([mailbin, '--debug-level=10', '-t'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+ mailproc = subprocess.Popen([mailbin, "--debug-level=" + str(10 if logging.root.level == logging.DEBUG else 0), "-t"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
logger.debug("Compiled message and opened process")
try:
stdout = mailproc.communicate(msg.as_bytes(), timeout=15)
logger.debug("sendmail output: {}".format(stdout))
- logger.info("Sent email")
+ logger.info("Sent email to {0}".format(recipient))
return 0
-# except TimeoutExpired:
-# mailproc.kill()
-# stdout = mailproc.communicate()
-# logger.debug("Timeout expired: {}".format(stdout))
-# raise subprocess.TimeoutError
except Exception as e:
mailproc.kill()
logger.warning("Failed to send message: {0}".format(str(e)))
-# raise ChildProcessError