Почему smtplib теряет пробел в длинных заголовках письма?
Пытаюсь отправить письмо с кириллическими символами через smtplib:
from email.message import EmailMessage
from smtplib import SMTP_SSL
def send_email():
msg = EmailMessage()
msg.set_content('some text')
msg.set_type('text/plain;')
msg.set_charset('utf-8')
msg['Subject'] = 'Отзывы Удобство работы с сайтом <= 5'
msg['From'] = 'Автоматизированная система контроля качества <[email protected]>'
msg['To'] = ['[email protected]']
server = SMTP_SSL('host', 465)
server.login('login', 'password')
server.send_message(msg)
server.quit()
Письма отправляются и доходят, но я заметил, что иногда у заголовков From или Subject пропадает пробел между некоторыми словами.
Вот пример проблемного заголовка:
Отзывы Удобство работы с сайтом <= 5
Я знаю, что при дефолтных настройках smtplib бьет длинные заголовки (более 78 символов) на части и кодирует их в base64. Закодированный заголовок выглядит примерно так:
=?utf-8?b?0J7RgtC30YvQstGLINCj0LTQvtCx0YHRgtCy0L4g0YDQsNCx0L7RgtGL?= =?utf-8?b?0YEg0YHQsNC50YLQvtC8?= <= 5
Проблема в том, что когда вторая строка начинается с пробела, smtplib его просто игнорирует и в закодированной части его уже нет. В моем заголовке строки бьются вот так:
- Первая строка:
Отзывы Удобство работы - Вторая строка:
с сайтом <= 5(первый символ - пробел)
То есть, после кодирования-раскодирования заголовка он выглядит вот так:
Отзывы Удобство работыс сайтом <= 5
Это баг smtplib или я что-то делаю не так? Можно ли как-то "научить" smtplib видеть пробел в начале строки и тоже кодировать его в base64?
P.S. Я знаю, что можно увеличить максимальную длину одной строки, тогда заголовок не будет разбиваться на части и пробел не пропадает:
msg = EmailMessage(policy=default.clone(max_line_length=500)).
Но RFC 2047 рекомендует длину строки 78 символов. Можно ли забить на эту рекомендацию и чем это черевато?