如何克服电子邮件 header 中的 988 个字符限制?
How to overcome 988 char limitation in email header?
我正在尝试向大量个人(100 多个)发送电子邮件,但在第 988 个字符后引入了换行符,这会中断电子邮件字符串,导致 "undeliverable" 错误。
总的来说,我对编码还比较陌生,但已经设法从一些在线研究中拼凑了一些代码片段。我尝试使用 Header
object,但我收到了相同的结果。
即:
from email.header import Header
msg['To'] = str(Header(','.join(list_of_emails)))
根据我能找到的有限信息,我了解到 header 必须折叠以符合 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()
该代码块完全符合我的预期:发送一封电子邮件,其中包含适当的 header、body 和附件。在我开始包括 msg['To']
下的大量收件人之前,我不会出现任何问题。例如,如果使用包含 100 多封电子邮件的列表,其中一些会被换行符打断并显示为 'bobsmith@ex ample.com'
我相信由于 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。
我正在尝试向大量个人(100 多个)发送电子邮件,但在第 988 个字符后引入了换行符,这会中断电子邮件字符串,导致 "undeliverable" 错误。
总的来说,我对编码还比较陌生,但已经设法从一些在线研究中拼凑了一些代码片段。我尝试使用 Header
object,但我收到了相同的结果。
即:
from email.header import Header
msg['To'] = str(Header(','.join(list_of_emails)))
根据我能找到的有限信息,我了解到 header 必须折叠以符合 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()
该代码块完全符合我的预期:发送一封电子邮件,其中包含适当的 header、body 和附件。在我开始包括 msg['To']
下的大量收件人之前,我不会出现任何问题。例如,如果使用包含 100 多封电子邮件的列表,其中一些会被换行符打断并显示为 'bobsmith@ex ample.com'
我相信由于 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。