"Sent Item" mit imaplib funktioniert nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
El Cattivo
User
Beiträge: 4
Registriert: Montag 18. April 2016, 12:44

Hallo Zusammen!
ich benötige ein Script, welche mir alle E-Mails in einem Bestimmten imap-Ordner auf ungelesen setzt.
folgendes Zeilen habe ich mir zusammen getippt:

Code: Alles auswählen

import imaplib

im = imaplib.IMAP4_SSL("imap.provider.de") 
im.login("el_cattivo@provider.de", "123456")
im.select("INBOX", readonly=False)
typ, data = im.search(None, 'ALL')
for num in data[0].split():
   im.store(num, '-FLAGS', '\\seen')
im.expunge()
im.close()
im.logout()
Das funktioniert auch soweit ganz gut.Auch mit anderen Ordner funktioniert es ("Drafts","Notes")
Aber beim Ordner "Sent Items" funktioniert es nicht.
Ich denke das das Problem das Leerzeichen ist.Habe aber keine Ahnung wie ich es anders Schreiben soll.
Was muss ich ändern damit es auch mit "Sent Items funktioniert?

MfG El Cattivo
BlackJack

@El Cattivo: Was heisst „funktioniert nicht“? Bekommst Du eine Fehlermeldung? Falls ja, welche und mit welchen Code genau. Werden bei der Suche auch tatsächlich Nachrichten gefunden? Wie sehen die Rückgabewerte vom `store()` aus? Wie überprüfst Du das Flag hinterher?
El Cattivo
User
Beiträge: 4
Registriert: Montag 18. April 2016, 12:44

Hallo,
erstmal vielen Dank für deine schnelle Antwort.
Ob die Flags gesetzt werden oder nicht habe ich einfach mit meinem E-Mail Programm überprüft.
Wie gesagt mit dem code aus Post 1 werden alle E-Mails in der in Box auf ungelsen gesetzt (geprüft von Hand mit E-Mail Programm).
Wenn ich den Code wie folgt abändere:

Code: Alles auswählen

import imaplib

im = imaplib.IMAP4_SSL("imap.provider.de")
im.login("el_cattivo@provider.de", "123456")
im.select("Sent Items", readonly=False)
typ, data = im.search(None, 'ALL')
for num in data[0].split():
   im.store(num, '-FLAGS', '\\seen')
im.expunge()
im.close()
im.logout()
bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\El_Cattivo\AppData\Local\Programs\Python\Python35-32\mail.py", line 7, in <module>
    typ, data = im.search(None, 'ALL')
  File "C:\Users\El_Cattivo\AppData\Local\Programs\Python\Python35-32\lib\imaplib.py", line 707, in search
    typ, dat = self._simple_command(name, *criteria)
  File "C:\Users\El_Cattivo\AppData\Local\Programs\Python\Python35-32\lib\imaplib.py", line 1180, in _simple_command
    return self._command_complete(name, self._command(name, *args))
  File "C:\Users\El_Cattivo\AppData\Local\Programs\Python\Python35-32\lib\imaplib.py", line 928, in _command
    ', '.join(Commands[name])))
imaplib.IMAP4.error: command SEARCH illegal in state AUTH, only allowed in states SELECTED
Den Ordner "Sent Items" gibt es aber Wenn ich mir die Rückgabewerte von list() ausgeben lasse:

Code: Alles auswählen

('OK', [b'(\\Archive \\HasNoChildren) "." "Archive"', b'(\\Drafts \\HasNoChildren) "." "Drafts"', b'(\\HasNoChildren) "." "Gel&APY-schte Elemente"', b'(\\HasNoChildren) "." "INBOX"', b'(\\HasNoChildren) "." "Junk-E-Mail"', b'(\\HasNoChildren) "." "Notes"', b'(\\Sent \\HasNoChildren) "." "Sent Items"', b'(\\Junk \\HasNoChildren) "." "Spam"', b'(\\Trash \\HasNoChildren) "." "Trash"'])
BlackJack

@El Cattivo: Die Ausnahme behauptet ja auch nicht dass es den Ordner nicht gibt, sondern das sich der Status der Verbindung noch in AUTH befindet und nicht in SELECTED. Was eigenartig ist. Also am Leerzeichen kann es nicht eigentlich nicht liegen, das habe ich eben selbst mal ausprobiert.
BlackJack

Wie sieht denn der Rückgabewert von dem `select()`-Aufruf aus?
El Cattivo
User
Beiträge: 4
Registriert: Montag 18. April 2016, 12:44

der Rückgabewert sieht wie folgt aus für "Sent Items":

Code: Alles auswählen

('NO', [b'[TRYCREATE] Mailbox does not exist'])
der Rückgabewert sieht wie folgt aus für "INBOX":

Code: Alles auswählen

('OK', [b'42'])
El Cattivo
User
Beiträge: 4
Registriert: Montag 18. April 2016, 12:44

Ich habe noch etwas herumgespielt und habe gemerkt das es mit Python 2.7 funktioniert und mit 3.5 nicht.
folgenden Code habe ich verwendet:

Code: Alles auswählen

import imaplib

im = imaplib.IMAP4_SSL("imap.provider.de") 
im.login("el_cattivo@provider.de", "123456")
mailbox='Sent Items'
test= im.select(mailbox, readonly=False)
print(test)
im.logout()
Der Rückgabewert mit Python 2.7 ist:

Code: Alles auswählen

('OK', ['3'])
und mit Python 3.5 ist der Rückgabewert:

Code: Alles auswählen

('NO', ['[TRYCREATE] Mailbox does not exist'])
Kann mir das jemand erklären?
Antworten