Lese-Ansicht

E-Mails mit Python lesen: imaplib

Für die Neuauflage meines Scripting-Buchs habe ich mich zuletzt mit dem Senden und Empfangen von E-Mails per SMTP und IMAP beschäftigt. Dieser Blog-Beitrag stellt das Standardmodul imaplib vor. Damit können Sie per IMAP Postfächer abrufen und verwalten. Die Anwendung ist ein wenig umständlich, aber dafür können Sie wirklich praktisch alles machen, was das Protokoll IMAP vorsieht.

Kurz erklärt: IMAP und Authentifizierung

IMAP (Internet Message Access Protocol) ist das Standardprotokoll zum Abrufen und Verwalten von E-Mails auf einem Mailserver. Die Verbindung erfolgt normalerweise über Port 993 mit SSL/TLS. Im Unterschied zu POP3 verbleiben die Nachrichten auf dem Server und lassen sich in Ordnern organisieren – IMAP eignet sich daher besonders gut für die automatisierte Verarbeitung.

Klassische Unix/Linux-Mailserver erlauben die Anmeldung mit Benutzername und Passwort. Bei Google-Konten ist das anders: Gmail erfordert entweder App-Passwörter (16-stellige Codes, die Sie nach Aktivierung der Zwei-Faktor-Authentifizierung unter myaccount.google.com/apppasswords erstellen) oder OAuth2. App-Passwörter sind dabei die einfachere Variante für Scripts.

Passwörter sollten nie direkt im Scriptcode stehen. Die Beispiele hier lesen die Zugangsdaten aus Umgebungsvariablen, die wiederum aus einer Datei credentials.env geladen werden:

# credentials.env  (chmod 600; in .gitignore aufnehmen!)
IMAP_HOST=mail.example.com
IMAP_USER=username
IMAP_PASS=topSecret

In Python laden Sie die Datei am einfachsten mit python-dotenv:

from dotenv import load_dotenv
load_dotenv("credentials.env")

Das Modul installieren Sie mit pip install python-dotenv oder – wenn Sie uv verwenden – mit uv add python-dotenv.

imaplib: Verbinden, suchen und herunterladen

imaplib ist seit Python 2 Bestandteil der Standardbibliothek und deckt den vollständigen IMAP-Befehlssatz ab. Das folgende Beispiel-Script stellt die Verbindung zur Inbox her, lädt die zehn neuesten E-Mails herunter und zeigt die wichtigsten Metadaten tabellarisch an – mit * als Indikator für noch ungelesene Nachrichten:

* 13-05 17:53  papa.xxx@xxx...     AW: Halbjahresabrechnungen
  12-05 20:48  kundenxxx@xxx...    Terminanfrage Sendungszustel...
  12-05 04:02  info@weltxxx...     Japan, Korsika oder Sansibar ...
  11-05 20:51  noreply@xxx...      OpenAI Dev News: Realtime 2.0...
  05-05 18:58  cron@webxxx         Invitation updated: iprot dev 
  04-05 08:28  externexxx@fhxxx... Vertrag bereit zur Abbrechnung

imaplib.IMAP4_SSL stellt die Verbindung zum IMAP-Server auf Port 993 her. select öffnet einen Ordner, search liefert eine Liste von Nachrichten-IDs als leerzeichen-getrennte Byte-Zeichenkette, fetch lädt die Rohdaten einer einzelnen oder mehrerer Nachrichten.

Der Parameter readonly=True bei select stellt sicher, dass das Abrufen der Nachrichten keine Nebeneffekte hat – insbesondere werden keine Nachrichten als gelesen markiert. Das ist wichtig, weil IMAP-Server den Status einer Nachricht bereits beim Öffnen verändern können.

search(None, "ALL") liefert eine aufsteigend sortierte Liste aller Nachrichten-IDs im Postfach. Mit split()[-10:] extrahieren Sie die zehn neuesten. Diese IDs werden, getrennt durch Kommas, zu einem einzigen fetch-Aufruf zusammengefasst. Als Fetch-Attribute übergeben Sie FLAGS für den Lesestatus sowie BODY.PEEK[HEADER.FIELDS (...)], um nur die benötigten Header-Felder abzurufen. PEEK verhindert dabei, dass der Server die Nachrichten automatisch als gelesen kennzeichnet.

