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

Python smtplib发送长HTML邮件出现单词拆分问题求助

解决SMTP发送HTML邮件时长文本单词被拆分的问题

嘿,这个问题我之前踩过坑!罪魁祸首其实是SMTP协议的行长度限制——RFC规范里要求邮件内容每行尽量不超过78个字符(硬性上限是998),如果你的HTML文本一行太长,不管是smtplib底层还是邮件传输过程中,都会自动帮你换行,但它可不管是不是在单词中间,直接就给拆了,于是就出现了你看到的“ti me”“ju st”这种奇怪的拆分。

给你几个靠谱的解决方案,按推荐程度排序:

方案1:用HTML标签规范文本结构(最省心)

把你的长文本放进<p>标签里,让邮件客户端自己处理换行逻辑。邮件客户端会根据显示窗口的宽度自动换行,绝对不会在单词中间乱拆。示例代码:

# 假设你的长文本存在这个变量里
long_html_text = "Once upon a time there was a developer who just couldn't figure out why..."

html_content = f"""
<html>
  <body>
    <p>{long_html_text}</p>
  </body>
</html>
"""

这样即使文本再长,客户端也会帮你做合理的换行,完全不用操心SMTP的行限制。

方案2:手动对长文本做“不拆单词”的换行

如果必须自己控制文本的换行位置,可以用Python自带的textwrap模块,设置break_long_words=False,让它只在空格处断行,绝对不会拆分单词。示例:

import textwrap

long_plain_text = "Once upon a time there was a developer who just couldn't figure out why..."
# 把文本拆成每行最多70字符,仅在空格处换行
wrapped_text = textwrap.fill(long_plain_text, width=70, break_long_words=False)

html_content = f"""
<html>
  <body>
    {wrapped_text}
  </body>
</html>
"""

这样生成的HTML每行长度都符合SMTP的要求,传输过程中就不会被乱拆分了。

方案3:设置正确的邮件传输编码

给邮件设置quoted-printable编码,这种编码会自动将长文本转换成符合SMTP规范的格式,同时保留单词的完整性。构造邮件对象时这么做:

from email.mime.text import MIMEText

html_content = "<html><body>你的超长HTML文本...</body></html>"
msg = MIMEText(html_content, 'html', 'utf-8')
# 启用quoted-printable编码
msg.set_charset('utf-8', quoted_printable=True)

这种方式会让邮件内容以编码后的形式传输,接收端解码后就能看到完整的单词了。

优先试试方案1,几乎能解决90%的这类问题,而且代码改动最小!

内容的提问来源于stack exchange,提问作者GaryK26

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:43:17