Я хочу отправлять сообщения электронной почты с произвольным телом 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')
приводит к исходному символу Unicode. Таким образом, кодировка quoted-printable
правильно отображает utf-8
. Я прекрасно понимаю, что это невероятно безобразный хак. Но это работает.
Это Python 3. Предполагается, что текстовые строки всегда будут в юникоде. Мне не нужно было декодировать его до utf-8. И затем превращение его из bytes
обратно в str
на .decode('iso8859-1')
- ужасный хак, и мне тоже не пришлось бы этого делать.
Это модуль email
просто сломан по отношению к кодировкам? Я что-то не понимаю?
Я пытался просто установить старый набор без набора символов. Это оставляет меня с почтовым сообщением Unicode, и это совсем не правильно. Я также попытался опустить шаги encode
и decode
. Если я оставлю их обоих выключенными, они будут жаловаться на то, что \u05d0
выходит за пределы допустимого диапазона при попытке решить, нужно ли указывать этот символ в кодировке для печати в кавычках. Если я ухожу только на шаге encode
, он горько жалуется на то, как я передаю bytes
, и он хочет str
.