2013-02-18 6 views
10

Python obsługuje dość funkcjonalny kod MIME-Library o nazwie email.mime.Koduj MIMETEKST jako cytowany printables

Chcę osiągnąć to, że część MIME zawierająca zwykły tekst UTF-8 zostanie zakodowany jako cytowane materiały do ​​drukowania, a nie jako base64. Mimo wszystko funkcjonalność jest dostępna w bibliotece, nie udało mi się go używać:

Przykład:

import email.mime.text, email.encoders 
m=email.mime.text.MIMEText(u'This is the text containing ünicöde', _charset='utf-8') 
m.as_string() 
# => Leads to a base64-encoded message, as base64 is the default. 

email.encoders.encode_quopri(m) 
m.as_string() 
# => Leads to a strange message 

Ostatnia komenda powoduje dziwny komunikat:

Content-Type: text/plain; charset="utf-8" 
MIME-Version: 1.0 
Content-Transfer-Encoding: base64 
Content-Transfer-Encoding: quoted-printable 

GhpcyBpcyB0aGUgdGV4dCBjb250YWluaW5nIMO8bmljw7ZkZQ=3D=3D 

To nie jest oczywiście zakodowany w cudzysłowach, podwójny nagłówek jest w końcu dziwny (jeśli nie nielegalny).

W jaki sposób mogę uzyskać tekst zakodowany w cytowanych plikach w wiadomościach MIME?

+0

Zobacz także http://stackoverflow.com/a/9509718/874188 - pytaniem jest Python 3, ale użyłem go również w Pythonie 2. – tripleee

Odpowiedz

9

Okay, mam jedno rozwiązanie, które jest bardzo hacky, ale przynajmniej prowadzi w pewnym kierunku: MIMEText zakłada base64 i nie wiem jak to zmienić. Z tego powodu używam MIMENonMultipart:

import email.mime, email.mime.nonmultipart, email.charset 
m=email.mime.nonmultipart.MIMENonMultipart('text', 'plain', charset='utf-8') 

#Construct a new charset which uses Quoted Printables (base64 is default) 
cs=email.charset.Charset('utf-8') 
cs.body_encoding = email.charset.QP 

#Now set the content using the new charset 
m.set_payload(u'This is the text containing ünicöde', charset=cs) 

Teraz wydaje się, że wiadomość do zakodowania poprawnie:

Content-Type: text/plain; charset="utf-8" 
MIME-Version: 1.0 
Content-Transfer-Encoding: quoted-printable 

This is the text containing =C3=BCnic=C3=B6de 

Można nawet zbudować nową klasę, która ukrywa złożoność:

class MIMEUTF8QPText(email.mime.nonmultipart.MIMENonMultipart): 
    def __init__(self, payload): 
    email.mime.nonmultipart.MIMENonMultipart.__init__(self, 'text', 'plain', 
                 charset='utf-8') 

    utf8qp=email.charset.Charset('utf-8') 
    utf8qp.body_encoding=email.charset.QP 

    self.set_payload(payload, charset=utf8qp) 

I użyj go tak:

m = MIMEUTF8QPText(u'This is the text containing ünicöde') 
m.as_string() 
5

Adaptacja issue 1525919 i przetestowane na Python 2.7:

from email.Message import Message 
from email.Charset import Charset, QP 

text = "\xc3\xa1 = \xc3\xa9" 
msg = Message() 

charset = Charset('utf-8') 
charset.header_encoding = QP 
charset.body_encoding = QP 

msg.set_charset(charset) 
msg.set_payload(msg._charset.body_encode(text)) 

print msg.as_string() 

da wam:

MIME-Version: 1.0 
Content-Type: text/plain; charset="utf-8" 
Content-Transfer-Encoding: quoted-printable 

=C3=A1 =3D =C3=A9 

zobaczyć również this response z committer Pythona.

+0

Tęskniłem na początku, że wejście do 'body_encode' musi już być zakodowane w UTF-8, i że nie wykonuje ono kodowania utf-8 dla ciebie. Zauważając to tutaj, na wypadek gdyby inni ratowali ból związany z tym samym nieporozumieniem. –

Powiązane problemy