Come faccio a rispondere a una e-mail utilizzando l'imaplib Python e includere il messaggio originale?

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

Domanda

Attualmente sto usando imaplib Per recuperare messaggi e-mail da un server ed elaborare i contenuti e allegati.

Mi piacerebbe rispondere ai messaggi con un messaggio di stato / di errore e link per il contenuto generato risultante sul mio sito se possono essere elaborati. Ciò dovrebbe includere il messaggio originale, ma dovrebbe cadere tutti gli allegati (che sarà di grandi dimensioni) e preferibilmente sostituirli con solo i loro nomi di file / dimensioni.

Dal momento che sto già camminando per le parti del messaggio MIME, sto assumendo quello che devo fare è costruire un nuovo albero di messaggio MIME contenente una copia del messaggio originale e cancellare / sostituire i nodi attacco.

Prima di iniziare questa strada, speravo che qualcuno mi può dare alcuni suggerimenti. C'è qualche tipo di funzione di libreria per fare questo? Qualsiasi tipo di comportamento standard dovrei attaccare ad?

Attualmente conosco / sto usando la imaplib, moduli smtplib e email e, ma forse ho perso qualcosa evidente in là. Questo è in esecuzione in Django troppo, quindi è possibile utilizzare qualsiasi cosa in django.core.email se questo rende più facile.

È stato utile?

Soluzione

La struttura originale albero MIME del messaggio in arrivo è (usando email.iterators._structure(msg)) come segue:

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

Come rispondere tramite i risultati di GMail nella seguente struttura:

multipart/alternative
    text/plain
    text/html

vale a dire. non vengono intelligente come pensavo, solo scartando gli allegati (buoni) e fornendo versioni di testo e HTML che esplicitamente ristrutturare il "contenuto citato".

Sto cominciando a pensare che è tutto quello che dovrei fare troppo, basta rispondere con un semplice messaggio come dopo aver scartato gli allegati non c'è più molto senso mantenere il messaggio originale.

Ancora, potrebbe anche rispondere alla mia domanda iniziale dal momento che ho capito come ora comunque.

In primo luogo, sostituire tutti gli allegati del messaggio originale con testo / plain segnaposto:

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"]

Quindi creare un messaggio di risposta:

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"

Poi collegare l'oggetto messaggio MIME originale e inviare:

new.attach( MIMEMessage(original) )

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

La struttura risultante è:

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

O è un po 'più semplice utilizzando 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()

Il risultato estremità (in GMail almeno) che mostra il messaggio originale come "messaggio inoltrato ---- ----", che non è proprio quello che cercavo, ma l'idea generale opere e spero che questa risposta aiuta qualcuno che cerca di capire come a giocherellare con i messaggi MIME.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top