IMAP:如何将邮件从一个文件夹移动到另一个文件夹

24

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


尽管当前规范中没有IMAP“移动”命令,但有一个扩展提案:http://tools.ietf.org/html/draft-gulbrandsen-imap-move-01(Arnt Gulbrandsen,2012年3月)。不幸的是,由于IETF的相当激进的草案到期政策,该链接在您想单击它时可能已经失效。 - tripleee
1
RFC6851 MOVE扩展:http://tools.ietf.org/html/rfc6851。当然,如果您的服务器不支持它,则COPY,“STORE \ DELETED flag”和EXPUNGE是唯一的选项(如下面的答案)。 - Pawel Lesnikowski
1
@triplee:tools.ietf.org的链接不会过期。草案可能会过期,但是tools.ietf.org仍然会给出一个合理的答案。 - arnt
@arnt 嘿,谢谢你的提示...还有规格! - tripleee
4个回答

31

有多种方法可以实现这一点。最好的方法是早在2013年初就在RFC 6851中定义的UID 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,则表示存在此扩展。

如果不可用,但存在UIDPLUSRFC 4315),则第二好的选择是使用UID STOREUID COPYUID 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 COPYUID STORE命令。

我的服务器不支持 UID MOVE :/ - Thomas Ahle
你的第二个最好的机会就在第二个代码清单中。 - Jan Kundrát

19

我不确定您在imap方面的熟练程度,但基本上登录后,“SELECT”源邮箱,“COPY”邮件,并“EXPUNGE”邮件(或如果现在为空,则“DELETE”旧邮箱: -)。

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

以下是要发送的消息示例。 (注意:imap消息在每个命令之前需要一个唯一的前缀,因此在前面加上"a b c")

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


4
请注意,expunge 将删除所有标记为 \Deleted 的邮件,这可能不是您想要的结果。 - Joachim Breitner

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。


3
使用IMAP命令,不借助任何其他邮件软件的帮助。 - dkarp
4
这是我在使用Python进行此任务时找到的最好的链接。 - Thomas Ahle
@Avadhesh,你能帮我解决这个问题吗?https://stackoverflow.com/questions/67383513/imap-copy-command-not-working-on-inbox-python - Azhar Syed
https://stackoverflow.com/questions/67383513/imap-copy-command-not-working-on-inbox-python - Azhar Syed

4
我猜你是将消息复制到新文件夹,然后在旧文件夹中删除(EXPUNGE)它。
提示:没有DELETE命令可以做你想要的事情,你必须将消息标记为已删除,然后EXPUNGE邮箱。请查看RFC。要小心使用DELETE,因为它会删除整个邮箱,而不是单个邮件。
参考链接:RFC3501

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接