Registrieren Sie sich und kontaktieren Sie den Support, um 100 kostenlose Prüfungen zu erhalten.Kostenlos registrieren
EmailCheckPro Workflow-Illustration zu „E-Mail-Verifizierung in Python: Zustellbarkeit aus Ihrem Code prüfen“
Ein visueller Überblick über den in diesem EmailCheckPro Artikel beschriebenen Workflow.

Ein Python-Leitfaden für die E-Mail-Verifizierung: lokale Formatvalidierung, Zustellbarkeitsprüfungen für einzelne und mehrere Adressen sowie asynchrone Bulk-Aufgaben.

Die E-Mail-Verifizierung in Python besteht aus zwei Teilen. Validieren Sie das Format lokal mit einer gepflegten Bibliothek wie email-validator und prüfen Sie anschließend die Zustellbarkeit durch einen API-Aufruf aus Ihrem Code: POST /api/v1/check von EmailCheckPro für eine einzelne Adresse, POST /api/v1/batch-check für 1–100 Adressen in einer synchronen Anfrage oder eine Bulk-Aufgabe für TXT/CSV-Dateien, die nicht häufiger als alle 30 Sekunden abgefragt werden sollte. Jede abgeschlossene Prüfung meldet zum Zeitpunkt der Überprüfung, ob eine Adresse Zustellbar oder Nicht zustellbar ist; einige Adressen bleiben Unbestimmt. Bei der Prüfung wird nichts an die Adresse gesendet.

Formatvalidierung vs. Zustellbarkeitsprüfungen in Python

Die meisten Python-Tutorials zu diesem Thema vermischen drei Techniken: Regex, eine DNS-Abfrage der Domain und ein Skript, das mit dem Mailserver des Empfängers kommuniziert. Diese beantworten unterschiedliche Fragen, wobei die letzte Methode echte Risiken birgt.

Technik Was sie Ihnen sagt Haupteinschränkung
Regex oder Validierungsbibliothek Die Eingabe sieht aus wie eine vollständige Adresse Sagt nichts über das Postfach aus
Domain-DNS-Abfrage Die Domain scheint für den Empfang von E-Mails eingerichtet zu sein Sagt nichts über die individuelle Adresse aus
Eigenbau-Mailserver-Skript Manchmal, ob ein Empfänger akzeptiert wird Viele Server akzeptieren alles oder verweigern unbekannte Anrufer; Ihre IP kann auf Blocklisten landen
Zustellbarkeits-API Zustellbar oder Nicht zustellbar zum Zeitpunkt der Prüfung, ohne Versand Einige Adressen bleiben Unbestimmt

Eine praxisorientierte Python-Pipeline nutzt die erste Zeile für jede Eingabe und die letzte Zeile für wichtige Adressen, wie z. B. bei neuen Anmeldungen, Importen oder Listen, die demnächst angeschrieben werden sollen. Bestätigungslinks bleiben ein separater Schritt für Zustimmung und Eigentumsnachweis.

Schritt 1: Formatvalidierung mit email-validator

Das email-validator-Paket liefert lesbare Fehlermeldungen und eine normalisierte Form der Adresse, was einen besseren Ausgangspunkt darstellt als ein selbst geschriebenes Muster.

from email_validator import validate_email, EmailNotValidError

def screen_format(raw: str) -> str | None:
    try:
        result = validate_email(raw.strip(), check_deliverability=False)
        return result.normalized
    except EmailNotValidError:
        return None

Zwei Details sind hier wichtig:

  • Deaktivieren Sie den DNS-Schritt. Standardmäßig fragt die Bibliothek das DNS ab, um zu sehen, ob die Domain E-Mails empfangen kann. Dies ist ein Signal auf Domain-Ebene, erhöht die Latenz und die Zustellbarkeits-API beantwortet diese Frage direkter. Daher hält check_deliverability=False diese Ebene schnell und offline.
  • Speichern Sie den normalisierten Wert. Die Bibliothek schreibt die Domain klein und normalisiert Unicode, wodurch verhindert wird, dass Duplikate aufgrund unterschiedlicher Schreibweisen durchschlüpfen.

Ein fehlerhafter Eintrag sollte an den Benutzer zurückgegeben oder in eine Korrekturliste aufgenommen werden. Es handelt sich nicht um ein Ergebnis als Nicht zustellbar, und die OWASP-Richtlinien raten von strengen benutzerdefinierten Mustern ab, die gültige Adressen ablehnen.

Schritt 2: Zustellbarkeit für eine einzelne Adresse prüfen

Für eine Anmeldeseite oder eine Profilbearbeitung rufen Sie den Einzel-Endpunkt aus dem Server-Code mit requests auf.

import os
import requests

