2010-04-26 114 views
8

我想放在一起的腳本,自動轉發符合特定條件的某些電子郵件到另一封電子郵件。轉發電子郵件與蟒蛇smtplib

我已經使用imaplib和電子郵件工作下載和解析郵件,但我無法弄清楚如何將整個電子郵件轉發到另一個地址。我是否需要從頭建立一條新消息,或者我可以以某種方式修改舊消息並重新發送消息?

這裏是我到目前爲止(客戶端是一個imaplib.IMAP4連接,ID是消息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()) 

我敢肯定有一些稍微複雜一些,我需要就做到郵件的MIME內容。當然,只是轉發整個消息的一些簡單方法?

# 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

這裏有太多缺失的上下文來做出任何決定。特別是,你使用標準的smtplib?什麼版本的Python。 smtp初始化在哪裏,它是連接()編輯?你有沒有得到適當的HELO迴應? – msw 2010-04-27 03:11:57

+0

這是標準的smtplib,python2.6.4。 smtplib客戶端工作正常 - 我可以通過傳遞一個字符串作爲smtp的最後一個參數來發送簡單的文本電子郵件。 我只想找到一個簡單的方法將下載的消息的整個MIME內容發送到新地址。 – robbles 2010-04-28 05:42:45

回答

16

我認爲你錯了的部分是如何替換消息中的標題,以及你不需要複製消息的事實,你可以直接在您從IMAP服務器獲取的原始數據。

您確實省略了一些細節,因此這裏是我的完整解決方案,其中詳細說明了所有細節。請注意,我將SMTP連接設置爲STARTTLS模式,因爲我需要這一點,並且請注意我已經將IMAP階段和SMTP階段彼此分開。也許你認爲改變消息會以某種方式在IMAP服務器上改變它?如果你這樣做,這應該清楚地表明,這不會發生。

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

希望這可以幫助即使這個答案來得相當晚。

0

在一個應用程序,我通過POP3下載郵件(使用poplib模塊),並使用你的第二個方法轉發他們......也就是說,我改成/從原始郵件併發送,和它的作品。
你有沒有試過在smtp.sendmail中查看它停在哪裏?