Jede Zeile der Server-Antwort ist ein Tupel aus Metadaten und rohen Header-Bytes. ParseFlags wertet die Metadaten aus und gibt die IMAP-Flags als Tupel zurück. Wenn \Seen fehlt, gilt die Nachricht als ungelesen. message_from_bytes wandelt die Header-Bytes in ein auswertbares Objekt um.

parsedate_to_datetime macht aus einem RFC-2822-Datum ein datetime-Objekt, das dann mit strftime nach eigenen Vorstellungen formatiert werden kann. parseaddr zerlegt das From-Feld in ein (Name, Adresse)-Tupel. MIME-kodierte Header-Zeichenketten wie =?utf-8?q?...?= entschlüsselt decode_header aus dem Modul email.header.

Die Ergebnisse werden zunächst in einer Liste gesammelt, da die Reihenfolge der Server-Antwort nicht zwingend der Reihenfolge der angefragten IDs entspricht. reversed dreht die Liste beim Ausgeben um, sodass die neueste Nachricht zuerst erscheint.

# Beispieldatei fetch-imap.py
import os, email, imaplib
from email.header import decode_header, make_header
from email.utils import parsedate_to_datetime, parseaddr
from dotenv import load_dotenv

# IMAP-Konfigurationsparameter lesen
load_dotenv("credentials.env")
HOST = os.environ["IMAP_HOST"]
USER = os.environ["IMAP_USER"]
PASS = os.environ["IMAP_PASS"]

# RFC-2047-Header (=?utf-8?q?...?=) dekodieren
def decode_mime(value: str | None) -> str:
    return str(make_header(decode_header(value or "")))

# Zeichenkette auf max_len verkürzen
def truncate(text: str, n: int) -> str:
    return text if len(text) <= n else text[: n - 3] + "..."

# Verbindung zum IMAP-Server
with imaplib.IMAP4_SSL(HOST) as imap:
    imap.login(USER, PASS)
    imap.select("INBOX", readonly=True)  # nichts ändern!

    # IDs aller Nachrichten ermitteln -> Byte-String für fetch()
    _, data = imap.search(None, "ALL")
    id_set = b",".join(data[0].split()[-10:])  # max. 10

    # IDs der ungelesenen Nachrichten
    _, unseen_data = imap.search(None, "UNSEEN")
    unseen = set(unseen_data[0].split())

    # relevante Spalten abfragen (IMAP-Syntax); PEEK, damit
    # das Seen-Flag nicht gesetzt wird
    fields = "(FLAGS BODY.PEEK[HEADER.FIELDS (DATE FROM SUBJECT)])"
    _, rows = imap.fetch(id_set, fields)

    # Daten/Spalten dekodieren und formatieren
    messages = []
    for row in rows:
        if not isinstance(row, tuple):
            continue
        meta, raw_headers = row
        # Sequence-Nummer am Beginn der Metadaten (b'4 (FLAGS ...')
        seq     = meta.split()[0]
        is_new  = seq in unseen
        msg     = email.message_from_bytes(raw_headers)
        dt      = parsedate_to_datetime(msg["Date"])
        date    = dt.strftime("%d-%m %H:%M")
        addr    = parseaddr(decode_mime(msg.get("From", "")))[1]
        sender  = truncate(addr, 20)
        raw_sub = decode_mime(msg.get("Subject", "(no subject)"))
        subject = truncate(raw_sub, 40)
        messages.append((is_new, date, sender, subject))

    # in umgekehrter Reihenfolge ausgeben, die neueste Mail zuerst
    for is_new, date, sender, subject in reversed(messages):
        flag = "*" if is_new else " "
        print(f"{flag} {date}  {sender:<20}  {subject}")

Was imaplib sonst noch kann

