IMAP: как перемещать сообщение из одной папки в другую
(используя команды IMAP, а не с помощью любого другого почтового пакета)
Ответы
Ответ 1
Я не уверен, насколько вы хорошо разбираетесь в imap-talk, но в основном после входа в систему, "SELECT" исходного почтового ящика, "COPY" сообщений и "EXPUNGE" сообщений (или "УДАЛИТЬ" старый почтовый ящик, если он пуст: -).
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.
Ответ 2
Существует несколько способов сделать это. Лучшей из них является команда UID MOVE
, определенная в RFC 6851 с начала 2013 года:
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 COPY
и UID STORE
в этом случае.
Ответ 3
Если у вас есть 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 почты.
Ответ 4
Я думаю, вы COPY сообщение в новую папку, а затем удалить (EXPUNGE) в старой.
RFC3501
СОВЕТ. Отсутствует команда DELETE, которая делает то, что вы имеете в виду, вы должны пометить сообщение как удаленное, а затем EXPUNGE почтового ящика. Взгляните на RFC. Будьте осторожны с DELETE, поскольку он удаляет целые почтовые ящики, а не отдельные письма.