API_BASE = os.environ["EMAILCHECK_API_BASE"]   # aus der API-Dokumentation
session = requests.Session()
session.headers.update(build_headers())        # Authentifizierungs-Header genau wie dokumentiert

def check_one(email: str) -> str:
    try:
        resp = session.post(f"{API_BASE}/api/v1/check",
                            data=build_check_body(email),   # Body wie dokumentiert
                            timeout=(3.05, 10))
        return to_outcome(resp)  # "Zustellbar" | "Nicht zustellbar" | "Unbestimmt"
    except requests.RequestException:
        return "not_completed"

build_headers, build_check_body und to_outcome sind kleine Hilfsfunktionen, die basierend auf der EmailCheckPro-API-Dokumentation geschrieben wurden, sodass Authentifizierung und Felddetails an einer Stelle liegen und dem veröffentlichten Vertrag entsprechen. Die Rückgabe einfacher Strings hält den Rest der Codebasis unabhängig vom Antwortformat.

Verwenden Sie immer ein Timeout. Die Requests-Dokumentation weist darauf hin, dass Anfragen standardmäßig kein Timeout haben und dass ein Tupel separate Limits für Verbindung und Lesen festlegt. Wählen Sie Werte basierend auf der Toleranz Ihrer eigenen Seite; die obigen Zahlen sind Beispiele.

Unterscheiden Sie dann zwischen vier Zuständen:

  • Zustellbar: Fahren Sie fort und speichern Sie das Prüfdatum.
  • Nicht zustellbar: Bitten Sie um eine andere Adresse.
  • Unbestimmt: Zum Beispiel bei einer Catch-All-Adresse. Die Echtzeit-API gibt einen Geschäftscode anstelle eines Ergebnisses zurück, und die Prüfung wird nicht berechnet. Akzeptieren Sie dies mit einem Flag.
  • Nicht abgeschlossen: Ein Timeout oder Netzwerkfehler. Akzeptieren Sie dies mit einem Flag und prüfen Sie später erneut aus einer Warteschlange.

Schritt 3: Bis zu 100 Adressen pro Anfrage prüfen

Admin-Tools, kleine Importe und nächtliche Jobs verarbeiten oft einige Dutzend oder hundert Adressen. POST /api/v1/batch-check akzeptiert 1–100 Adressen und antwortet in derselben Anfrage, wobei die Ergebnisse in der Reihenfolge der Eingabe vorliegen.

def chunks(items, size=100):
    for start in range(0, len(items), size):
        yield items[start:start + size]

def check_many(emails: list[str]) -> dict[str, str]:
    outcomes = {}
    for group in chunks(emails):
        items = post_multi(group)          # POST /api/v1/batch-check
        for email, item in zip(group, items):
            outcomes[email] = item_outcome(item)  # kein abgeschlossenes Ergebnis -> "Unbestimmt"
    return outcomes

Da die Reihenfolge beibehalten wird, ordnet zip jedes Element der Adresse zu, die es erzeugt hat. Jedes Element gibt auch an, ob ein abgeschlossenes Ergebnis vorliegt. Nur Elemente mit einer 1 sind Zustellbar oder Nicht zustellbar; alles andere landet in der Gruppe Unbestimmt oder Nicht abgeschlossen, niemals bei Nicht zustellbar.

Deduplizieren Sie die normalisierten Adressen vor dem Chunking, damit dasselbe Postfach nicht zweimal in einem Durchgang geprüft wird. Für einige hundert Adressen ohne Code verarbeitet die Echtzeitprüfung im Dashboard bis zu 500 Adressen gleichzeitig.

Schritt 4: Bulk-Aufgabe für ganze Dateien ausführen

Sobald die Quelle ein Export ist, ist eine Bulk-Aufgabe besser geeignet. Sie ist asynchron; führen Sie sie daher eher aus einem Skript, einem geplanten Job oder einem Worker wie Celery aus als aus einer Web-Ansicht.

  1. Datei schreiben. Erstellen Sie eine TXT- oder CSV-Datei mit einer vollständigen Adresse pro Zeile. Pythons integrierte Dateischreibfunktion reicht für TXT aus; das csv-Modul hilft, wenn Sie von einem Tabellenexport ausgehen.
  2. Aufgabenreferenz einreichen und speichern in Ihrer Datenbank, zusammen mit dem Dateinamen und der Zeit, damit ein neu gestarteter Worker fortfahren kann.
  3. Geduldig abfragen in Intervallen von 30 Sekunden oder mehr:
import time

