如何克服电子邮件标头中的988 char限制?

时间:2019-05-23 02:18:01

标签: python python-3.x smtplib email-headers

我正在尝试向大量个人(超过100个)发送电子邮件,但是在第988个字符之后引入了换行符,这会中断电子邮件字符串,从而导致“无法传递”错误。

对于一般的编码我还是比较陌生的,但是已经设法从一些在线研究中整理了一些代码片段。我尝试改用Header对象,但收到了相同的结果。

即:

from email.header import Header
msg['To'] = str(Header(','.join(list_of_emails)))

从我只能找到的有限信息中,我发现必须折叠标题才能符合RC 2822格式,但是我不知道该怎么做。

import smtplib
from email.message import EmailMessage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

msg = MIMEMultipart()
msg['From'] = me
msg['To'] = ','.join(['john@example.com', 'mary@example.com', 
                   ..., 'mike@example'])
msg['Subject'] = subject

body = 'enter text here'

msg.attach(MIMEText(body,'plain'))

filename = 'abc123.xlsx'   
attachment = open('C:\Users\......', "rb")    

part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
attachment.close()

encoders.encode_base64(part)
part.add_header('Content-Disposition', f"attachment; filename={filename}")

msg.attach(part)
server = smtplib.SMTP('smtp.office365.com', 587)
server.starttls()
server.login(user, password)
server.send_message(msg)
server.quit()

该代码块完全符合我的期望:发送一封电子邮件,其中包括适当的标题,正文和附件。在开始在msg['To']下包含大量收件人之前,我没有出现任何问题。例如,如果使用包含100多个电子邮件的列表,其中的一些会以换行符打断并显示为这样,'bobsmith@ex ample.com'我相信由于1行中的字符限制,我会遇到此问题,但是我不知道我该如何克服这个问题。

1 个答案:

答案 0 :(得分:1)

您假设msg['To'] = str(Header(','.join(list_of_emails)))行是问题,这是正确的。自动换行(您无需手动转换为str或使用Header)。但是,换行取决于分隔符而不是逗号。因此,没有任何断字,您的行每988个字符就会分割一次。使用分词功能,只要地址不超过988个字符就可以了。要插入空格,请将有问题的行替换为

msg['To'] = Header(', '.join(list_of_emails))

或者只是

msg['To'] = ', '.join(list_of_emails)

请记住,您首先使用的是传统API。