1. Syntaxprüfung mit email-validator
pip install email-validator
from email_validator import validate_email, EmailNotValidError
try:
info = validate_email("Anna@Example.com", check_deliverability=False)
email = info.normalized # "Anna@example.com"
except EmailNotValidError as e:
print(str(e))
check_deliverability=True prüft zusätzlich, ob die Domain DNS-Einträge für E-Mails hat.
2. MX-Abfrage mit dnspython
import dns.resolver # pip install dnspython
def has_mx(domain: str) -> bool:
try:
return len(dns.resolver.resolve(domain, "MX")) > 0
except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer, dns.resolver.NoNameservers):
return False
3. Prüfen, ob das Postfach existiert
import os
import requests
def validate(email: str) -> dict:
res = requests.get(
"https://api.emailvalidation.io/v1/info",
params={"email": email},
headers={"apikey": os.environ["EMAILVALIDATION_API_KEY"]},
timeout=30,
)
res.raise_for_status()
return res.json()
result = validate("anna@company.com")
print(result["state"], result["reason"], result["score"])
4. Eine CSV-Datei validieren
import csv
with open("contacts.csv") as src, open("contacts.validated.csv", "w", newline="") as dst:
reader = csv.DictReader(src)
writer = csv.DictWriter(dst, fieldnames=reader.fieldnames + ["state", "reason", "disposable"])
writer.writeheader()
for row in reader:
r = validate(row["email"])
writer.writerow({**row, "state": r["state"], "reason": r["reason"], "disposable": r["disposable"]})
Bei großen Dateien senden Sie die Anfragen parallel mit einem Thread-Pool (5–10 Worker) und beachten das Rate-Limit Ihres Tarifs. Für eine schnelle, einmalige Liste mit bis zu 50 Adressen nutzen Sie den Bulk-E-Mail-Validator.