Поиск Imaplib возвращает неправильные UID после перемещения некоторых писем в корзину - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь получить все UID папки INBOX в учетной записи gmail с помощью imaplib (эта учетная запись является новой для тестирования). Сначала он работал нормально (т.е. когда я только отправлял письма на учетную запись), но после перемещения некоторых писем в tra sh мой код теперь возвращает неверное количество UID (8, с 7 электронными письмами в папке входящих) , хотя также отсутствует UID.

con = imaplib.IMAP4_SSL(imap_server, imap_port)
con.login(user, password)
con.select("INBOX")
result, numbers = con.uid('search', None, 'ALL')
uids = numbers[0].split()

В моем конкретном случае c печать "uids" дает следующий список

[b'1', b'3', b'4', b'7', b'8', b'9', b'10', b'11']

Проверка почты вручную путем написания списка [b'1', b'2'..., b'11'] и извлекая темы электронной почты, я обнаруживаю, что существуют уникальные письма для следующих UID:

[b'1', b'2' OR b'3', b'4', b'5', b'6', b'7', ONE OF b'8' to b'11']

b'1' и b'2' возвращает ту же почту, b'6' отсутствует и b'8' - b'11 возвращает ту же почту

Обыскивая здесь, прежде чем спрашивать, я наткнулся на вопрос: Загрузка вложений из gmail . Ответ содержал следующий фрагмент кода, который выбирает идентификатор для всех писем в папке:

resp, items = m.search(None, "ALL") # you could filter using the IMAP rules here (check http://www.example-code.com/csharp/imap-search-critera.asp)
items = items[0].split() # getting the mails id

Как и в моем коде, только без использования метода uid. Однако, в моем случае, это делает список:

[b'1', b'2', b'3', b'4', b'5', b'6', b'7', b'8']

Так что тоже не правильно. Другой ответ, который я нашел Imaplib со смещением GMail uids пишет:

Кажется, что M.uid просто указывает, что возвращаемое значение будет UID, поэтому все еще необходимо указать, что отправленные параметры будут идентификаторами UID, а не идентификаторами сообщений. Это исправляет это:

rv, data = M.uid("search", None, 'UID', '29540:*')

И в комментарии:

rv, data = M.uid("search", None, '(UID 29540:*)')

Но оба возвращают ошибку для меня: UID command error: BAD [b'Could not parse command']

Что я делать неправильно, и / или есть ли лучший способ?

...