Das obige Beispiel kratzt nur an der Oberfläche. imaplib deckt den vollständigen IMAP-Befehlssatz ab:

  • Vollständige Nachrichten laden: Mit fetch können Sie nicht nur Header, sondern auch den kompletten Nachrichtentext inklusive Anhänge abrufen.
  • Filtern: search akzeptiert IMAP-Suchkriterien wie FROM, SUBJECT, SINCE oder UNSEEN, um gezielt nach bestimmten Nachrichten zu suchen.
  • Flags setzen: store setzt oder entfernt Flags wie \Seen, \Flagged oder \Deleted.
  • Löschen: expunge löscht die als \Deleted markierten Nachrichten endgültig.
  • Ordner verwalten: copy verschiebt Nachrichten zwischen Ordnern, list gibt alle verfügbaren Mailboxen zurück, create und delete legen neue Ordner an oder entfernen sie.

Kurz gesagt: Von der einfachen Posteingangsübersicht bis zur vollautomatisierten Mailbox-Verwaltung ist alles drin.

Alternativen zu imaplib

Wer die etwas sperrige API von imaplib als mühsam empfindet, kann auf IMAPClient ausweichen. Die Bibliothek ist ein High-Level-Wrapper um imaplib, der insbesondere den Umgang mit Nachrichten-IDs, Flags und Ordnern deutlich angenehmer macht. Das folgende Mini-Beispiel zeigt die Verbindung und das Abrufen der Betreffzeilen aller ungelesenen Nachrichten:

from imapclient import IMAPClient

with IMAPClient(HOST) as client:
    client.login(USER, PASS)
    client.select_folder("INBOX", readonly=True)
    messages = client.search("UNSEEN")
    for uid, data in client.fetch(messages, "ENVELOPE").items():
        print(data[b"ENVELOPE"].subject.decode())

IMAPClient installieren Sie mit pip install imapclient bzw. uv add imapclient.

Wer IMAP in einem asyncio-Kontext benötigt, greift zu aioimaplib – einer vollständig async-fähigen Bibliothek, da imaplib synchron blockiert. Und imbox ist eine sehr einsteigerfreundliche Abstraktion, die E-Mails als Python-Objekte mit direkt zugänglichen Attributen wie .subject oder .attachments liefert. Der Nachteil: weniger Kontrolle bei komplexen Operationen.

Quellen und Links

  •  

MZLA setzt bei Thunderbird Pro klar auf Thundermail

Die Entwickler von MZLA richten ihre Energie nun stärker auf Thundermail. Der Dienst soll laut jüngster Ankündigung zum zentralen Bestandteil von Thunderbird Pro werden. Andere Projekte wie die Terminverwaltung und der Dateiversand treten vorerst zurück. Das aktuelle Update zeigt eine deutliche Verschiebung der Prioritäten. Thundermail soll in deutschen Rechenzentren gehostet werden und dabei besonders stabil […]

Der Beitrag MZLA setzt bei Thunderbird Pro klar auf Thundermail erschien zuerst auf fosstopia.

  •  

Proton plant große Neuerungen für 2026

Proton plant für das kommende Jahr eine breite Modernisierung seines gesamten Ökosystems. Der Anbieter will seine Dienste enger verzahnen und gleichzeitig viele Funktionen verbessern, die Nutzer schon lange erwarten. Im Mittelpunkt stehen mehr Geschwindigkeit, bessere Organisation und ein stärker integriertes Gesamtpaket. Bei Proton Mail rückt die Ordnung im Postfach in den Fokus. Die neue Kategorienansicht […]

Der Beitrag Proton plant große Neuerungen für 2026 erschien zuerst auf fosstopia.

  •  

adminForge Mail: Sicheres E-Mail Hosting für Privatsphäre-Enthusiasten

Ein neuer adminForge Service kann ab sofort genutzt werden.

adminForge Mail: Deine E-Mail. Deine Freiheit. Professionelles Mail-Hosting ohne Tracking. 100% werbefrei, sicher und mit Standort in Deutschland.

 

Deine E-Mail. Deine Freiheit. Professionelles Mail-Hosting ohne Tracking. 100% werbefrei, sicher und mit Standort in Deutschland.

https://mail.adminforge.de

