Flask开发邮件功能:HTML模板渲染文本忽略换行符问题
解决邮件换行被忽略的问题
这个问题我之前也碰到过,本质是HTML与纯文本对换行符的处理逻辑差异导致的——HTML会把普通的\n换行符当成空白字符合并,不会显示成换行。根据你要发送的邮件类型,有两种清晰的解决方案:
方案1:发送纯文本邮件
如果你的邮件不需要HTML格式,直接发送纯文本就能完美保留换行。只需要在构建邮件时指定纯文本内容,而非HTML内容:
假设你的发送邮件函数基于Flask-Mail,修改成这样就行:
from flask_mail import Message from app import mail def send_mailing_list_email(subject, text_content, recipients): msg = Message(subject, recipients=recipients) # 用body字段设置纯文本内容,替换原来的html字段 msg.body = text_content mail.send(msg)
这样用户输入的Line 1\nLine 2会被邮件客户端正确解析成换行显示。
方案2:发送HTML邮件(保留换行)
如果需要HTML格式的邮件,就得把用户输入的换行转换成HTML能识别的<br>标签,这里有两种安全的处理方式:
方式A:在Jinja2模板中用内置过滤器处理
Jinja2自带nl2br过滤器,它会自动把换行符转换成<br>,同时还会转义用户输入中的HTML标签(避免XSS攻击)。在你的HTML邮件模板里这样写:
<div class="email-content"> {{ user_input_text|nl2br }} </div>
比如用户输入的Line 1\nLine 2\nLine 3会被自动转换成Line 1<br>Line 2<br>Line 3,在邮件里就能正常显示换行。
方式B:在视图函数中预处理文本
如果你更倾向于在后端处理,也可以用Python的replace方法转换换行,但记得要先对用户输入做HTML转义(防止恶意代码注入):
from markupsafe import escape # 获取用户提交的邮件文本 user_input = request.form.get("email_content") # 先转义危险字符,再替换换行符为HTML换行标签 formatted_content = escape(user_input).replace("\n", "<br>") # 把处理后的内容传给发送邮件函数 send_email(..., html_content=formatted_content)
额外提醒(针对Mailgun)
如果你是直接调用Mailgun的API发送邮件,要注意请求参数的设置:
- 发送纯文本:在POST数据中包含
text字段,值为用户输入的原始文本 - 发送HTML:在POST数据中包含
html字段,值为处理后的HTML内容
这样就能确保邮件里的换行正常显示啦!
内容的提问来源于stack exchange,提问作者Rodolfo Alvarez
相关产品推荐
相关产品推荐

