如何为电子邮件中的 Markdown 设置默认样式

How to set default styles for Markdown in email

我正在使用 Django-Markdown-deux 为电子邮件模板呈现 HTML。

考虑以下输入:

# Heading 1
Text goes here

这将呈现为:

<h1>Heading 1</h1>
<p>Text goes here</p>

有没有办法为每个元素添加默认样式?注意 styles 需要内联,因为这是电子邮件。例如:

<h1 style="color:#eee;font-family:'Helvetica Neue'">Heading 1</h1>

这不是Markdown自己能做到的。但是,有一些 Python 库将采用 HTML 输入(和一些 CSS)并使用内联样式重新格式化 HTML 输出(如 these answers 指出的那样) .因此,您需要获取 Markdown 的输出并将其传递到这些库之一。

由于您正在使用 Django 模板过滤器(我假设过滤器而不是 Deux 提供的标签)将 Markdown 呈现为 HTML,您将需要创建第二个过滤器来包装一个CSS 内联库并将 Markdown 过滤器的输出传递给您的自定义过滤器。您的自定义过滤器可能看起来像这样(未经测试):

from django import template
from django.utils.safestring import mark_safe
from pynliner import Pynliner

register = template.Library()

@register.filter(name="html2email")
def pynliner_filter(value):
    css = "h1 {color:#eee; font-family:'Helvetica Neue'}"
    p = Pynliner()
    return mark_safe(p.from_string(value).with_cssString(css).run())

然后,在您的模板中,您将执行:

{{ myvar|markdown|html2email }}

有趣的是,我在过滤器中对 CSS 进行了硬编码。将其扩展为可自定义留作 reader 的练习。有关创建和加载自定义模板过滤器的更多具体信息,请参阅 Django's docs


如果您在模板中定义了样式(在 <style> 标签中),那么这些样式可能需要应用于整个文档(而不仅仅是 Markdown 生成的部分)。请注意,内联工具将接受一个完整的 HTML 文件(其中定义了 CSS)并输出一个内联这些样式的文件。如果这是您的情况,那么您将不需要使用自定义模板过滤器。相反,在呈现模板后,您需要通过 Django 视图中的内联工具传递 HTML 文档。也许是这样的:

def someview(...)
    # Do your pre-template stuff here ...
    html = template.render()
    p = Pyliner()
    email_body = p.from_string(html).run()
    # Send your email here (or whatever you are doing) ...

没有关于您的具体情况的更多信息,上面的代码遗漏了很多内容。仅解决与此特定问题相关的部分。有一个工作视图还有很多。虽然,如果您已经有一个工作视图,那么大概您只需要用上面显示的几行替换呈现模板的行。