Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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