2010-02-02 12 views
13

Attualmente sto utilizzando imaplib per recuperare i messaggi di posta elettronica da un server ed elaborare i contenuti e gli allegati.Come posso rispondere ad una e-mail usando l'imaplib di Python e includere il messaggio originale?

Mi piacerebbe rispondere ai messaggi con un messaggio di stato/errore e collegamenti al contenuto generato risultante sul mio sito se possono essere elaborati. Questo dovrebbe includere il messaggio originale, ma dovrebbe eliminare tutti gli allegati (che saranno di grandi dimensioni) e preferibilmente sostituirli con i loro nomi/dimensioni dei file.

Dato che sto già percorrendo le parti del messaggio MIME, suppongo che ciò che devo fare sia creare un nuovo albero dei messaggi MIME contenente una copia del messaggio originale ed eliminare/sostituire i nodi allegati.

Prima di iniziare questo percorso, speravo che qualcuno potesse darmi qualche consiglio. C'è qualche tipo di funzione di libreria per fare questo? Dovrei attenermi a qualsiasi tipo di comportamento standard?

Attualmente so di/sto usando i moduli imaplib, smtplib e email e forse ho perso qualcosa di ovvio. Anche questo è in esecuzione in Django, quindi è possibile utilizzare qualsiasi cosa in django.core.email se ciò lo rende più facile.

risposta

14

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.

+1

"Spero che questa risposta aiuti qualcuno a cercare di capire come giocare con i messaggi MIME." ----- Lo ha fatto. Grazie Tom! – aniketd

Problemi correlati