提问人:zenzic 提问时间:10/10/2023 最后编辑:tripleeezenzic 更新时间:10/11/2023 访问量:54
SMTP 电子邮件中的行长限制 [Was:使用 smtplib 发送 HTML 电子邮件的邮件长度限制]
Line length limit in SMTP emails [Was: Message length limit sending HTML email with smtplib]
问:
下面是一个简单的测试,演示了我所看到的问题:
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 字符串中的任何标记。收到的电子邮件如下所示:
我尝试了具有不同邮件长度限制的不同 SMTP 服务器,但所有服务器都设置为 10M 或更高,所以我怀疑这有任何影响。此外,我没有收到错误代码或异常。一切都干净利落地发送。smtplib 似乎只是以某种方式破坏了消息。
知道问题是什么或如何纠正这个问题吗?
答:
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 行(除其他外)。
评论
0赞
zenzic
10/10/2023
就是这样。我不确定问题出在SMTP服务器还是Outlook客户端呈现它上,但是断开行操作可以解决问题。谢谢你的建议!
0赞
zenzic
10/10/2023
在进一步审查时,它肯定发生在 SMTP 服务器上。源电子邮件被分解成 ~1000 字节的块,使 HTML 变得一团糟。
评论
print(message.as_string())