2010-04-26 11 views
8

J'essaie de mettre en place un script qui transfère automatiquement certains e-mails correspondant à un critère spécifique vers un autre e-mail.Transférer un e-mail avec python smtplib

J'ai le téléchargement et l'analyse de messages en utilisant imaplib et le courrier électronique, mais je n'arrive pas à comprendre comment transférer un courriel entier à une autre adresse. Ai-je besoin de créer un nouveau message à partir de zéro, ou puis-je modifier l'ancien et le renvoyer?

Voici ce que j'ai jusqu'à présent (client est une connexion imaplib.IMAP4 et id est un 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'] = 'sou[email protected]' 
forward['To'] = '[email protected]' 

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

Je suis sûr qu'il ya je dois faire en ce qui concerne quelque chose un peu plus compliqué au contenu MIME du message. Sûrement, il y a un moyen simple de simplement transmettre le message entier?

# 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

Il y a trop de contexte manquant ici pour faire une quelconque détermination. En particulier, utilisez-vous le smtplib standard? Quelle version de Python. Où smtp est-il initialisé, est-ce que connect() ed? Avez-vous eu une bonne réponse HELO? – msw

+0

C'est le standard smtplib, python2.6.4. Le client smtplib fonctionne correctement - je peux envoyer des courriels texte simples en passant une chaîne comme dernier argument de smtp. Je veux juste trouver un moyen simple d'envoyer le contenu MIME entier d'un message téléchargé à une nouvelle adresse. – robbles

Répondre

16

Je pense que la partie que vous aviez mal était comment remplacer les en-têtes dans le message, et le fait que vous n'avez pas besoin de faire une copie du message, vous pouvez juste opérer directement dessus après l'avoir créé à partir du données brutes que vous avez récupérées sur le serveur IMAP.

Vous avez omis certains détails alors voici ma solution complète avec tous les détails énoncés. Notez que je mets la connexion SMTP en mode STARTTLS puisque j'en ai besoin et notez que j'ai séparé la phase IMAP et la phase SMTP l'une de l'autre. Peut-être que vous pensiez que modifier le message serait en quelque sorte le modifier sur le serveur IMAP? Si vous l'avez fait, cela devrait vous montrer clairement que cela n'arrive pas.

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() 

Espérons que cela aide même si cette réponse arrive assez tard.

0

Dans une application je télécharger des messages via POP3 (en utilisant poplib) et les transmettre en utilisant votre deuxième méthode ... C'est, j'alter/A partir du message d'origine et de l'envoyer, et il fonctionne.
Avez-vous essayé de piquer dans smtp.sendmail pour voir où ça s'arrête?