SMTP 电子邮件中的行长限制 [Was:使用 smtplib 发送 HTML 电子邮件的邮件长度限制]

Line length limit in SMTP emails [Was: Message length limit sending HTML email with smtplib]

提问人:zenzic 提问时间:10/10/2023 最后编辑:tripleeezenzic 更新时间:10/11/2023 访问量:54

问:

下面是一个简单的测试,演示了我所看到的问题:

import smtplib
from email.message import EmailMessage

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.add_alternative(str, subtype='html')
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 中每 1000 个字节就会“中断”。此长度包括 HTML 字符串中的任何标记。收到的电子邮件如下所示:

enter image description here

enter image description here

enter image description here

我尝试了具有不同邮件长度限制的不同 SMTP 服务器,但所有服务器都设置为 10M 或更高,所以我怀疑这有任何影响。此外,我没有收到错误代码或异常。一切都干净利落地发送。smtplib 似乎只是以某种方式破坏了消息。

知道问题是什么或如何纠正这个问题吗?

python smtp smtplib

评论

0赞 tripleee 10/11/2023
Python 应该为您处理这个问题(对于许多其他必要的场景,它会自动在幕后执行此操作),我无法复制; 在我的计算机上显示消息整齐地包装在带引号的可打印编码中,每 78 个字符换行一次 i.stack.imgur.com/sfPjz.pngprint(message.as_string())

答:

0赞 AnFi 10/10/2023 #1

问题:
这是 SMTP 服务器施加的行行长度限制的结果。
它会导致断线太长。

解决方案:
在 html 字符串中插入换行符。

for i in range(500):
  str += f'{i}: <a href="https://google.com">https://google.com</a><br>\n'

tidy程序可用于断开较长的 HTML 行(除其他外)。

链接:
SMTP 标头字段是否有可接受的最大行长?

评论

0赞 zenzic 10/10/2023
就是这样。我不确定问题出在SMTP服务器还是Outlook客户端呈现它上,但是断开行操作可以解决问题。谢谢你的建议!
0赞 zenzic 10/10/2023
在进一步审查时,它肯定发生在 SMTP 服务器上。源电子邮件被分解成 ~1000 字节的块,使 HTML 变得一团糟。