4 votes

Comment décoder une partie mime d'un message et obtenir une chaîne **unicode** en Python 2.7 ?

Voici une méthode qui tente de récupérer la partie html d'un message électronique :

from __future__ import absolute_import, division, unicode_literals, print_function

import email

html_mail_quoted_printable=b'''Subject: =?ISO-8859-1?Q?WG=3A_Wasenstra=DFe_84_in_32052_Hold_Stau?=
MIME-Version: 1.0
Content-type: multipart/mixed;
 Boundary="0__=4EBBF4C4DFD012538f9e8a93df938690918c4EBBF4C4DFD01253"

--0__=4EBBF4C4DFD012538f9e8a93df938690918c4EBBF4C4DFD01253
Content-type: multipart/alternative;
 Boundary="1__=4EBBF4C4DFD012538f9e8a93df938690918c4EBBF4C4DFD01253"

--1__=4EBBF4C4DFD012538f9e8a93df938690918c4EBBF4C4DFD01253
Content-type: text/plain; charset=ISO-8859-1
Content-transfer-encoding: quoted-printable

Freundliche Gr=FC=DFe

--1__=4EBBF4C4DFD012538f9e8a93df938690918c4EBBF4C4DFD01253
Content-type: text/html; charset=ISO-8859-1
Content-Disposition: inline
Content-transfer-encoding: quoted-printable

<html><body>
Freundliche Gr=FC=DFe
</body></html>
--1__=4EBBF4C4DFD012538f9e8a93df938690918c4EBBF4C4DFD01253--

--0__=4EBBF4C4DFD012538f9e8a93df938690918c4EBBF4C4DFD01253--

'''
def get_html_part(msg):
    for part in msg.walk():
        if part.get_content_type() == 'text/html':
            return part.get_payload(decode=True)

msg=email.message_from_string(html_mail_quoted_printable)
html=get_html_part(msg)
print(type(html))
print(html)

Sortie :

<type 'str'>
<html><body>
Freundliche Gr��e
</body></html>

Malheureusement, j'obtiens une chaîne d'octets. J'aimerais avoir une chaîne unicode.

Selon cette réponse msg.get_payload(decode=True) devrait faire la magie. Mais ce n'est pas le cas dans cette affaire.

Comment décoder une partie mime d'un message et obtenir une unicode dans Python 2.7 ?

6voto

bobince Points 270740

Malheureusement, j'obtiens une chaîne d'octets. J'aimerais avoir une chaîne unicode.

Le site decode=True pour get_payload ne décode que le Content-Transfer-Encoding l'enveloppe = -dans ce message. Pour passer de là à des caractères, c'est l'une des nombreuses choses que l'équipe du email Le paquet vous fait faire vous-même :

bytes = part.get_payload(decode=True)
charset = part.get_content_charset('iso-8859-1')
chars = bytes.decode(charset, 'replace')

( iso-8859-1 étant la solution de repli dans le cas où le message ne spécifie aucun encodage).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X