Найти новые сообщения, добавленные в почтовый ящик imap с момента последней проверки с помощью python imaplib2?
-
20-09-2019 - |
Вопрос
Я пытаюсь написать программу, которая отслеживает почтовый ящик IMAP и автоматически копирует каждое новое входящее сообщение в папку "Архив".Я использую imaplib2, который реализует команду IDLE.Вот моя базовая программа:
M = imaplib2.IMAP4("mail.me.com")
M.login(username,password)
lst = M.list()
assert lst[0]=='OK'
for mbx in lst[1]:
print "Mailboxes:",mbx
def process(m):
print "m=",m
res = M.recent()
print res
M.select('INBOX')
M.examine(mailbox='INBOX',callback=process)
while True:
print "Calling idle..."
M.idle()
print "back from idle"
M.close()
M.logout()
Он правильно печатает почтовые ящики и запускает process(), когда с почтовым ящиком происходит первое изменение.Но ответ от recent () не имеет для меня смысла, и после первого сообщения я никогда не получаю никаких других уведомлений.
Кто-нибудь знает, как это сделать?
Решение
Смотрите пример и ссылки в python-imap-простаивает-с-imaplib2.Модуль предполагает потоковую обработку, вам следует обратить внимание на синхронизацию событий.
Пример предполагает синхронизацию с событиями и оставляет обработку почты читателю:
# The method that gets called when a new email arrives.
# Replace it with something better.
def dosync(self):
print "Got an event!"
Извлекая подсказку из вопроса, "что-нибудь получше" может быть:
# Replaced with something better.
def dosync(self):
print "Got an event!"
res = self.M.recent()
print res
Другие советы
Я нахожу, что recent() немного расплывчат (это неопределенность IMAP, а не imaplib 2).Кажется, лучше вести список номеров сообщений до и после простоя, и разница заключается в новых сообщениях.
Затем используйте fetch(сообщения, "UID"), чтобы получить uid сообщения.