IMAP: как переместить сообщение из одной папки в другую - PullRequest
17 голосов
/ 23 сентября 2008

(с помощью команд IMAP, а не с помощью любого другого почтового пакета)

Ответы [ 4 ]

23 голосов
/ 04 апреля 2013

Есть несколько способов сделать это. Лучшей является команда 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.

16 голосов
/ 23 сентября 2008

Я не уверен, насколько хорошо вы разбираетесь в языке imap, но в основном после входа в систему «ВЫБИРАЙ» исходный почтовый ящик, «КОПИРУЙ» сообщения и «УДАЛЯЙТЕ» сообщения (или «УДАЛЯЙТЕ» старые почтовый ящик, если он сейчас пуст: -).

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

будет примером сообщений для отправки. ( Примечание : сообщения imap перед каждой командой должны вводить уникальный префикс, поэтому перед ними стоит "a b c")

Подробнее см. RFC 2060 .

9 голосов
/ 01 июля 2010

Если у вас есть идентификатор электронной почты, который будет перемещен.

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 голосов
/ 23 сентября 2008

Я полагаю, вы скопировали сообщение в новую папку, а затем удалили (УДАЛИТЬ) его в старой.

RFC3501

СОВЕТ Нет команды УДАЛИТЬ, которая делает то, что вы имеете в виду, вы должны пометить сообщение как удаленное, а затем УДАЛИТЬ почтовый ящик. Посмотрите на RFC. Будьте осторожны с DELETE, так как он удаляет целые почтовые ящики, а не отдельные письма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...