Encontre novas mensagens adicionadas a uma caixa de correio IMAP desde a última vez que verifiquei com o python iMaplib2?

StackOverflow https://stackoverflow.com/questions/2047067

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top