def run_bulk(path: str) -> str:
    task_ref = submit_file(path)           # POST /api/v1/bulk-tasks
    save_task(task_ref, path)              # Worker-Neustarts überstehen
    while True:
        status = get_status(task_ref)      # GET /api/v1/bulk-tasks/{id}
        if status.finished:
            return status.result_link      # 12 Stunden gültig
        time.sleep(30)                     # niemals schneller abfragen
  1. Herunterladen und zusammenführen. Eine erfolgreiche Aufgabe gibt eine CSV-Datei unter einem Link zurück, der 12 Stunden lang gültig ist; fragen Sie die Aufgabe erneut ab, um einen neuen Link zu erhalten, falls dieser abläuft. Lesen Sie sie mit csv.DictReader und führen Sie sie über die E-Mail-Adresse zusammen, nicht über die Zeilennummer, da ungültige und doppelte Zeilen während der Vorbereitung entfernt werden.

Die Zustellbarkeits-CSV ordnet jeder Adresse ihr Ergebnis zu. Für Gmail-, Yandex- und Mail.ru-Listen fügt der Email Bulk Avatar Check Avatar-Spalten hinzu; dessen Avatar-Link kann leer sein, auch wenn ein Profilbild vorhanden ist. Produktbezogene Aufgabenlimits sind in der API-Dokumentation aufgeführt.

Die Python-Integration zuverlässig halten

  • Halten Sie den Schlüssel aus dem Code fern. Lesen Sie ihn aus einer Umgebungsvariablen oder einem Secret-Store; er verbraucht das Kontoguthaben, das von Web-Prüfungen, API-Aufrufen, Bulk-Aufgaben und MCP-Zugriffen gemeinsam genutzt wird.
  • Wiederverwenden einer Session. Dies hält Verbindungen über Aufrufe hinweg offen, was bei Schleifen über Multi-Adress-Chunks hilft.
  • Daten aufzeichnen. Ein Ergebnis beschreibt die Adresse zum Zeitpunkt der Prüfung; speichern Sie daher das Datum und prüfen Sie ältere Zeilen vor einem großen Versand erneut.
  • Warteschlange für Wiederholungen. Unbestimmte, fehlgeschlagene und ungültige Prüfungen werden nicht berechnet, aber sofortige Wiederholungen ändern das Ergebnis selten. Planen Sie diese mit einer Verzögerung und einem Limit.
  • Testen Sie die Verzweigungen. Mocken Sie die Hilfsfunktion, die die API aufruft, und stellen Sie sicher, dass jeder Zustand die richtige Nachricht oder Warteschlange erreicht.
  • KI-Notebooks und Assistenten: Der MCP-Endpunkt unter https://emailcheckpro.com/mcp unterstützt Einzelprüfungen und bis zu 100 Adressen; Datei-Aufgaben verbleiben bei der REST-API.

FAQ

Welche Python-Bibliothek ist am besten für die E-Mail-Formatvalidierung geeignet?

email-validator ist eine weit verbreitete Wahl, da sie klare Fehlermeldungen liefert, internationalisierte Domains unterstützt und eine normalisierte Adresse zurückgibt. Unabhängig davon, welche Bibliothek ein Team wählt, ist es entscheidend, eine einzige Quelle der Wahrheit für Formulare, Importe und Skripte zu verwenden und optionale DNS-Abfragen zu deaktivieren, wenn eine separate Zustellbarkeitsprüfung bereits abdeckt, ob die Adresse E-Mails empfangen kann.

Wie können Teams eine große CSV-Datei mit Adressen aus Python prüfen?

Schreiben Sie eine TXT- oder CSV-Datei mit einer vollständigen Adresse pro Zeile, reichen Sie diese als Bulk-Aufgabe ein und fragen Sie deren Status aus einem Hintergrund-Job nicht häufiger als alle 30 Sekunden ab. Wenn die Aufgabe erfolgreich ist, laden Sie die Ergebnis-CSV innerhalb von 12 Stunden herunter oder fragen Sie die Aufgabe erneut ab, um einen neuen Link zu erhalten, und führen Sie die Ergebnisse anhand der E-Mail-Adresse zusammen.

Warum Postfächer nicht mit einem selbst geschriebenen Python-Mailserver-Skript verifizieren?

Viele Mailserver akzeptieren jeden Empfänger, verzögern unbekannte Anrufer oder blockieren wiederholte Verbindungen, sodass Skripte einen großen Anteil an nicht schlüssigen Antworten zurückgeben und die sendende IP auf Blocklisten landen kann. Eine gehostete Zustellbarkeitsprüfung gibt Zustellbar oder Nicht zustellbar zurück, ohne etwas an die Adresse zu senden, und markiert Adressen, die nicht eindeutig bestimmt werden können, als Unbestimmt, anstatt zu raten.

Mehr erfahren

Wählen Sie die Produktinformationen, die zum nächsten Schritt in Ihrem Workflow passen.

Quellen