Aufbau:

  • Portal zur Registrierung eines Kontos mit Domainauswahl
  • Jede Domain hat seinen eigenen mailcow-Server
  • mailcow Stable-Version (Docker)
  • Als mailcow-Storage wird ein 3-fach redundanter RustFS S3 Storage eingesetzt.
  • RustFS hat 3x Storage Box von Hetzner mit jeweils (zu Beginn) 1 TB Speicher. Das macht netto 2 TB.
  • Als Dateisystem wird JuiceFS eingesetzt, dies spricht direkt RustFS an und ermöglicht den Erhalt der mailcow-Verzeichnisstruktur.
  • Serverseitige Mail-Verschlüsselung durch mailcow-Cryptmodul.
  • Tägliche snapshot-basierte Sicherung der Storage Boxen.
  • Tägliche Sicherung der mailcow Mails, Datenbank und Konfiguration.

Features:

  • Privatsphäre & Sicherheit: Keine Analyse deiner Mails, kein Tracking. Deine Daten gehören dir. Alle E-Mails werden auf der Festplatte verschlüsselt abgelegt.
  • Kalender & Kontakte: Verwaltung deiner Termine und Adressbücher via CalDAV, CardDAV und Exchange ActiveSync (EAS) auf allen Geräten.
  • 100% Werbefrei: Genieße ein sauberes Postfach mit 1 GB Speicher und ohne lästige Werbebanner. Voller Fokus auf deine Korrespondenz.
  • Standort Deutschland: Serverstandorte ausschließlich in Deutschland bei Hetzner Online. DSGVO-konform und sicher.

Software: mailcow

 

Euer adminForge Team

UnterstützenDas Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld.
Unterstütze unsere Arbeit mit einer Spende und diskutiere in unserem Chat mit.

by adminForge.

  •  

Chatmail: E-Mail-Relay für Delta Chat

Ein neuer adminForge Service kann ab sofort genutzt werden.

Ein sicherer, schneller und minimalistischer E-Mail-Relay speziell optimiert für Delta Chat.

 

Ein sicherer, schneller und minimalistischer E-Mail-Relay speziell optimiert für Delta Chat.

https://chat.adminforge.de

Features:

  • Dezentrale Architektur auf Basis von E‑Mail‑Servern (IMAP/SMTP).
  • Ende‑zu‑Ende‑Verschlüsselung für Chats und Gruppenchats.
  • Keine Telefonnummer nötig; Einrichtung nur mit E‑Mail‑Adresse.
  • Mehrere Profile und mehrere Geräte gleichzeitig nutzbar.
  • Quellcode offen (FOSS) für Client und Server‑Komponenten.
  • Chat‑Ansicht ähnlich wie WhatsApp (Chatliste, Avatare, grüner Akzent).
  • Textnachrichten, Bilder, Videos, Dateianhänge, Kontakte und Reaktionen möglich.
  • Sprach‑ und Videoanrufe sind möglich.
  • Interaktive Web‑Apps in Chats (z. B. Spiele, Umfragen, Kalender, Einkaufslisten; Konfetti‑Regen, To‑do‑Listen, Zeichnungen, Taschenrechner etc.).
  • Einladungslinks und QR‑Codes, um neue Kontakte sicher zu verbinden.

Software: Chatmail

 

Euer adminForge Team

UnterstützenDas Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld.
Unterstütze unsere Arbeit mit einer Spende und diskutiere in unserem Chat mit.

by adminForge.

  •  

Thunderbird 148 bringt wichtige Verbesserungen

Mozilla stellt mit Thunderbird 148 eine neue Version seines beliebten Desktop Clients bereit. Die Aktualisierung fällt zwar überschaubar aus, doch viele Änderungen wirken direkt im Alltag. Besonders auffällig ist die Möglichkeit, den Favoriten Ordner nun direkt als Ziel für Verschiebeaktionen auszuwählen. Das spart Zeit und macht die Navigation angenehmer. Auch bei der Anmeldung hat sich […]

Der Beitrag Thunderbird 148 bringt wichtige Verbesserungen erschien zuerst auf fosstopia.

  •  

