web-dev-qa-db-ja.com

IMAP:メッセージをあるフォルダから別のフォルダに移動する方法

(他のメールパッケージを使用せずに、IMAPコマンドを使用します)

19
Mark Harrison

あなたがimap-speakにどれだけ精通しているかはわかりませんが、基本的にログイン後、ソースメールボックスを「選択」し、メッセージを「コピー」し、メッセージを「EXPUNGE」します(または古いメールボックスの場合は「削除」します)今は空です:-)。

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

送信するメッセージの例になります。 (:imapメッセージでは、各コマンドの前に一意のプレフィックスが必要です。したがって、前に「a b c」があります)

詳細については、 RFC 206 を参照してください。

18
Sec

これを行うには複数の方法があります。最良のものは、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 )がある場合、2番目に良いオプションはUID STOREUID 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 COPYUID STOREを使用するのが最善です。

24
Jan Kundrát

移動するメールの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です。

9
Avadhesh

メッセージを新しいフォルダにコピーしてから、古いフォルダから削除(EXPUNGE)すると思います。

RFC3501

[〜#〜]ヒント[〜#〜]意味することを実行するDELETEコマンドはありません。メッセージに削除済みのフラグを付けてから、EXPUNGEする必要があります。メールボックス。 RFCを見てください。 DELETEは単一のメールではなく、メールボックス全体を削除するため、注意してください。

3
jkramer