E-Mail-Verifizierung in Python: Zustellbarkeit aus Ihrem Code prüfen
Validieren Sie das Format mit einer bewährten Bibliothek und prüfen Sie die Zustellbarkeit aus Python für einzelne Adressen, 100er-Batches oder ganze Dateien.

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=Falsediese 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.
- 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.
- Aufgabenreferenz einreichen und speichern in Ihrer Datenbank, zusammen mit dem Dateinamen und der Zeit, damit ein neu gestarteter Worker fortfahren kann.
- 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
- 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.DictReaderund 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/mcpunterstü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.