2010-04-26 5 views
8

Ich versuche ein Skript zu erstellen, das bestimmte E-Mails, die bestimmte Kriterien erfüllen, automatisch an eine andere E-Mail weiterleitet.Eine E-Mail mit python smtplib weiterleiten

Ich habe das Herunterladen und Parsing von Nachrichten mit Imaplib und E-Mail funktioniert, aber ich kann nicht herausfinden, wie man eine ganze E-Mail an eine andere Adresse weiterleitet. Muss ich eine neue Nachricht von Grund auf neu erstellen, oder kann ich die alte irgendwie ändern und erneut senden?

Hier ist, was ich bisher (Client ist eine imaplib.IMAP4 Verbindung, und id ist eine Message-ID):

import smtplib, imaplib 

smtp = smtplib.SMTP(host, smtp_port) 
smtp.login(user, passw) 

client = imaplib.IMAP4(host) 
client.login(user, passw) 
client.select('INBOX') 

status, data = client.fetch(id, '(RFC822)') 
email_body = data[0][1] 
mail = email.message_from_string(email_body) 

# ...Process message... 

# This doesn't work 
forward = email.message.Message() 
forward.set_payload(mail.get_payload()) 
forward['From'] = '[email protected]' 
forward['To'] = '[email protected]' 

smtp.sendmail(user, ['[email protected]'], forward.as_string()) 

Ich bin sicher, es ist etwas, etwas komplizierter ich im Hinblick auf die tun müssen auf den MIME-Inhalt der Nachricht. Sicherlich gibt es eine einfache Möglichkeit, nur die gesamte Nachricht weiterzuleiten?

# This doesn't work either, it just freezes...? 
mail['From'] = '[email protected]' 
mail['To'] = '[email protected]' 
smtp.sendmail(user, ['[email protected]'], mail.as_string()) 
+0

Hier fehlt zu viel Kontext, um eine Entscheidung zu treffen. Insbesondere, verwenden Sie die Standard-smtplib? Welche Version von Python? Wo ist smtp initialisiert, ist es connect() ed? Hast du eine richtige HELO-Antwort erhalten? – msw

+0

Es ist die Standard-smtplib, python2.6.4. Der smtplib-Client funktioniert gut - ich kann einfache Text-E-Mails senden, indem Sie eine Zeichenfolge als letztes Argument von smtp übergeben. Ich möchte nur eine einfache Möglichkeit finden, den gesamten MIME-Inhalt einer heruntergeladenen Nachricht an eine neue Adresse zu senden. – robbles

Antwort

16

Ich denke, der Teil, den Sie falsch hatten, war, wie die Header in der Nachricht zu ersetzen, und die Tatsache, dass Sie keine Kopie der Nachricht erstellen müssen, können Sie direkt darauf arbeiten, nachdem Sie es aus dem erstellen Rohdaten, die Sie vom IMAP-Server abgerufen haben.

Sie haben einige Details weggelassen, also hier ist meine vollständige Lösung mit allen Details dargelegt. Beachten Sie, dass ich die SMTP-Verbindung in den STARTTLS-Modus versetzt habe, da ich dies benötige und dass ich die IMAP-Phase und die SMTP-Phase voneinander getrennt habe. Vielleicht dachtest du, dass das Ändern der Nachricht es irgendwie auf dem IMAP-Server ändern würde? Wenn Sie dies tun, sollte dies Ihnen deutlich zeigen, dass das nicht passiert.

import smtplib, imaplib, email 

imap_host = "mail.example.com" 
smtp_host = "mail.example.com" 
smtp_port = 587 
user = "xyz" 
passwd = "xyz" 
msgid = 7 
from_addr = "[email protected]" 
to_addr = "[email protected]" 

# open IMAP connection and fetch message with id msgid 
# store message data in email_data 
client = imaplib.IMAP4(imap_host) 
client.login(user, passwd) 
client.select('INBOX') 
status, data = client.fetch(msgid, "(RFC822)") 
email_data = data[0][1] 
client.close() 
client.logout() 

# create a Message instance from the email data 
message = email.message_from_string(email_data) 

# replace headers (could do other processing here) 
message.replace_header("From", from_addr) 
message.replace_header("To", to_addr) 

# open authenticated SMTP connection and send message with 
# specified envelope from and to addresses 
smtp = smtplib.SMTP(smtp_host, smtp_port) 
smtp.starttls() 
smtp.login(user, passwd) 
smtp.sendmail(from_addr, to_addr, message.as_string()) 
smtp.quit() 

Hoffe das hilft auch wenn diese Antwort ziemlich spät kommt.

0

In einer Anwendung, die ich Nachrichten über POP3 (mit poplib) herunterladen und leiten sie Ihre zweite Methode ... Das heißt, ich ändern es zu/von auf der ursprünglichen Nachricht und senden, und es funktioniert.
Haben Sie versucht, in smtp.sendmail zu stochern, um zu sehen, wo es aufhört?