Удаление мусора из результатов imaplib.list()

#python #imap #imaplib

Вопрос:

Вот мой код:

 import imaplib

with imaplib.IMAP4_SSL("domain@host.com", port=993, timeout=20) as imap:
   imap.login('user', 'pwd')
   status, folders = imap.list()
 

Вот что я получаю от imap.list() звонка:

 status : 'OK'
folders :
00 = {bytes: 28} b'(\HasNoChildren) "/" Archive'
01 = {bytes: 29} b'(\HasNoChildren) "/" Calendar'
02 = {bytes: 28} b'(\HasNoChildren) "/" Clutter'
03 = {bytes: 27} b'(\HasChildren) "/" Contacts'
04 = {bytes: 41} b'(\HasChildren) "/" "Conversation History"'
05 = {bytes: 41} b'(\HasChildren \Trash) "/" "Deleted Items"'
06 = {bytes: 60} b'(\HasNoChildren) "/" "Deleted Items/Group - Contact Tracing"'
07 = {bytes: 35} b'(\HasNoChildren \Drafts) "/" Drafts'
08 = {bytes: 32} b'(\Marked \HasChildren) "/" INBOX'
09 = {bytes: 44} b'(\HasNoChildren) "/" "INBOX/Untitled Folder"'
 

Моя цель-получить только названия прикрепленных почтовых ящиков. Как я могу это сделать?

Комментарии:

1. попробуй github.com/ikvk/imap_tools

Ответ №1:

Согласно RFC 3501, ответ на ответ IMAP LIST содержит следующие поля:

  1. Атрибуты имени
  2. Разделитель иерархии
  3. Имя почтового ящика

Атрибуты имени содержатся в круглых скобках; оставшиеся два поля являются строками (которые могут быть заключены в кавычки). Функция shlex.split выполнит большую часть работы за вас, так как она понимает строки в кавычках.

Учитывая такой ответ, как:

 >>> folders[5]
b'(\HasChildren \Trash) "/" "Deleted Items"'
 

Разделив это с shlex.split доходностью:

 >>> shlex.split(folders[5].decode())
['(HasChildren', 'Trash)', '/', 'Deleted Items']
 

Мы используем этот .decode() метод здесь для преобразования байтовой строки в обычную строку (предполагая кодировку по умолчанию, которая может быть или не быть правильной).

Из вышесказанного вы можете видеть, что имя вашего почтового ящика всегда будет последним элементом возвращаемых значений shlex.split . Так что вы можете писать:

 import imaplib

with imaplib.IMAP4_SSL("domain@host.com", port=993, timeout=20) as imap:
   imap.login('user', 'pwd')
   status, folders = imap.list()

   for folder in folders:
       parsed = shlex.split(folder.decode())
       print(parsed[-1])
 

Который будет печатать:

 Archive
Calendar
Clutter
Contacts
Conversation History
Deleted Items
Deleted Items/Group - Contact Tracing
Drafts
INBOX
INBOX/Untitled Folder