Comment puis-je obtenir un message électronique du texte contenu à l'aide de Python?
Donné un message RFC822 en Python 2.6, comment puis-je obtenir le droit text/plain contenu de la partie? Fondamentalement, l'algorithme que je veux c'est ceci:
message = email.message_from_string(raw_message)
if has_mime_part(message, "text/plain"):
mime_part = get_mime_part(message, "text/plain")
text_content = decode_mime_part(mime_part)
elif has_mime_part(message, "text/html"):
mime_part = get_mime_part(message, "text/html")
html = decode_mime_part(mime_part)
text_content = render_html_to_plaintext(html)
else:
# fallback
text_content = str(message)
return text_content
De ces choses, j'ai get_mime_part
et has_mime_part
bas pat, mais je ne suis pas tout à fait sûr de savoir comment obtenir le texte décodé à partir de la partie MIME. Je peux obtenir le codé texte à l'aide de get_payload()
, mais si j'essaie d'utiliser le decode
paramètre de la get_payload()
méthode (voir le doc) j'ai une erreur quand je l'appelle sur le text/plain partie:
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ email/message.py", line 189, in get_payload raise TypeError('Expected list, got %s' % type(self._payload)) TypeError: Expected list, got <type 'str'>
En plus, je ne sais pas comment prendre le HTML et le rendu de texte d'aussi près que possible.
- J'ai trouvé une solution utile à quelque chose de similaire au ginstrom.com/scribbles/2007/11/19/...
Vous devez vous connecter pour publier un commentaire.
Dans un multipart e-mail,
email.message.Message.get_payload()
renvoie une liste avec un seul élément de chaque partie. La façon la plus simple est de marcher sur le message et obtenir la charge utile sur chaque partie:Pour un non-message multipart, pas besoin de faire toute la marche. Vous pouvez aller directement à get_payload(), indépendamment de content_type.
Si le contenu est encodé, vous devez passer
None
comme premier paramètre deget_payload()
, suivie par Vrai (le décoder drapeau est le deuxième paramètre). Par exemple, supposons que mon adresse e-mail contient un document MS Word pièce jointe:Comme pour obtenir une raisonnable de texte brut rapprochement d'une partie HTML, j'ai trouvé que html2text fonctionne sacrément bien.
part.get_payload(None, True)
vous pouvez utiliserpart.get_payload(decode=True)
, qui je pense est un peu plus clair.Plat est meilleur que imbriquées 😉
multipart/alternative
où seule une partie esttext/plain
, que l'on. Dans le cas plus général, je ne pense pas qu'il y est une seule bonne réponse, parce qu'il dépend de l'objet de votre demande et les préférences du destinataire.