""" 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 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)) raise FileNotFoundError pm = premailer.Premailer(htmlin, external_styles=stylesheet) htmlout = pm.transform() logger.info("Converted stylesheet to inline tags") return htmlout 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, '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=" + 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 to {0}".format(recipient)) return 0 except Exception as e: mailproc.kill() logger.warning("Failed to send message: {0}".format(str(e)))