Come faccio a rispondere a una e-mail utilizzando l'imaplib Python e includere il messaggio originale?
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.
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.