Minimales Python IMAP über TLS Beispiel
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.
#!/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:
imap.mydomain.comwith the domain name or IP address of your IMAP server[email protected]by the email address you want to login withpasswordby the password you want to login with
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:
(\HasChildren) "." INBOX
(\HasNoChildren) "." INBOX.Spam
(\HasNoChildren) "." INBOX.Drafts
(\HasNoChildren) "." INBOX.Sent
(\HasNoChildren) "." INBOX.TrashWenn deine Anmeldedaten nicht funktionieren, wirst du eine Fehlermeldung wie diese sehen:
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.