Найти новые сообщения, добавленные в почтовый ящик imap с тех пор, как я последний раз проверял python imaplib2?
Я пытаюсь написать программу, которая отслеживает почтовый ящик 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(), когда с почтовым ящиком происходит первое изменение. Но ответ от недавнего () не имеет смысла для меня, и после первого сообщения я никогда не получаю никаких других уведомлений.
Кто-нибудь знает, как это сделать?
2 ответа
Смотрите пример и ссылки в http://blog.hokkertjes.nl/2009/03/11/python-imap-idle-with-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, а не imaplib2). Кажется, лучше вести список номеров сообщений до и после простоя, и разница в новых сообщениях.
Затем используйте fetch (messages, UID), чтобы получить идентификатор сообщения.