BSI prüft E-Mail-Programme

Das Bundesamt für Sicherheit in der Informationstechnik (BSI) hat untersucht, inwiefern E-Mail-Programme relevante Eigenschaften, wie Transport- und Inhaltsverschlüsselung, SPAM-, Phishing- und…

  •  

E-Mail-Konto umziehen mit imapsync

Ein E-Mail-Umzug von einem Server auf einen anderen gehört zu den Aufgaben, die oft unterschätzt werden. Wer schon einmal versucht hat, ein E-Mail-Konto auf einen neuen Mailserver zu übertragen, kennt die typischen Probleme: unterschiedliche IMAP-Server, abweichende Login-Methoden, große Postfächer oder das Risiko, E-Mails doppelt oder gar nicht zu übertragen.

Für eine saubere und zuverlässige E-Mail-Migration gibt es jedoch ein bewährtes Open-Source-Tool: imapsync. Mit imapsync lassen sich komplette IMAP-Konten effizient und sicher von einem Server auf einen anderen synchronisieren – ohne Datenverlust und mit minimaler Ausfallzeit. Ob beim Providerwechsel, beim Umzug auf einen eigenen Mailserver oder beim Zusammenführen mehrerer Postfächer: imapsync bietet eine stabile und flexible Lösung für jede Art von Mailserver-Migration.

In diesem Artikel zeige ich Schritt für Schritt, wie imapsync funktioniert, welche Parameter in der Praxis wichtig sind und wie du deinen E-Mail-Umzug stressfrei und automatisiert durchführen kannst.

Die Open Source Software Imapsync vorgestellt

So einem Umzug von einem E-Mail-Server zu einem anderen mit einem Terminal-Programm zu machen, klingt etwas verrückt. In Wirklichkeit ist das aber eine große Stärke, da imapsync während der Übertragung bereits wertvolle Statusmeldungen ausgibt und man die Statistik im Blick behält.

Theoretisch lässt sich das Programm via Eingabe verschiedener Flags bedienen. Für mich hat sich aber bewährt, dass man es mit einem einfachen Skript ausführt. In aller Regel zieht man ja kein einzelnes Postfach um, sondern mehrere E-Mail-Konten. Motivation könnte zum Beispiel eine Änderung der Domain oder der Wechsel des Hosters sein. Aber selbst bei Einzelkonten empfehle ich die Benutzung des Skripts, weil sich hier die Zugangsdaten übersichtlich verwalten lassen.

Was imapsync jetzt macht, ist ziemlich straight-forward: Es meldet sich auf dem ersten Host („alter Server“) an, checkt erstmal die Ordnerstruktur, zählt die E-Mails und verschafft sich so einen Überblick. Hat man bereits die Zugangsdaten für den zweiten Host („neuer Server“), tut er das gleiche dort. Danach überträgt die Software die E-Mails von Host 1 auf Host 2. Bereits übertragene Mails werden dabei berücksichtigt. Man kann den Umzug also mehrfach starten, es werden nur die noch nicht übertragenen Mails berücksichtigt.

Die Webseite von imapsync ist auf den ersten Blick etwas ungewöhnlich, worauf der Entwickler auch stolz ist. Wenn man aber genauer hinsieht, merkt man die gute Dokumentation. Es werden auch Spezialfälle wie Office 365 von Microsoft oder Gmail behandelt.

Die Statistik von imapsync gibt bereits einen guten Überblick, wie gut der Umzug geklappt hat

Installation von imapsync

Die Software gibt es für Windows, Mac und Linux. Die Installation unter Ubuntu ist für geübte Benutzer recht einfach, auch wenn die Software nicht in den Paketquellen vorkommt. Github sei Dank.

