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
相关产品推荐
相关产品推荐

