You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:44:26