#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
содержит следующие поля:
- Атрибуты имени
- Разделитель иерархии
- Имя почтового ящика
Атрибуты имени содержатся в круглых скобках; оставшиеся два поля являются строками (которые могут быть заключены в кавычки). Функция 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