Python: кодирование сообщения как base64 для решения "!" и проблема длины линии - PullRequest
0 голосов
/ 06 марта 2019

ФОН

Относительно следующих статей:

Все проблемы и решения относятся к проблеме PHP, но я столкнулся с этой проблемой в Python.

Если я отправляю электронные письма непосредственно получателям, все в порядке, восклицательные знаки не отображаются и сообщение отображается правильно.

Однако, используя нашу систему «Sympa» (https://www.sympa.org/), которую Университет использует для решения «список рассылки», электронные письма этой системы содержат восклицательные знаки и разрывы строк, вставленные в сообщение, и разрывы HTML, вызывающие отображение вопросы.

Проблема связана с длиной строки. Любая строка длиннее волшебной строки длиной 998 символов получает этот восклицательный знак и вставляет разрывы строки.

СЕЙЧАС ВОПРОС

Одним из упомянутых решений является кодирование тела сообщения в base64, которое, по-видимому, неуязвимо для проблемы длины строки. Тем не менее, я не могу понять, как правильно сформировать сообщение в Python и правильно ли использовать заголовки и кодирование, чтобы сообщение правильно отображалось в почтовом клиенте.

В настоящее время мне удается отправлять письма только с телами с кодировкой base64 в виде вложенных файлов. Блек!

Мне нужно отправлять письма в кодировке HTML (таблицы и некоторое форматирование). Я создаю одну очень длинную объединенную строку всех html, сжатых вместе. Это некрасиво, но будет отображаться правильно.

HELP?!

ПРИМЕЧАНИЕ: Если у кого-то еще возникла эта проблема и есть решение, которое позволит мне отправлять электронные письма, которые не страдают от проблемы с длиной строки, я весь слух!

Исходный код по запросу

# Add support for emailing reports
import smtplib
# from email.mime.text import MIMEText
from email.mime.message import MIMEMessage
from email.encoders import encode_base64
from email.message import Message

... ...

headerData = {"rDate": datetime.datetime.now().strftime('%Y-%m-%d')}
msg_body = msg_header.format(**headerData) + contact_table + spacer + svc_table

theMsg = Message()
theMsg.set_payload(msg_body)
encode_base64(theMsg)
theMsg.add_header('Content-Transfer-Encoding', 'base64')
envelope = MIMEMessage(theMsg, 'html')

theSubject = "Audit for: "+aService['description']
envelope['Subject'] = theSubject

from_addr = "xxx@xxx"
envelope['From'] = from_addr

to_addrs = "xxx@xxxx"
# to_addrs = aService['contact_email']
envelope['To'] = to_addrs

# Send the message via our own SMTP server.
s = smtplib.SMTP('x.x.x.x')
s.sendmail(from_addr, to_addrs, envelope.as_string())
s.quit()

РЕШЕНИЕ, спасибо @Serge Ballesta Возвращаясь к MIMEText и указав набор символов, похоже, добился цели:

envelope = MIMEText(msg_body, 'html', _charset='utf-8') 
assert envelope['Content-Transfer-Encoding'] == 'base64'

envelope['Subject'] = "Audit for: "+aService['description']

from_addr = "f5-admins@utlists.utexas.edu"
envelope['From'] = from_addr

to_addrs = "xx-test@xx.xx.edu"
envelope['To'] = to_addrs

# Send the message via our own SMTP server.
s = smtplib.SMTP('xx.xx.xx.edu')
s.sendmail(from_addr, to_addrs, envelope.as_string())
s.quit()

Видимо, я просто копался и не учитывал набор символов. Использование MIMEText, а не MIMEMessage.

1 Ответ

1 голос
/ 06 марта 2019

Обычно email.mime.MIMEText автоматически устанавливает Content-Transfert-Encoding в base64, если тело не объявлено как простой ASCII.Таким образом, если предположить, что body содержит HTML-текст тела сообщения (там нет заголовков почты), достаточно объявить его как utf-8:

msg = email.mime.text.MIMEText(body, 'html', _charset='utf-8')

# assert the cte:
assert msg['Content-Transfer-Encoding'] == 'base64'

theSubject = "Audit for: "+aService['description']
msg['Subject'] = theSubject

from_addr = "xxx@xxx"
msg['From'] = from_addr

to_addrs = "xxx@xxxx"
# to_addrs = aService['contact_email']
msg['To'] = to_addrs

# optionally set other headers
# msg['Date']=datetime.datetime.now().isoformat()

# Send the message
s = smtplib.SMTP('x.x.x.x')
s.sendmail(from_addr, to_addrs, msg.as_bytes())
s.quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...