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)
Rispondere tramite Gmail risultati nella seguente struttura:
multipart/alternative
text/plain
text/html
cioè non sono intelligenti come pensavo, semplicemente scartando gli allegati (buoni) e fornendo versioni di testo e HTML che ristrutturano esplicitamente il "contenuto citato".
Sto iniziando a pensare che è tutto ciò che dovrei fare anch'io, basta rispondere con un messaggio semplice, poiché dopo aver scartato gli allegati non è molto importante mantenere il messaggio originale.
Ancora, potrebbe anche rispondere alla mia domanda originale da quando ho capito come fare comunque.
In primo luogo, sostituire tutti gli allegati del messaggio originale con testo/segnaposto plain:
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"] = "[email protected]"
quindi collegare l'oggetto messaggio MIME originale e inviare:
new.attach(MIMEMessage(original))
s = smtplib.SMTP()
s.sendmail("[email protected]", [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",
"[email protected]", # from
[original["Reply-To"] or original["From"]], # to
headers = {'Reply-To': "[email protected]",
"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()
Le estremità dei risultati (in GMail almeno) che mostra il messaggio originale come "messaggio inoltrato ---- ----", che isn' È proprio quello che cercavo, ma l'idea generale funziona e spero che questa risposta aiuti qualcuno a cercare di capire come giocare con i messaggi MIME.
"Spero che questa risposta aiuti qualcuno a cercare di capire come giocare con i messaggi MIME." ----- Lo ha fatto. Grazie Tom! – aniketd