sudo apt-get installlibauthen-ntlm-perl libclass-load-perllibcrypt-openssl-rsa-perl libcrypt-ssleay-perllibdata-uniqid-perl libdigest-hmac-perl libdist-checkconflicts-perl libencode-imaputf7-perl libfile-copy-recursive-perl libfile-tail-perl libio-compress-perl libio-socket-inet6-perl libio-socket-ssl-perl libio-tee-perllibjson-webtoken-perl libmail-imapclient-perl libmodule-scandeps-perl libnet-dbus-perllibnet-dns-perl libnet-ssleay-perllibpar-packer-perllibproc-processtable-perl libreadonly-perllibregexp-common-perl libsys-meminfo-perl libterm-readkey-perllibtest-fatal-perllibtest-mock-guard-perl libtest-mockobject-perl libtest-pod-perllibtest-requires-perl libtest-simple-perl libunicode-string-perlliburi-perl libtest-nowarnings-perl libtest-deep-perl libtest-warn-perl make time cpanminus
wget -N https://raw.githubusercontent.com/imapsync/imapsync/master/imapsync
chmod +x imapsync
sudo cp imapsync /usr/bin/

Die Installation ist nun fertig und systemweit verfügbar.

E-Mail-Postfach von einem Server zum anderen umziehen

Für den Umzug von einem Server zum anderen braucht man – wenig überraschend – jeweils die Zugangsdaten. Diese beinhalten IMAP-Server, Benutzername und Passwort. Das wars. Es empfiehlt sich, mit einem echten Host 1 zu starten, als Host 2 aber erstmal einen Testaccount zu verwenden.

Ich orientiere mich an den Empfehlungen des Programmierers und erstelle zunächst eine Datei mit den jeweiligen Zugangsdaten. Genau wie im Beispielskript verwende ich eine siebte, unnötige Spalte. Sie endet die Zeilen ordentlich ab, ohne dass man ein Problem mit den Zeilenumbruch zu erwarten hat.

Wir nennen die Datei file.txt. Jeweils die Einträge 1 bis 3 sind die Quelle, Spalten 4 bis 6 sind das Ziel.

host001_1;user001_1;password001_1;host002_1;user002_1;password002_1;;
host001_2;user001_2;password001_2;host002_2;user002_2;password002_2;;

Das Skript nennen wir mailumzug.sh und es enthält folgenden Inhalt.

echo Looping on accounts credentials found in file.txt
echo
line_counter=0
# Empty the error listing
> file_failures.txt
{ while IFS=';' read h1 u1 p1 h2 u2 p2 extra fake
    do 
        line_counter=`expr 1 + $line_counter` 
        { echo "$h1" | tr -d '\r' | egrep '^#|^ *$' ; } > /dev/null && continue # this skip commented lines in file.txt
        echo "==== Starting imapsync with --host1 $h1 --user1 $u1 --host2 $h2 --user2 $u2 $extra $@ ===="
        echo Got those values from file.txt presented inside brackets: [$h1] [$u1] [$h2] [$u2] [$extra] [$fake]
        if eval imapsync --host1 "$h1" --user1 "$u1" --password1 "$p1" \
                    --host2 "$h2" --user2 "$u2" --password2 "$p2" $extra "$@" 
        then
                echo "success sync for line $line_counter "
        else
                echo "$h1;$u1;$p1;$h2;$u2;$p2;$extra;" | tee -a file_failures.txt
        fi
        echo "==== Ended imapsync with --host1 $h1 --user1 $u1 --host2 $h2 --user2 $u2 $extra $@ ===="
        echo
    done
} < file.txt

Das Skript wird aufgerufen via

sh mailumzug.sh

Es wird während der Überführung ein ausführliches Log geführt, das man im Nachgang auch als Text-Datei erhält. Viel Spaß!

The post E-Mail-Konto umziehen mit imapsync first appeared on bejonet - Linux | Smart Home | Technik.

  •  

Thunderbird Finanzbericht für 2024

Die MZLA hat den Finanzbericht für den E-Mail-Client Thunderbird für 2024 vorgelegt. Das Spendenaufkommen wurde erneut gesteigert und verzeichnet erstmals einen zweistelligen Millionenbetrag.

  •  

Thunderbird 140 ESR: „Eclipse“

Mozilla hat Version 140 seines E-Mail-Clients Thunderbird veröffentlicht. Neben dem regulären Monats-Release steht auch eine neue ESR-Version („Extended Support Release“) bereit.

  •  
❌