2010-02-02 5 views
13

Ich verwende derzeit imaplib, um E-Mail-Nachrichten von einem Server abzurufen und die Inhalte und Anhänge zu verarbeiten.Wie antworte ich auf eine E-Mail mit Python imaplib und füge die ursprüngliche Nachricht ein?

Ich möchte auf die Nachrichten mit einem Status/Fehlermeldung und Links zu den resultierenden generierten Inhalt auf meiner Website antworten, wenn sie verarbeitet werden können. Dies sollte die ursprüngliche Nachricht enthalten, aber sollte alle Anhänge (die groß sein werden) fallen lassen und sie vorzugsweise nur mit ihren Dateinamen/Größen ersetzen.

Da ich bereits die MIME-Nachrichtenteile durchgehe, gehe ich davon aus, dass ich einen neuen MIME-Nachrichtenbaum erstellen muss, der eine Kopie der ursprünglichen Nachricht enthält und die Anhangsknoten löscht/ersetzt.

Bevor ich diesen Pfad beginne, habe ich gehofft, dass jemand mir ein paar Tipps geben kann. Gibt es irgendeine Art von Bibliotheksfunktion, um dies zu tun? Jede Art von Standardverhalten, an dem ich mich halten sollte?

Ich weiß derzeit von/bin mit den imaplib, smtplib und email Module und aber möglicherweise etwas offensichtlich dort drin verpasst haben. Dies läuft auch in Django, also kann alles in django.core.email verwendet werden, wenn das es einfacher macht.

Antwort

14

Die ursprüngliche MIME-Baumstruktur der eingehenden Nachricht ist wie folgt (unter Verwendung von email.iterators._structure(msg)):

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

via GMail Ergebnisse in der folgenden Struktur Antwort auf:

multipart/alternative 
    text/plain 
    text/html 

D.h. Sie sind nicht so schlau wie ich dachte, sondern einfach die Anhänge verwerfen (gut) und Text- und HTML-Versionen zur Verfügung stellen, die den "zitierten Inhalt" explizit umstrukturieren.

Ich fange an zu denken, dass das alles ist, was ich auch tun sollte, antworten Sie einfach mit einer einfachen Nachricht, da nach dem Verwerfen der Anhänge es nicht viel Sinn macht, die ursprüngliche Nachricht zu behalten.

Noch, könnte auch meine ursprüngliche Frage beantworten, da ich sowieso jetzt herausgefunden habe, wie man es macht.

Zuerst ersetzen alle Anhänge in der ursprünglichen Nachricht mit text/plain Platzhalter:

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

Dann eine Antwortnachricht erstellen:

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

dann die ursprüngliche MIME-Nachricht Objekt anhängen und senden:

new.attach(MIMEMessage(original)) 

s = smtplib.SMTP() 
s.sendmail("[email protected]", [new["To"]], new.as_string()) 
s.quit() 

Die resultierende Struktur ist:

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

Oder es ist etwas einfacher Verwendung 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() 

Die Folge Enden (in GMail mindestens) die ursprüngliche Nachricht als zeigt "---- ---- Weitergeleitete-Nachricht", die ‚isn Ich bin ganz klar, was ich suchte, aber die allgemeine Idee funktioniert und ich hoffe, diese Antwort hilft jemandem, herauszufinden, wie man mit MIME-Nachrichten herumhantiert.

+1

"Ich hoffe, diese Antwort hilft jemandem, herauszufinden, wie man mit MIME-Nachrichten herumhantiert." ----- Das hat es wirklich getan. Danke Tom! – aniketd

Verwandte Themen