Obtenha conteúdo não lido por e -mail, sem afetar o estado não lido [duplicado
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ê?
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()