def generate(cls, plaintext_template: str, markdown_template: str, html_template: str, context: dict): envelope = Envelope() # render markdown content extended_context = context.copy() if markdown_template: markdown_content, extended_context = cls._separate_content_and_metadata( markdown_template, context) markdown_content = cls.JinjaRenderer.render( markdown_content, extended_context) extended_context["content"] = cls.MarkdownRenderer.render( markdown_content) html_template = html_template or DEFAULTHTML_TEMPLATE # render html content if html_template: html_content, extended_context = cls._separate_content_and_metadata( html_template, extended_context) html_content = cls.JinjaRenderer.render(html_content, extended_context) envelope.message(html_content, alternative="html") sender = extended_context.get("sender", None) recipient = extended_context.get("recipient", None) subject = extended_context.get("subject", "") if plaintext_template: # render plaintext content plaintext_content, extended_context = cls._separate_content_and_metadata( plaintext_template, context) plaintext_content = cls.JinjaRenderer.render( plaintext_content, extended_context) else: # generate plaintext from html html_to_text_converter = html2text.HTML2Text() html_to_text_converter.ignore_images = True plaintext_content = html_to_text_converter.handle(html_content) envelope.message(plaintext_content, alternative="plain") sender = sender or extended_context.get("sender", None) recipient = recipient or extended_context.get("recipient", None) subject = subject or extended_context.get("subject", "") if not sender: raise Exception("Missing sender") envelope.from_(sender).to(recipient).subject(subject) return envelope
def _send_mail(self, envelope: Envelope) -> None: recipients = self._test_email_set if self._test_email_set else envelope.recipients Log.info("Sending email from {} to {}", envelope.from_(), ", ".join(list(envelope.recipients()))) if Log.level >= Log.DEBUG: formatted_mail = "\n".join( [" > " + l for l in envelope.preview().splitlines()]) Log.debug("Message content:\n" + formatted_mail) if not self._dry_run: # tls settings envelope.smtp( host=self._smtp["host"], port=self._smtp["port"], user=self._smtp["user"], password=self._smtp["password"], security=self._smtp["security"], ) # sign the email if self._gpg_sign: envelope.signature( key=self._gpg_key if self._gpg_key else True, passphrase=self._gpg_passphrase) # encrypt the email if self._gpg_encrypt: envelope.encryption() # send the email try: envelope.send() except smtplib.SMTPAuthenticationError as err: raise Exception( f"Authentication failed: {err.self._error.decode('utf-8')}" ) except smtplib.SMTPServerDisconnected as err: raise Exception( f"Server disconnected: {err.self._error.decode('utf-8')}") except Exception as e: raise e