Как преодолеть ограничение в 988 символов в заголовке письма? - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь отправить электронные письма большому количеству людей (более 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 Ответ

1 голос
/ 23 мая 2019

Ваше предположение, что линия 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...