Как использовать модуль электронной почты Python 3.2 для отправки Unicode сообщения, закодированные в utf-8 с цитированием-печатью?

Я хочу отправлять сообщения электронной почты с произвольными телами Unicode в программе Python 3.2. Но на самом деле эти сообщения будут состоять в основном из 7-битного текста ASCII. Поэтому я хотел бы, чтобы сообщения были закодированы в utf-8 с использованием quoted-printable. Пока что я обнаружил, что это работает, но это кажется неправильным:

c = email.charset.Charset('utf-8')
c.body_encoding = email.charset.QP
m = email.message.Message()
m.set_payload("My message with an '\u05d0' in it.".encode('utf-8').decode('iso8859-1'), c)

В результате получается электронное сообщение с точно правильным содержанием:

To: someone@example.com
From: someone_else@example.com
Subject: This is a subjective subject.
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

My message with an '=D7=90' in it.

В частности, b '\ xd7 \ x90'.decode (' utf -8 ') приводит к исходному символу Юникода. Таким образом, кодировка quoted-printable правильно отображает utf-8 . Я прекрасно понимаю, что это невероятно уродливый хакер. Но это работает.

Это Python 3. Ожидается, что текстовые строки всегда будут в формате Unicode. Мне не нужно было декодировать его в UTF-8.А затем превратить его из байтов обратно в str с помощью .decode ('iso8859-1') - это ужасный взлом, и мне не нужно этого делать что либо.

Это модуль электронной почты только что сломан относительно кодировок? Я что-то не получаю?

Я попытался просто установить его, без набора символов. Это оставляет мне сообщение электронной почты в кодировке Unicode, и это совсем не так. Я также попытался отказаться от шагов кодирования и декодирования . Если я оставлю их оба выключенными, он будет жаловаться на то, что \ u05d0 выходит за пределы допустимого диапазона при попытке решить, нужно ли указывать этот символ в кавычках для печати. Если я оставлю только шаг encode , он горько пожалуется на то, как я передаю байта , и ему понадобится str .

7
задан Omnifarious 22 February 2012 в 21:58
поделиться