22

(使用 IMAP 命令,不借助任何其他邮件包)

4

4 回答 4

29

有多种方法可以做到这一点。最好的是2013 年初在RFC 6851UID MOVE中定义的命令:

C: a UID MOVE 42:69 foo
S: * OK [COPYUID 432432 42:69 1202:1229]
S: * 22 EXPUNGE
S: (more expunges)
S: a OK Done

该扩展的存在由MOVE能力指示。

如果它不可用,但UIDPLUS( RFC 4315 ) 可用,则第二好的选择是使用UID STORE,UID COPY和的组合UID EXPUNGE

C: a01 UID COPY 42:69 foo
S: a01 OK [COPYUID 432432 42:69 1202:1229] Copied
C: a02 UID STORE 42:69 +FLAGS.SILENT (\Deleted)
S: a02 OK Stored
C: a03 UID EXPUNGE 42:69
S: * 10 EXPUNGE
S: * 10 EXPUNGE
S: * 10 EXPUNGE
S: a03 Expunged

如果UIDPLUS缺少 ,则您无能为力 - 该EXPUNGE命令将永久删除所有标记为删除的消息,包括您未触及的消息。最好的办法是在这种情况下只使用UID COPYand UID STORE

于 2013-04-04T15:57:57.243 回答
19

我不确定您对 imap-speak 的精通程度,但基本上在登录后,“选择”源邮箱,“复制”邮件,然后“删除”邮件(或“删除”旧邮箱,如果它现在是空的:-)。

a login a s
b select source
c copy 1 othermbox
d store 1 +flags (\Deleted)
e expunge

将是要发送的消息的示例。(注意:imap 消息在每个命令之前都需要一个唯一的前缀,因此前面的“ab c”)

有关详细信息,请参阅RFC 2060

于 2008-09-23T16:59:10.580 回答
16

如果您有要移动的电子邮件的 uid。

import imaplib

obj = imaplib.IMAP4_SSL('imap.gmail.com', 993)
obj.login('username', 'password')
obj.select(src_folder_name)
apply_lbl_msg = obj.uid('COPY', msg_uid, desti_folder_name)
if apply_lbl_msg[0] == 'OK':
    mov, data = obj.uid('STORE', msg_uid , '+FLAGS', '(\Deleted)')
    obj.expunge()

其中msg_uid是邮件的 uid。

于 2010-07-01T09:28:21.453 回答
4

我猜您将消息复制到新文件夹,然后在旧文件夹中删除(删除)它。

RFC3501

提示没有 DELETE 命令可以执行您的意思,您必须将邮件标记为已删除,然后删除邮箱。看看 RFC。小心 DELETE,因为它会删除整个邮箱,而不是单个邮件。

于 2008-09-23T16:58:03.577 回答