2009-10-14 7 views
4

Сейчас его почтовый ящик, но рано или поздно я хочу его масштабировать.получить непрочитанный текст, не влияя на непрочитанное состояние

Я хочу синхронизировать копию личного личного почтового ящика (входящих и исходящих) в другом месте, но я не хочу влиять на состояние непрочитанных сообщений unread.

Какой тип доступа сделает это проще всего? Я не могу найти никакой информации, если IMAP повлияет на состояние чтения, но, похоже, я могу вручную сбросить сообщение для непрочитанных. Поп по определению не влияет на непрочитанное состояние, но никто, кажется, не использует pop для доступа к их gmail, почему?

ответ

0

Если это помогает кому угодно, GAE позволяет вам receive email as an HTTP request, так что пока я просто пересылаю электронные письма.

1

Никто не использует POP, потому что обычно хочет дополнительных функций IMAP, таких как состояние отслеживания сообщений. Когда эта функциональность только мешает вам и требует обходных решений, я думаю, что с помощью POP ваш лучший выбор! -)

+0

POP полностью непригоден, если вам нужны папки или одновременный доступ - ваша программа не может подключиться, когда ваш обычный интерактивный клиент уже подключен, или наоборот; или, в худшем случае, вы можете, но сервер не знает, что с вами делать, и делает что-то еще, чем вы хотели и ожидали. – tripleee

5

В мире IMAP каждое сообщение имеет флаги. Вы можете установить отдельные флаги для каждого сообщения. Когда вы выбираете сообщение, на самом деле можно прочитать сообщение, не применяя флаг \ Seen.

Большинство почтовых клиентов будут применять флаг \ Seen при чтении сообщения. Итак, если сообщение уже было прочитано вне вашего приложения, вам нужно будет удалить флаг \ Seen.

Подобно тому, как FYI ... вот соответствующая часть о флагах от РЛКА:

флага системы является именем флага, который предварительно определен в этом спецификации. Все системные флаги начинаются с «\». Определенная система flags (\ Deleted and \ Seen) содержит специальную семантику в другом месте. В настоящее время определенные флагов системы являются:

\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. 
+0

Использование 'PEEK' устраняет необходимость прямого манипулирования флагами. – tripleee

3

Существует .PEEK варианта по команде FETCH в IMAP, который явно не установлен/Seen флага.

Посмотрите на the FETCH command in RFC 3501 и немного прокрутите страницу до 57 или найдите «BODY.PEEK».

0

Чтобы следить за Dan Goldstein's answer above в питона синтаксис использовать опцию «.PEEK» было бы назвать IMAP4.fetch и передать его „BODY.PEEK

Чтобы применить это к примеру в 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() 
2

Необходимо указать раздел при использовании BODY.PEEK. Разделы объясняются в IMAP Fetch Command документаций под ТЕЛА [< раздел >] < < частичная > >

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: Я хотел, чтобы исправить ответ дал Gene Wood но не было разрешено, потому что редактировать был меньше 6 символов (BODY.PEEK - > ТЕЛО.PEEK [])