如何使用Python imaplib从一个IMAP服务器复制邮件到另一个IMAP服务器?
我想把一条消息从一个IMAP服务器复制到另一个IMAP服务器。我不想修改任何消息的数据。我正在使用python的imaplib库。
这是我尝试的代码:
typ, data = connection1.uid('FETCH', uid, 'RFC822')
connection2.uid('APPEND', None, data[0][1])
但是这段代码抛出了一个异常:
imaplib.error: UID命令错误: BAD ['"Delivered-To: niels@domain.com']
所以我觉得参数(data[0][1])的格式不正确。
data[0][1]的内容看起来是这样的:
Delivered-To: niels@domain.com\r\nReceived: by 10.216.207.222 with SMTP id n27cs38120weo;\r\nFri, 12 Nov 2010 09:43:47 -0800 (PST)\r\nReceived: by 10.200.19.19 with SMTP id y19mr234526eba.52.12894526694;\r\nFri, 12 Nov 2010 09:43:46 -0800 (PST)\r\nReturn-Path: somename@domain.com\r\nReceived: from dub0-omc1-s20.dub03.hotmail.com (dub0-omc1-s20.dub03.hotmail.com [157.55.0.220])\r\n ......
我该怎么解决这个问题呢?
更新:在Wodin和Avadhesh的帮助下,我现在可以添加消息了,但我该如何获取刚刚添加的消息的UID呢?
3 个回答
你试过这个吗:
connection2.append(mailbox, flags, date_time, message)
Append message to named mailbox.
RFC3501文档里说明了UID命令的语法,具体如下:
uid = "UID" SP (copy / fetch / search / store)
也就是说,似乎没有“UID APPEND”这个命令。
你可以试试下面的代码:
typ, data = connection1.uid('FETCH', uid, 'RFC822')
import email
msg_str = email.message_from_string(data[0][1])
msg_create = connection2.append(str(dest_fold_code) , flags, '', str(msg_str))
这里的 flags 可以是 '(\Seen)',表示这封邮件已经被查看过;如果邮件没有被查看过,flags 就是空的 ''。
解决了!
首先,用下面的代码复制消息:
typ, data = connection1.uid('FETCH', uid, 'RFC822')
connection2.append('Inbox', '', '', data[0][1])
然后,从复制的消息中提取出唯一的消息ID,方法如下:
from email.parser import Parser
parser = Parser()
msg = parser.parsestr(data[0][1])
接着,使用这个消息ID在目标邮箱中找到新的消息,方法如下:
typ, uid = connection2.uid('SEARCH', None, 'Header', 'Message-Id', msg['message-ID'])