如何使用Python imaplib将消息从一个imap服务器复制到另一个imap服务器?

时间:2010-11-14 19:16:50

标签: python imap imaplib rfc822

我想将邮件从一个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])格式不正确。

数据[0] [1]的内容如下所示:

  

Delivered-To:niels@domain.com \ r \ n接收:10.216.207.222,SMTP ID为n27cs38120weo; \ r \ nFri,2010年11月12日09:43:47 -0800(太平洋标准时间)\ r \ n接收:通过10.200.19.19,SMTP标识为y19mr234526eba.52.12894526694; \ r \ nFri,2010年11月12日09:43:46 -0800(太平洋标准时间)\ r \ n返回路径:somename@domain.com \ r \ n \ n接收:来自dub0-omc1- s20.dub03.hotmail.com(dub0-omc1-s20.dub03.hotmail.com [157.55.0.220])\ r \ n ......

我该如何解决这个问题?

更新:在Wodin和Avadhesh的帮助下,我现在可以附加消息,但如何获取刚刚附加的消息的UID?

3 个答案:

答案 0 :(得分:2)

您可以尝试以下代码:

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

如果看到电子邮件,则标志为'(\ Seen)';如果是未发送电子邮件,则为''。

答案 1 :(得分:1)

你试过了吗?

connection2.append(mailbox, flags, date_time, message)
    Append message to named mailbox.

RFC3501显示了UID命令的语法,如下所示:

uid             = "UID" SP (copy / fetch / search / store)

即。似乎没有“UID APPEND”命令。

答案 2 :(得分:0)

解决了!

首先使用

复制邮件
typ, data = connection1.uid('FETCH', uid, 'RFC822')
connection2.append('Inbox', '', '', data[0][1])

然后从复制的消息中获取唯一的message-id,如下所示

from email.parser import Parser
parser = Parser()
msg = parser.parsestr(data[0][1])

然后使用message-id在目标邮箱中查找新邮件,如下所示

typ, uid = connection2.uid('SEARCH', None, 'Header', 'Message-Id', msg['message-ID'])