Comment puis-je répondre à un e-mail en utilisant le imaplib Python et inclure le message d'origine?

StackOverflow https://stackoverflow.com/questions/2182196

Question

J'utilise actuellement imaplib pour récupérer les e-mails à partir d'un serveur et de traiter les le contenu et les pièces jointes.

Je voudrais répondre aux messages avec un état / message d'erreur et des liens vers le contenu généré résultant sur mon site si elles peuvent être traitées. Cela devrait inclure le message d'origine, mais devrait déposer toutes les pièces jointes (qui sera grande) et de les remplacer de préférence avec seulement leurs noms de fichiers / tailles.

Depuis que je me promène déjà les parties de message MIME, je suppose que je dois faire est de construire un nouvel arbre de message MIME contenant une copie du message d'origine et supprimer / remplacer les noeuds de fixation.

Avant de commencer dans cette voie, j'espérais que quelqu'un peut me donner quelques conseils. Y at-il sorte de fonction de bibliothèque pour le faire? Tout type de comportement standard que je devrais tenir à?

Je sais actuellement / je utilise les imaplib, les modules de smtplib et email et, mais peut-être manqué quelque chose d'évident là-dedans. Ceci est en cours d'exécution dans Django aussi, donc peut utiliser quoi que ce soit dans django.core.email si cela facilite les choses.

Était-ce utile?

La solution

L'arborescence MIME d'origine du message entrant est la suivante (en utilisant email.iterators._structure(msg)):

multipart/mixed
    text/html                (message)
    application/octet-stream (attachment 1)
    application/octet-stream (attachment 2)

En réponse via GMail se traduit par la structure suivante:

multipart/alternative
    text/plain
    text/html

i.e.. qu'ils ne sont pas aussi intelligent que je pensais, juste jeter les pièces jointes (bon) et en fournissant des versions texte et HTML qui restructurent explicitement le « contenu cité ».

Je commence à penser que c'est tout ce que je dois faire aussi simplement répondre avec un message simple après avoir jeté les pièces jointes il n'y a pas beaucoup d'intérêt à garder le message d'origine.

Encore, pourrait aussi bien répondre à ma question initiale puisque je l'ai compris comment maintenant de toute façon.

D'abord, remplacer toutes les pièces jointes dans le message d'origine avec le texte / caractères génériques simples:

import email

original = email.message_from_string( ... )

for part in original.walk():
    if (part.get('Content-Disposition')
        and part.get('Content-Disposition').startswith("attachment")):

        part.set_type("text/plain")
        part.set_payload("Attachment removed: %s (%s, %d bytes)"
                         %(part.get_filename(), 
                           part.get_content_type(), 
                           len(part.get_payload(decode=True))))
        del part["Content-Disposition"]
        del part["Content-Transfer-Encoding"]

Créez ensuite un message de réponse:

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.message import MIMEMessage

new = MIMEMultipart("mixed")
body = MIMEMultipart("alternative")
body.attach( MIMEText("reply body text", "plain") )
body.attach( MIMEText("<html>reply body text</html>", "html") )
new.attach(body)

new["Message-ID"] = email.utils.make_msgid()
new["In-Reply-To"] = original["Message-ID"]
new["References"] = original["Message-ID"]
new["Subject"] = "Re: "+original["Subject"]
new["To"] = original["Reply-To"] or original["From"]
new["From"] = "me@mysite.com"

Ensuite, fixez l'objet de message MIME original et envoyer:

new.attach( MIMEMessage(original) )

s = smtplib.SMTP()
s.sendmail("me@mysite.com", [new["To"]], new.as_string())
s.quit()

La structure résultante est la suivante:

multipart/mixed
    multipart/alternative
        text/plain
        text/html
    message/rfc822
        multipart/mixed
            text/html
            text/plain
            text/plain

Ou il est un peu plus simple en utilisant Django:

from django.core.mail import EmailMultiAlternatives
from email.mime.message import MIMEMessage

new = EmailMultiAlternatives("Re: "+original["Subject"],
                             "reply body text", 
                             "me@mysite.com", # from
                             [original["Reply-To"] or original["From"]], # to
                             headers = {'Reply-To': "me@mysite.com",
                                        "In-Reply-To": original["Message-ID"],
                                        "References": original["Message-ID"]})
new.attach_alternative("<html>reply body text</html>", "text/html")
new.attach( MIMEMessage(original) ) # attach original message
new.send()

Les extrémités de résultat (en GMail au moins) montrant le message d'origine « ---- ---- Transmis un message » qui est pas tout à fait ce que je cherchais, mais l'idée générale des œuvres et j'espère que cette réponse aide quelqu'un qui essaie de comprendre comment jouer avec des messages MIME.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top