Encontre novas mensagens adicionadas a uma caixa de correio IMAP desde a última vez que verifiquei com o python iMaplib2?
-
20-09-2019 - |
Pergunta
Estou tentando escrever um programa que monitora uma caixa de correio IMAP e copie automaticamente todas as novas mensagens de entrada em uma pasta "Archive". Estou usando o IMAPLIB2, que implementa o comando ocioso. Aqui está o meu programa básico:
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()
Ele imprime as caixas de correio corretamente e executa o processo () quando a primeira alteração acontece com a caixa de correio. Mas a resposta de recente () não faz sentido para mim e, após a primeira mensagem, nunca recebo nenhuma outra notificação.
Alguém sabe como fazer isto?
Solução
Veja o exemplo e referências em Python-imap-Idle-With-Imaplib2. O módulo envolve rosqueamento, você deve prestar atenção à sincronização de eventos.
O exemplo sugere sincronizar com os eventos e deixa o processamento de correio ao leitor:
# The method that gets called when a new email arrives.
# Replace it with something better.
def dosync(self):
print "Got an event!"
Tirando uma dica da pergunta, "algo melhor" pode ser:
# Replaced with something better.
def dosync(self):
print "Got an event!"
res = self.M.recent()
print res
Outras dicas
Estou descobrindo que recente () é um pouco vago (isso é uma imprecisão imap, não imaplib2). Parece melhor manter uma lista de números de mensagens antes e depois da ociosa, e a diferença são novas mensagens.
Em seguida, use Fetch (Mensagens, "UID") para obter a mensagem UID.