SMTP邮件行长度限制问题:使用smtplib发送HTML邮件异常
问题原因
这是Python的email模块默认使用quoted-printable编码处理MIME内容导致的。这种编码为了兼容SMTP协议的行长度规范(RFC 5322要求每行不超过998字符),会自动将超过76字符的长行拆分成多行,每行末尾加=作为软换行标记。如果你的HTML内容没有自然换行(所有标签连在一起),拆分可能直接打断HTML标签或文本,部分邮件客户端无法正确识别这些软换行,就会显示内容断裂的异常。
解决办法
有两种可行方案:
方案1:给HTML内容添加自然换行
构建HTML字符串时,在合适位置(比如<br>后或标签之间)添加换行符,让编码拆分发生在非关键位置,避免打断标签:
str = '' for i in range(500): str += f'{i}: <a href="https://google.com">https://google.com</a><br>\n'
方案2:改用base64编码替代quoted-printable
修改HTML内容的传输编码为base64,这种编码不会拆分长行,能完整保留原始HTML结构:
方式一:手动构建MIME部分
import smtplib from email.message import EmailMessage from email import encoders from email.mime.base import MIMEBase my_addr = 'my_email@my_domain.com' str = '' for i in range(500): str += f'{i}: <a href="https://google.com">https://google.com</a><br>' msg = EmailMessage() msg.set_content('') msg['Subject'] = 'html test' msg['From'] = my_addr msg.add_header('reply-to', my_addr) msg['To'] = my_addr # 创建base64编码的HTML部分 html_part = MIMEBase('text', 'html') html_part.set_payload(str) encoders.encode_base64(html_part) msg.attach(html_part) with smtplib.SMTP('localhost', timeout=30) as smtp_server: smtp_server.send_message(msg)
方式二:直接在add_alternative中指定编码器
import smtplib from email.message import EmailMessage from email import encoders my_addr = 'my_email@my_domain.com' str = '' for i in range(500): str += f'{i}: <a href="https://google.com">https://google.com</a><br>' msg = EmailMessage() msg.set_content('') # 指定base64编码器 msg.add_alternative(str, subtype='html', encoder=encoders.encode_base64) msg['Subject'] = 'html test' msg['From'] = my_addr msg.add_header('reply-to', my_addr) msg['To'] = my_addr with smtplib.SMTP('localhost', timeout=30) as smtp_server: smtp_server.send_message(msg)
这样发送的HTML内容会以base64编码传输,不会被拆分,邮件客户端解码后即可正常显示完整内容。
内容的提问来源于stack exchange,提问作者zenzic
相关产品推荐
相关产品推荐

