2010-04-26 17 views
8

Belirli bir ölçütle eşleşen belirli e-postaları otomatik olarak başka bir e-postaya yönlendiren bir komut dosyası oluşturmaya çalışıyorum.Bir e-postayı python ile iletme smtplib

imaplib ve e-postalarını kullanarak mesajların indirilmesini ve ayrıştırılmasını sağladım, ancak tüm bir e-postayı başka bir adrese nasıl yönlendireceğimi anlayamıyorum. Sıfırdan yeni bir mesaj oluşturmam gerekiyor mu yoksa eski olanı değiştirip tekrar gönderebilir miyim? İşte

Ben bugüne kadar ne var (istemci bir imaplib.IMAP4 bağlantısıdır ve kimliği bir mesaj kimliğidir): Ben bakımından yapıyor olması gerekir biraz daha karmaşık bir şey var eminim

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

mesajın MIME içeriğine. Elbette mesajın tamamını iletmenin basit bir yolu var mı? Ben POP3 yoluyla mesajlarını indirmek

# 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

Burada herhangi bir belirleme yapmak için çok fazla eksik içerik var. Özellikle, standart smtplib kullanıyor musunuz? Python'un hangi versiyonu. Smtp nerede başlatılır, connect() ed? Uygun bir HELO yanıtı aldınız mı? – msw

+0

Standart smtplib, python2.6.4. smtplib istemcisi çalışıyor - smtp'nin son argümanı olarak bir dizeyi ileterek basit metin e-postaları gönderebilirim. Sadece indirilmiş bir mesajın tüm MIME içeriğini yeni bir adrese göndermek için basit bir yol bulmak istiyorum. – robbles

cevap

16

Yanlış olduğunu düşündüğünüz bölüm, iletideki başlıkların nasıl değiştirileceğiydi ve iletinin bir kopyasını almanız gerekmediği gerçeği, sizden bunu oluşturduktan sonra doğrudan üzerinde çalışabilirsiniz. IMAP sunucusundan getirdiğiniz ham veriler.

Bazı ayrıntılar atladınız, işte size tüm ayrıntılarla birlikte yazıldığım eksiksiz çözümüm. İhtiyacım olana kadar SMTP bağlantısını STARTTLS moduna geçirdiğimi ve IMAP aşamasını ve SMTP aşamasını birbirinden ayırdığımı unutmayın. Belki de mesajın değiştirilmesinin IMAP sunucusunda bir şekilde değiştireceğini düşündünüz mü? Eğer öyle olsaydı, bu, bunun olmayacağını açıkça göstermeli.

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

Bu yanıt çok geç olsa bile, bu yardımcı olur umarız.

0

uygulama bir de budur ... (poplib kullanarak) ve ikinci yöntemi kullanarak bunları iletmek, ben orijinal Mesaj andan itibaren To/değiştirebilir ve göndermek, ve çalışıyor.
Nerede durduğunu görmek için smtp.sendmail içinde poking yapmayı denediniz mi?