2013-06-28 4 views
5

Поиск здесь и в Интернете есть много примеров того, как отмечать сообщение как ПОЛЬЗОВАТЕЛЯ, даже если это автоматически с помощью imap.python imaplib - отметьте адрес электронной почты как непрочитанный или невидимый

Но как я могу пометить письмо как UNSEEN или UNREAD.

У меня есть скрипт в python, который получает UNSEEN сообщений, и он отлично работает. Но после прочтения их imap автоматически отмечает их как SEEN, который отлично работает, но только в том случае, если сценарий не имеет ошибок, потому что, если он вызывает исключение, я хочу, чтобы письмо было снова помечено как UNSEEN, поэтому в следующий раз сценарий прочитает это сообщение еще раз.

Как я могу достичь этого?

Я также использовал mail.select(mail_label,readonly=True), но это не помогает, потому что я не могу отметить сообщение как SEEN, которое мне также нужно. Я также хочу, чтобы это работало с Gmail.

ответ

5

Вы можете легко очистить \Seen флаги с помощью этой команды:

tag UID STORE -FLAGS (\Seen) 

но ваша программа, вероятно, будет более robost, если вы только установить флаг \Seen в первую очередь после того, как вы успешно обработал сообщение. Таким образом, если что-то пойдет не так, когда вы обрабатываете сообщение (даже если соединение с сервером IMAP нарушено), флаг остается неустановленным, и вы можете повторить это сообщение при следующем запуске скрипта. Вы делаете это, избегая автоматической настройки IMAP-сервера флага \Seen, используя BODY.PEEK вместо BODY.

В Python, I думаю, что команда STORE должна быть выдана так, но я не пробовал.

connection.uid('STORE', '-FLAGS', '(\Seen)') 
+0

с использованием imaplib, выглядывать, я использую: '.fetch (Num '(BODY.PEEK [])')'. –

5

В Python, модуль imaplib описывает STORE как:

(typ, [data]) = <instance>.store(message_set, command, flags) 

так, следующая строка позволит вам установить сообщение READ ('+ ФЛАГИ') или UNREAD ('-flags') как требуется.

connection.uid('STORE', MESSAGE_ID, '+FLAGS', '\SEEN') 

Как вы видите, секреты на команды FLAGS;)