Почему 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 символов. Можно ли забить на эту рекомендацию и чем это черевато?


Ответы (0 шт):