Пользовательское помечение сообщений в IMAP с помощью python

#python #imap

#python #imap

Вопрос:

Есть ли способ помечать сообщения в папке IMAP с помощью Python специальным тегом? например, Toms mail, john’s weeding и т.д. И т.п.?

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

1. IMAP RFC указывает, что клиенты могут устанавливать свои собственные флаги, но оставляет на усмотрение серверов, поддерживают они произвольные флаги или нет.

2. Взгляните на imapclient.freshfoo.com . Я не знаю, делает ли это то, что вам нужно, поскольку я не совсем уверен, что вы хотите сделать. Это могло бы принести некоторую пользу.

Ответ №1:

Сервер Cyrus IMAP поддерживает пользовательские флаги сообщений (они же теги, метки, ключевые слова), и вы можете использовать почтовый клиент Alpine для экспериментов с метками. В Alpine выберите (S)etup -> (C)onfig , прокрутите вниз до keywords раздела и введите список желаемых имен флагов.

Для установки флагов сообщений из Python вы можете использовать стандартный модуль imaplib. Ниже приведен пример установки флагов для сообщения:

 import imaplib
im = imaplib.IMAP4(hostname)
im.login(user, password)
im.select('INBOX')

# you can use im.search() to obtain message ids
msg_ids = '1, 4, 7'
labels = ['foo', 'bar', 'baz']

# add the flags to the message
im.store(msg_ids, ' FLAGS', '(%s)' % ' '.join(labels))

# fetch and print to verify the flags
print im.fetch(ids, '(FLAGS)')

im.close()
im.logout()
  

Следует иметь в виду, что флаги, отправляемые на сервер, не содержат пробелов. При отправке FLAGS (foo bar) на сервер будут установлены два флага foo и bar . Клиенты, подобные Alpine, позволят вам вводить флаги с пробелами в них, но отправят на сервер только последнюю часть, не содержащую пробелов — он обрабатывает это как уникальный идентификатор. Если вы укажете флаг, abc 123 он будет установлен 123 для сообщения и отображаться abc в представлении сообщений.

Ответ №2:

Вы можете использовать пакет imap_tools: https://pypi.org/project/imap-tools

 from imap_tools import MailBox, Q
with MailBox('imap.mail.com').login('test@mail.com', 'pwd', initial_folder='INBOX') as mailbox:
    # FLAG unseen messages in current folder as Answered and Flagged, *in bulk.
    flags = (imap_tools.StandardMessageFlags.ANSWERED, imap_tools.StandardMessageFlags.FLAGGED)
    mailbox.flag(mailbox.fetch('(UNSEEN)'), flags, True)