2010-04-26 140 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中查看它停在哪里?

相关问题