Pergunta

Esta pergunta já tem uma resposta aqui:

No momento, é uma caixa do Gmail, mas mais cedo ou mais tarde eu quero que ela escala.

Quero sincronizar uma cópia de uma caixa de correio pessoal ao vivo (caixa de entrada e caixa de saída) em outro lugar, mas não quero afetar o unread estado de qualquer mensagem não lida.

Que tipo de acesso tornará isso mais fácil? Não consigo encontrar nenhuma informação se o IMAP afetar o estado de leitura, mas parece que posso redefinir manualmente uma mensagem para não ler. O pop por definição não afeta o estado não lido, mas ninguém parece usar o Pop para acessar seu Gmail, por quê?

Foi útil?

Solução 5

Se ajudar alguém, o GAE permite que você Receba e -mail como uma solicitação HTTP, então, por enquanto, estou apenas encaminhando e -mails lá.

Outras dicas

No mundo IMAP, cada mensagem tem bandeiras. Você pode definir os sinalizadores individuais em cada mensagem. Quando você busca uma mensagem, é realmente possível ler a mensagem, sem aplicar o sinalizador visto.

A maioria dos clientes de email aplicará o sinalizador visto quando a mensagem for lida. Portanto, se a mensagem já foi lida, fora do seu aplicativo, você precisará remover o sinalizador visto.

Assim como a FYI ... aqui está a parte relevante sobre bandeiras dos RFCs:

Um sinalizador do sistema é um nome de sinalizador predefinido nesta especificação. Todos os sinalizadores do sistema começam com "". Certos sinalizadores do sistema ( excluídos e vistos) têm semântica especial descrita em outros lugares. Os sinalizadores do sistema atualmente definidos são:

    \Seen
       Message has been read

    \Answered
       Message has been answered

    \Flagged
       Message is "flagged" for urgent/special attention

    \Deleted
       Message is "deleted" for removal by later EXPUNGE

    \Draft
       Message has not completed composition (marked as a draft).

    \Recent
       Message is "recently" arrived in this mailbox.  This session
       is the first session to have been notified about this
       message; if the session is read-write, subsequent sessions
       will not see \Recent set for this message.  This flag can not
       be altered by the client.

       If it is not possible to determine whether or not this
       session is the first session to be notified about a message,
       then that message SHOULD be considered recent.

       If multiple connections have the same mailbox selected
       simultaneously, it is undefined which of these connections
       will see newly-arrived messages with \Recent set and which
       will see it without \Recent set.

Existe uma opção .Peek no comando buscador no IMAP que explicitamente não definirá o sinalizador /visto.

Olhe para O comando buscador na RFC 3501 e role para baixo um pouco para a página 57 ou pesquise "body.peek".

Você precisa especificar a seção quando usar o corpo. Seções são explicadas em Comando IMAP Fetch Documentações sob o corpo [u003Csection> ] <u003Cpartial> >

import getpass, imaplib

M = imaplib.IMAP4()
M.login(getpass.getuser(), getpass.getpass())
M.select()
typ, data = M.search(None, 'ALL')
for num in data[0].split():
    typ, data = M.fetch(num, '(BODY.PEEK[])')
    print 'Message %s\n%s\n' % (num, data[0][5])
M.close()
M.logout()

PS: Eu queria corrigir a resposta dada Madeira de gene mas não foi permitido porque a edição era menor que 6 caracteres (corpo.peek -> body.peek [])

Ninguém usa pop porque normalmente eles querer A funcionalidade extra do IMAP, como rastrear o estado da mensagem. Quando essa funcionalidade está ficando apenas no seu caminho e precisa de soluções alternativas, acho que usar o Pop é a sua melhor aposta!-)

Para acompanhar Resposta de Dan Goldstein acima, em Python, a sintaxe para usar a opção ".peek" seria ligar IMAP4.Fetch e passar "Body.peek"

Para aplicar isso ao exemplo no Python Docs :

import getpass, imaplib

M = imaplib.IMAP4()
M.login(getpass.getuser(), getpass.getpass())
M.select()
typ, data = M.search(None, 'ALL')
for num in data[0].split():
    typ, data = M.fetch(num, '(BODY.PEEK)')
    print 'Message %s\n%s\n' % (num, data[0][5])
M.close()
M.logout()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top