Найти новые сообщения, добавленные в почтовый ящик imap с момента последней проверки с помощью python imaplib2? - PullRequest
3 голосов
/ 12 января 2010

Я пытаюсь написать программу, которая отслеживает почтовый ящик 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 ]

1 голос
/ 25 марта 2010

Я считаю, что Recent () немного расплывчато (это нечеткость IMAP, а не imaplib2). Кажется, лучше вести список номеров сообщений до и после простоя, и разница в новых сообщениях.

Затем используйте fetch (messages, UID), чтобы получить идентификатор сообщения.

1 голос
/ 12 января 2010

См. Пример и ссылки в 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
...