IMAP:как переместить сообщение из одной папки в другую

StackOverflow https://stackoverflow.com/questions/122267

  •  02-07-2019
  •  | 
  •  

Вопрос

(используя команды IMAP, а не какой-либо другой почтовый пакет)

Это было полезно?

Решение

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

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

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

Видеть РФК 2060 для получения подробной информации.

Другие советы

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

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

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 это идентификатор почты.

Я предполагаю, что вы КОПИРУЕТЕ сообщение в новую папку, а затем удаляете (УДАЛЕНИЕ) его в старой.

RFC3501

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top