2013-06-28 25 views
5

Wyszukiwanie tutaj i w Internecie istnieje wiele przykładów, jak oznaczyć wiadomość jako ZOBACZ, nawet jeśli jest to automatyczne z imap.python imaplib - oznacz e-mail jako nieprzeczytany lub niewidoczny

Ale jak mogę oznaczyć wiadomość e-mail jako UNSEEN lub UNREAD.

Mam skrypt w python, który odbiera wiadomości UNSEEN i działa świetnie. Ale po ich przeczytaniu imap automatycznie rozpoznaje je jako SEEN, co działa dobrze, ale tylko wtedy, gdy skrypt nie zawiera błędów, ponieważ jeśli podnosi wyjątek, chcę, aby wiadomość e-mail została ponownie oznaczona jako UNSEEN, więc następnym razem skrypt odczyta tę wiadomość jeszcze raz.

Jak mogę to osiągnąć?

Używam również mail.select(mail_label,readonly=True), ale to nie pomaga, ponieważ z tym nie mogę oznaczyć wiadomości jako SEEN, której również potrzebuję. Chcę też, aby to działało z Gmailem.

Odpowiedz

5

można łatwo wyczyścić \Seen flagi z tym poleceniem:

tag UID STORE -FLAGS (\Seen) 

ale oprogramowanie będzie prawdopodobnie bardziej robost jeśli tylko ustawić flagę \Seen w pierwszej kolejności po pomyślnym przetworzeniu wiadomości. W ten sposób, jeśli coś pójdzie nie tak podczas przetwarzania wiadomości (nawet jeśli połączenie z serwerem IMAP zostanie zerwane), flaga pozostanie niezatwierdzona i będzie można ją ponownie wysłać przy następnym uruchomieniu skryptu. Robisz to, unikając automatycznego ustawienia flagi serwera IMAP za pomocązamiast BODY.

W języku Python, , myślę, że, że polecenie STORE powinno być wydane w ten sposób, ale nie próbowałem go.

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

użyciu imaplib, PEEK, używam: '.fetch (num '(BODY.PEEK [])')'. –

5

W Pythonie moduł imaplib opisuje magazyn:

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

więc następujący wiersz pozwoli Ci ustawić wiadomość do czytania („+ FLAGI”) lub nieprzeczytane („-flags”) jako wymagane.

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

Jak widać, tajemnice to na polecenie bander;)