Chcę wysyłać wiadomości e-mail z dowolnymi ciałami unicode w programie Python 3.2. Ale w rzeczywistości wiadomości te będą składały się głównie z tekstu ASCII 7-bitowego. Chciałbym więc, aby wiadomości zakodowane w utf-8 używały opcji quoted-printable. Do tej pory znalazłem to działa, ale wydaje się źle:Jak używać modułu e-mailowego Python 3.2 do wysyłania wiadomości w formacie Unicode zakodowanych w utf-8 za pomocą opcji 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)
Prowadzi to do wiadomości e-mail z dokładnie prawej treści:
To: [email protected]
From: [email protected]
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.
W szczególnych b'\xd7\x90'.decode('utf-8')
wyników w oryginalnym znaku Unicode . Tak więc kodowanie quoted-printable
prawidłowo renderuje utf-8
. Doskonale wiem, że to niesamowicie brzydki hack. Ale działa.
To jest Python 3. Łańcuchy tekstowe powinny zawsze być w Unicode. Nie powinienem był dekodować go do UTF-8. A następnie przekształcenie go z bytes
z powrotem w str
przez .decode('iso8859-1')
jest okropnym hackerem, i nie powinienem był tego robić.
Czy moduł email
właśnie pękł w odniesieniu do kodowania? Czy nie dostaję czegoś?
Próbowałem po prostu ustawić go bez zestawu znaków. To pozostawia mi wiadomość e-mail w formacie Unicode, a to wcale nie jest w porządku. Próbowałem również odejść od kroków encode
i decode
. Jeśli zostawiam je wyłączonym, narzeka, że \u05d0
jest poza zakresem, próbując zdecydować, czy ta postać musi być cytowana w kodowaniu, które można wydrukować. Jeśli zostanę w kroku encode
, z goryczą skarży się na to, jak przechodzę w numerze bytes
i chce mieć str
.
Jeśli '„Moja wiadomość z «\ u05d0» w nim.”' Jest unicode chcecie, to nie można użyć '" Moja wiadomość z «\ u05d0» w it. ". encode ('utf-8') .odtoduj ('iso8859-1')', ponieważ jest to inny kod Unicode. (Zmienisz wiadomość.) – unutbu
@unutbu: Gratulacje, że zauważyłeś, dlaczego kod jest bardzo brzydki. Ale działa. Osiąga pożądany rezultat. Zobacz moją aktualizację. – Omnifarious