#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)