2008-09-23 54 views
13

(使用IMAP命令,不與任何其他郵件包的援助)IMAP:如何從一個文件夾移動郵件到另一個

+0

儘管當前規範中沒有IMAP「移動」命令,但有一個擴展方案:http://tools.ietf.org/html/draft-gulbrandsen-imap-move-01(Arnt Gulbrandsen, 2012年3月)。可悲的是,由於IETF的草案到期政策頗爲積極,該鏈接可能會在您點擊該鏈接時死掉。 – tripleee 2013-03-25 09:03:49

+1

RFC6851 MOVE Extension:http://tools.ietf.org/html/rfc6851。當然,如果你的服務器不支持它,COPY,'STORE \ DELETED flag'和EXPUNGE是唯一的選擇(如下面的答案) – 2013-03-28 15:36:14

+1

@triplee:tools.ietf.org鏈接不會過期。草稿到期,但tools.ietf.org繼續給出合理的答案。 – arnt 2014-02-12 14:59:12

回答

15

我不確定您是否熟悉imap-speak,但基本上在登錄後,「選擇」源郵箱,「複製」郵件和「探測」郵件(或「刪除」舊郵箱如果它現在是空的:-)。

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

將是發送消息的示例。 (注意:imap消息在每個命令之前需要uniqe前綴,因此前面的「a b c」)

有關詳細信息,請參閱RFC 2060

3

我猜你將郵件複製到新文件夾,然後刪除(EXPUNGE )它在舊的。

RFC351

提示有沒有DELETE命令,做你的意思,你必須標記爲刪除,然後EXPUNGE郵箱中的郵件。看看RFC。請小心使用DELETE,因爲它會刪除整個郵箱,而不是單個郵件。

8

如果你有要移動的電子郵件的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。

20

有多種方法可以做到這一點。最好一個是從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

相關問題