Minimales Python IMAP über TLS Beispiel

English Deutsch

Note: Under some circumstances you might want to consider using IMAP over SSL instead. See Minimal Python IMAP over SSL example

Dieser Beispielcode wird sich beim Server anmelden, eine TLS-Sitzung starten, die Postfächer auflisten und sich sofort abmelden.

minimal-python-imap-tls.py
#!/usr/bin/env python3
import imaplib
import ssl

# Vertrauenswürdige SSL-Zertifikate des Systems laden
tls_context = ssl.create_default_context()

# Verbinden (zuerst unverschlüsselt)
server = imaplib.IMAP4('imap.mydomain.com')
# TLS-Verschlüsselung starten. Wird fehlschlagen, wenn die TLS-Sitzung nicht hergestellt werden kann
server.starttls(ssl_context=tls_context)
# Login. NUR NACH server.starttls() AUSFÜHREN !!
server.login('[email protected]', 'password')
# Liste der Postfächer auf dem Server ausgeben
code, mailboxes = server.list()
for mailbox in mailboxes:
    print(mailbox.decode("utf-8"))
# Postfach auswählen
server.select("INBOX")
# Bereinigung
server.close()

Denke daran zu ersetzen:

Du musst absolut sicherstellen, dass du zuerst server.starttls(...) ausführst und danach erst server.login(...). Wenn du dies nicht tust, könnten Lauscher deinen Benutzernamen und dein Passwort lesen, was nicht verschlüsselt ist!

Wenn du dieses Skript ausführst, könnte eine erfolgreiche Ausgabe so aussehen:

imap-mailboxes.txt
(\HasChildren) "." INBOX
(\HasNoChildren) "." INBOX.Spam
(\HasNoChildren) "." INBOX.Drafts
(\HasNoChildren) "." INBOX.Sent
(\HasNoChildren) "." INBOX.Trash

Wenn deine Anmeldedaten nicht funktionieren, wirst du eine Fehlermeldung wie diese sehen:

imap-error-auth.txt
Traceback (most recent call last):
  File "./imaptest.py", line 5, in <module>
    server.login('[email protected]', 'mypassword')
  File "/usr/lib/python3.6/imaplib.py", line 598, in login
    raise self.error(dat[-1])
imaplib.error: b'[AUTHENTICATIONFAILED] Authentication failed.'

Note that in order to be able to server.close() the connection, it’s required that you server.select() a mailbox first ; this is why we can’t just omit the server.select("INBOX") line even though we don’t actually do anything with the mailbox. See this post for a more concise example on this behaviour.


Check out similar posts by category: Python