Skip to content
Starten Sie mit 100 kostenlosen Verifizierungs-Credits
Qualisend
Alle Artikel
Engineering / 14. Juni 2026

E-Mail-Adresse in Java validieren

10 Min. Lesezeit

Qualisend team
E-Mail-Adresse in Java validieren

Eine E-Mail-Adresse in Java zu validieren, sind eigentlich drei Prüfungen, die sich einen Namen teilen. Die meisten Tutorials greifen zu einer Regex, bestätigen, dass die Zeichenkette wie eine Adresse geformt ist, und erklären es damit für erledigt — doch die Form ist das am wenigsten nützliche der drei Dinge, die Sie eigentlich wissen wollen. Echte Validierung ist geschichtet: eine günstige Formatprüfung, ein DNS-Lookup für die Mail-Route der Domain und eine SMTP-Postfachprüfung. Javas Standardbibliothek und Jakarta Mail decken die ersten beiden sauber ab; die dritte ist ein Netzwerkproblem, das man besser auslagert. Dieser Leitfaden baut jede Schicht mit lauffähigem Code auf und zeigt genau, wo jede von ihnen aufhört.

Die kurze Antwort#

Verwenden Sie jakarta.mail.internet.InternetAddress (oder Apache Commons Validator) für die Syntax, den in das JDK integrierten JNDI-DNS-Provider für den MX-Lookup und eine Verifizierungs-API für die SMTP-Postfachprüfung — das Günstigste zuerst, mit Kurzschluss, sobald eine Prüfung entscheidend ist. Öffnen Sie keine SMTP-Verbindungen von Ihrer Anwendung aus, um Postfächer selbst zu prüfen: Der ausgehende Port 25 ist auf den meisten Hosts blockiert, und die Antwort hängt von der Reputation der Sende-IP und vom Greylisting ab, das Sie nicht neu implementieren wollen. Jede Schicht schließt Adressen günstiger aus als die vorherige; nur die letzte kann eine Adresse einschließen.

Schicht 1: Syntax mit Jakarta Mail#

Jakarta Mail — die Bibliothek, die von javax.mail umbenannt wurde, als sie in den Namensraum von Jakarta EE wechselte — liefert einen Adress-Parser, auf den Sie sich statt auf eine selbst gebastelte Regex stützen können. Konstruieren Sie eine InternetAddress und rufen Sie validate() auf: Der Konstruktor parst die Adresse, und validate() erzwingt die RFC-822-Syntax und wirft bei allem Fehlerhaften eine AddressException.

import jakarta.mail.internet.AddressException;
import jakarta.mail.internet.InternetAddress;

public static boolean isValidSyntax(String email) {
    if (email == null || email.length() > 320) {
        return false;
    }
    try {
        InternetAddress address = new InternetAddress(email);
        address.validate();
        // Rejects "Jane <jane@example.com>": the parser keeps only the address part.
        return email.equals(address.getAddress());
    } catch (AddressException e) {
        return false;
    }
}

Dieser letzte Vergleich schließt eine Lücke, die die meisten Beispiele übersehen. InternetAddress parst laut Dokumentation auch die Form Personal Name <user@host.domain>, und validate() prüft nur den Adressteil, sodass Jane <jane@example.com> beide Schritte besteht. Ohne den Vergleich bekäme Schicht 2 die Domain example.com>. Wenn getAddress() der unveränderten Eingabe entsprechen muss, fällt alles durch, was einen Namen oder spitze Klammern enthält.

Eines sollten Sie wissen: validate() ist bei der Domain nachsichtig. Es akzeptiert jane@localhost und jane@example — kein Punkt erforderlich — weil RFC 822 punktlose Domains erlaubt. Das ist hier in Ordnung. Schicht 1 ist ein Formattor, keine Zustellbarkeitsprüfung, und der DNS-Lookup von Schicht 2 ist das, was tatsächlich entscheidet, ob die Domain Mail empfangen kann. Halten Sie diese Prüfung nachsichtig und lassen Sie DNS das Aussortieren übernehmen; der formalen Perfektion mit einer größeren Regex hinterherzujagen, ist ohnehin ein aussichtsloses Spiel.

Wenn Sie eine ältere javax.mail-JAR verwenden, ist der Code identisch bis auf den Paketnamen. Und wenn Sie ohnehin bereits von Apache Commons Validator abhängen, ist dessen EmailValidator eine gute Alternative für Schicht eins — er ist eine Spur strenger (er lehnt punktlose Domains standardmäßig ab):

import org.apache.commons.validator.routines.EmailValidator;

boolean valid = EmailValidator.getInstance().isValid(email);

Bevorzugen Sie Jakarta Mail, wenn Sie es ohnehin zum Versenden von Mail nutzen — eine Abhängigkeit weniger. Beide Bibliotheken beantworten immer nur die Syntaxfrage. Dasselbe gilt für @Email aus Bean Validation, das der Spring-Boot-Leitfaden behandelt.

E-Mail-Validierung per Regex in Java (wenn es sein muss)#

Wenn Sie keine Bibliothek einbinden können oder eine einzige Regel mit dem Frontend teilen müssen, halten Sie die Regex nachsichtig und kompilieren Sie sie nur einmal:

import java.util.regex.Pattern;

// Dot-separated runs with no whitespace, @ or quotes, one @,
// then a domain with at least one dot.
private static final Pattern EMAIL = Pattern.compile(
    "[^\\s@.\"]+(?:\\.[^\\s@.\"]+)*@[^\\s@.]+(?:\\.[^\\s@.]+)+",
    Pattern.UNICODE_CHARACTER_CLASS);

public static boolean looksLikeEmail(String email) {
    return email != null && email.length() <= 320 && EMAIL.matcher(email).matches();
}

Es ist dasselbe nachsichtige Muster, das der Artikel Warum die E-Mail-Validierung per Regex scheitert empfiehlt: Der Punkt bleibt aus den Zeichenfolgen des lokalen Teils heraus, sodass a..b@example.com, .a@example.com und a.@example.com alle durchfallen. Es braucht weder ^ noch $, weil matches() die gesamte Eingabe abdecken muss; find() sucht nach einer passenden Teilzeichenkette und würde daher junk jane@example.com junk akzeptieren. UNICODE_CHARACTER_CLASS sorgt dafür, dass \s auch Unicode-Leerzeichen erkennt, wie in JavaScript.

Vermeiden Sie zwei häufige Fallen: eine TLD-Obergrenze wie [a-zA-Z]{2,7}, die echte TLDs wie .photography ablehnt, und ausufernde „RFC 5322"-Muster, die Formen akzeptieren, die kein Anmeldeformular haben will. Ein Treffer beweist die Form, mehr nicht.

Schicht 2: Kann die Domain überhaupt Mail empfangen?#

Eine Domain ohne Mail-Route kann für niemanden Mail annehmen, also eliminiert ein schneller DNS-Lookup (zuerst MX, dann als Rückfall die eigene Adresse der Domain) tote Domains, falsch geschriebene Firmennamen und erfundene TLDs. Java erledigt das ganz ohne externe Abhängigkeit: Das JDK bringt einen DNS-Service-Provider für JNDI mit, sodass Sie das MX-Attribut über einen DirContext auflösen.

import java.util.Hashtable;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public static boolean hasMailRoute(String domain) {
    Hashtable<String, String> env = new Hashtable<>();
    env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
    env.put("com.sun.jndi.dns.timeout.initial", "2000"); // don't hang on a slow resolver
    env.put("com.sun.jndi.dns.timeout.retries", "1");

    DirContext ctx = null;
    try {
        ctx = new InitialDirContext(env);
        Attribute mx = ctx.getAttributes(domain, new String[] { "MX" }).get("MX");
        if (mx != null && mx.size() > 0) {
            return true;
        }
        // No MX: mail goes to the domain's own address (A or AAAA), the implicit MX.
        // One type per call: asking for several at once sends an ANY query.
        for (String type : new String[] { "A", "AAAA" }) {
            Attribute addr = ctx.getAttributes(domain, new String[] { type }).get(type);
            if (addr != null && addr.size() > 0) {
                return true;
            }
        }
        return false;
    } catch (NameNotFoundException e) {
        return false; // NXDOMAIN: the domain doesn't exist
    } catch (NamingException e) {
        return true;  // timeout or resolver failure: can't tell, so don't reject
    } finally {
        if (ctx != null) {
            try { ctx.close(); } catch (NamingException ignored) { }
        }
    }
}

Trennen Sie die Domain am letzten @ von der Adresse ab, damit Sie zitierte lokale Teile nicht aus dem Tritt bringen:

String domain = email.substring(email.lastIndexOf('@') + 1);

hasMailRoute("gmail.com");               // true
hasMailRoute("company-that-folded.com"); // false

Ein fehlendes oder leeres MX-Attribut bedeutet, dass die Domain keinen MX-Eintrag veröffentlicht; eine NameNotFoundException (eine Unterklasse von NamingException) bedeutet, dass sie sich überhaupt nicht auflöst. Manche Domains nehmen Mail über einen A- oder AAAA-Eintrag mit implizitem MX an, daher fragt das Snippet ersatzweise "A" und "AAAA" ab, wenn das MX-Set leer zurückkommt, und zwar einen Typ pro Aufruf: JNDI macht aus einer Anfrage nach mehreren Typen eine ANY-Abfrage, die viele DNS-Server nur noch mit einem minimalen Platzhalter beantworten. Für die überwältigende Mehrheit echter Adressen ist eine MX-Prüfung der richtige Filter. Da der Lookup auf einem DNS-Resolver blockiert, behalten Sie die obigen Timeouts in einem Anmeldepfad bei und behandeln Sie einen vorübergehenden Fehler als „später erneut prüfen", nicht als harte Ablehnung — ein DNS-Schluckauf sollte einen echten Kunden nicht abweisen. Deshalb liefert jede andere NamingException, etwa ein Timeout, true und überlässt die Entscheidung Schicht 3. Um eine Domain von Hand zu prüfen, nutzen Sie den MX-Record-Lookup.

Schicht 3: Existiert das Postfach tatsächlich?#

Die Schichten 1 und 2 können eine Adresse nur ausschließen. Eine Domain kann perfekte MX-Einträge veröffentlichen und trotzdem kein Postfach unter der Adresse haben, die Sie in Händen halten — noreply-9f2x@gmail.com ist syntaktisch gültig auf einer Domain mit aktiver Mail-Route, und es ist trotzdem ein Postfach, das nie angelegt wurde. Die Bestätigung, dass ein bestimmtes Postfach existiert, erfordert die SMTP-Zustellkonversation: Verbindung zum Mail-Host aufbauen, RCPT TO ausgeben, den Antwortcode lesen und die Verbindung trennen, bevor irgendetwas gesendet wird. Es steckt mehr dahinter — Catch-all-Domains akzeptieren jede Adresse und hebeln eine naive Prüfung aus — wie E-Mail-Verifizierung funktioniert durchläuft die gesamte Pipeline.

Sie können SMTP in Java mit einem rohen Socket skripten, aber Sie sollten es nicht aus Ihrer Anwendung heraus ausführen. Die meisten Cloud-Anbieter blockieren den ausgehenden Port 25, die Antwort hängt von der Reputation der IP ab, von der aus Sie sich verbinden, und empfangende Server greylisten unbekannte Absender und drosseln deren Rate — sodass eine Prüfung, die in einem lokalen Test besteht, in der Produktion still fehlschlägt oder Sie auf eine Blockliste bringt. Das ist die Schicht, die es sich zu delegieren lohnt.

Die Verifizierungs-API von Qualisend durchläuft diese Pipeline von einer reputationsgeführten Infrastruktur aus, die genau dafür gebaut ist. POST /verify liefert sofort ein Urteil aus den lokalen Prüfungen (Syntax, DNS, Erkennung von Wegwerfadressen und Tippfehlern) plus eine job_id; ist die Postfachprüfung noch ausstehend, landet ihr Urteil auf diesem Job. Java 11+ bringt java.net.http.HttpClient mit, sodass Sie keine HTTP-Abhängigkeit brauchen; kombinieren Sie es mit Jackson (oder Gson), um das JSON zu lesen. Bewahren Sie Ihren Schlüssel in einer Umgebungsvariablen auf und codieren Sie ihn niemals fest:

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.Map;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class QualisendClient {
    private static final String BASE_URL = "https://app.qualisend.com/api/v1";

    private final HttpClient http = HttpClient.newHttpClient();
    private final ObjectMapper mapper = new ObjectMapper();
    private final String apiKey = System.getenv("QUALISEND_API_KEY"); // holds YOUR_API_KEY

    /** POST /verify: a job_id plus the instant verdict under "result". */
    public JsonNode verify(String email) throws IOException, InterruptedException {
        String payload = mapper.writeValueAsString(Map.of("email", email));
        return send(HttpRequest.newBuilder()
            .uri(URI.create(BASE_URL + "/verify"))
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(payload)));
    }

    /** GET /jobs/{id}: the job's status and, once completed, its results. */
    public JsonNode job(String jobId) throws IOException, InterruptedException {
        return send(HttpRequest.newBuilder()
            .uri(URI.create(BASE_URL + "/jobs/" + jobId + "?include=results"))
            .GET());
    }

    private JsonNode send(HttpRequest.Builder builder) throws IOException, InterruptedException {
        HttpRequest request = builder
            .header("Authorization", "Bearer " + apiKey)
            .timeout(Duration.ofSeconds(10)) // throws HttpTimeoutException past this
            .build();
        HttpResponse<String> response =
            http.send(request, HttpResponse.BodyHandlers.ofString());
        if (response.statusCode() / 100 != 2) {
            throw new ApiException(response.statusCode(),
                response.headers().firstValue("Retry-After").orElse(null));
        }
        return mapper.readTree(response.body());
    }

    /** A non-2xx reply. It extends IOException, like HttpTimeoutException. */
    public static class ApiException extends IOException {
        public final int status;
        public final String retryAfter; // seconds, sent with a 429

        ApiException(int status, String retryAfter) {
            super("Qualisend responded " + status);
            this.status = status;
            this.retryAfter = retryAfter;
        }
    }
}

Lesen Sie die Felder, die Sie interessieren, aus dem result-Knoten heraus:

JsonNode body   = client.verify("jane@example.com");
JsonNode result = body.get("result");

String  status     = result.get("status").asText();  // deliverable | risky | undeliverable | unknown
int     score      = result.path("score").asInt();    // 0–100 confidence
String  smtp       = result.path("smtp").asText();    // pending | cached | skipped
String  reason     = result.hasNonNull("reason")
                         ? result.get("reason").asText()  // machine-readable reason, null while pending
                         : null;
boolean disposable = result.path("sub_flags").path("disposable").asBoolean();
String  jobId      = body.path("job_id").asText();    // where the mailbox verdict lands

Die genaue Struktur der Antwort — jeder sub_flags-Schlüssel und jeder reason-Code — steht in der API-Referenz. Für die Live-Validierung bei der Anmeldung reicht der status meist aus, um zu handeln: undeliverable ablehnen, risky und unknown nach Richtlinie behandeln und disposable-Adressen am Eingabefeld kennzeichnen.

Das SMTP-Urteil abholen: den Job abfragen#

Prüfen Sie smtp, bevor Sie status als endgültig behandeln. Bei cached (ein aktuelles Ergebnis wurde wiederverwendet) oder skipped (die lokalen Prüfungen waren eindeutig) ist das result endgültig und reason ist gesetzt. Bei pending steht die Postfachprüfung in der Warteschlange und läuft erst, nachdem die Antwort zurückgekommen ist; status ist daher ein vorläufiges unknown und reason ist null: Lehnen Sie die Adresse deshalb nicht ab. Server, die Greylisting betreiben, antworten einem unbekannten Absender erst bei einem erneuten Versuch, sodass das Postfach-Urteil Minuten statt Sekunden dauern kann.

Bei der Anmeldung hat das Sofort-Urteil fehlerhafte Syntax, tote Domains und Wegwerfadressen bereits abgefangen, also lassen Sie ein ausstehendes unknown durch. Wenn Sie die Antwort zum Postfach brauchen, fragen Sie den Job aus einem Hintergrund-Worker ab, nie aus dem Request-Thread, und hören Sie nach einer festen Zahl von Versuchen auf:

// Runs in a background worker, never on the request thread.
public JsonNode awaitMailboxVerdict(String jobId, int maxAttempts)
        throws InterruptedException {
    for (int attempt = 0; attempt < maxAttempts; attempt++) {
        try {
            JsonNode job = client.job(jobId);
            String status = job.path("status").asText();
            if (status.equals("completed")) {
                return job.path("results").path(0); // the post-SMTP verdict
            }
            if (status.equals("canceled") || status.equals("failed")) {
                break;
            }
        } catch (IOException e) {
            // 429, 5xx or a timeout: try again on the next pass
        }
        // queued or processing: back off (5, 10, 20, 40, then 60 s), then ask again
        Thread.sleep(Math.min(60_000L, 5_000L << Math.min(attempt, 4)));
    }
    return null; // gave up: treat the address as unknown and re-check later
}

Die Zeile enthält dieselben Felder status und reason wie das Sofort-Ergebnis. Jede Abfrage ist ein API-Aufruf und zählt gegen dasselbe Rate-Limit pro Workspace wie /verify, also verlängern Sie die Abstände zwischen den Versuchen, statt in einem festen, kurzen Intervall abzufragen. Rufen Sie /verify nicht erneut auf, um ein ausstehendes Ergebnis zu aktualisieren; das startet eine neue Prüfung (und verbraucht einen weiteren Credit), statt diese abzuschließen.

Timeouts, Rate-Limits und Fail-open#

verify() wirft bei allem außer einem 2xx eine Exception. Das passt zu einem Batch-Job, nicht zu einem Anmeldeformular: Dort verzweigen Sie je nach Fehler, lassen den Kunden durch, wenn das Problem auf Seiten der API liegt, und verifizieren später erneut. Der Leitfaden zur serverlosen Anmeldung nutzt dasselbe Fail-open-Muster:

private final QualisendClient client = new QualisendClient();

private static final JsonNode UNKNOWN =
    new ObjectMapper().createObjectNode().put("status", "unknown");

public JsonNode verifyForSignup(String email) throws InterruptedException {
    try {
        JsonNode body = client.verify(email);
        JsonNode result = body.get("result");
        if ("pending".equals(result.path("smtp").asText())) {
            queueMailboxCheck(body.path("job_id").asText()); // a worker runs awaitMailboxVerdict
        }
        return result;
    } catch (QualisendClient.ApiException e) {
        if (e.status == 429) {
            recheckLater(email, e.retryAfter);     // rate limited: retry after Retry-After seconds
        } else if (e.status == 402) {
            alertOps("Qualisend: out of credits"); // insufficient_credits
            recheckLater(email, null);
        } else if (e.status >= 500) {
            recheckLater(email, null);             // an outage, not the customer's problem
        } else {
            alertOps("Qualisend rejected the request: " + e.status); // 400/401/403: fix the call or key
        }
    } catch (IOException e) {
        recheckLater(email, null);                 // HttpTimeoutException or a dropped connection
    }
    return UNKNOWN;
}

queueMailboxCheck, recheckLater und alertOps stehen für Ihre Job-Queue und Ihr Alerting. Fangen Sie ApiException zuerst ab: Sie ist eine IOException, genau wie HttpTimeoutException, sodass der letzte catch-Block Timeouts und abgebrochene Verbindungen abdeckt. Das Rate-Limit gilt pro Workspace, nicht pro Schlüssel, daher hebt ein zusätzlicher Schlüssel einen 429 nicht auf.

Die Schichten zusammensetzen, um eine E-Mail-Adresse in Java zu validieren#

Das Günstigste zuerst, aufhören, sobald Sie eine Antwort haben. Ein kleines Record hält das Urteil (Records gibt es ab Java 16; auf 11–15 verwenden Sie eine einfache Klasse):

// mailboxPending: act on the local verdict now; the worker reports the mailbox result later.
public record Verdict(String status, String reason, boolean mailboxPending) {}

public Verdict validate(String email) throws InterruptedException {
    if (!isValidSyntax(email)) {
        return new Verdict("undeliverable", "invalid_email", false);
    }
    String domain = email.substring(email.lastIndexOf('@') + 1);
    if (!hasMailRoute(domain)) {
        return new Verdict("undeliverable", "invalid_domain", false);
    }
    JsonNode result = verifyForSignup(email); // fails open to "unknown"
    return new Verdict(
        result.path("status").asText("unknown"),
        result.hasNonNull("reason") ? result.get("reason").asText() : null,
        "pending".equals(result.path("smtp").asText()));
}

Die beiden lokalen Schichten kosten nichts und fangen den meisten Müll sofort ab; die API läuft nur auf Adressen, die den Netzwerk-Roundtrip wert sind. Diese Reihenfolge ist der ganze Trick — dieselbe Form finden Sie auch in den Versionen dieses Leitfadens für Node.js, Python, PHP, Go und C#, denn es ist die Schichtung, nicht die Sprache, die Validierung funktionieren lässt.

Für eine ganze Liste schicken Sie /verify nicht in einer Schleife über eine CSV-Datei: Senden Sie sie an POST /verify/bulk (bis zu 1.000.000 Zeilen) oder laden Sie sie in der App hoch, wie es der Leitfaden zur Listenbereinigung beschreibt.

Häufig gestellte Fragen

01Reicht InternetAddress.validate() aus, um eine E-Mail in Java zu validieren?

Für die Syntax ist es das richtige Werkzeug der ersten Schicht: jakarta.mail.internet.InternetAddress mit validate() ist besser getestet als eine selbst geschriebene Regex und erspart Ihnen die Neuimplementierung von RFC 822. Aber es prüft nur die Form. Es löst niemals DNS auf und kontaktiert keinen Mailserver, und es ist nachsichtig genug, um punktlose Domains wie jane@localhost zu akzeptieren. Es parst auch die Form mit Anzeigenamen Jane <jane@example.com>, prüfen Sie also, ob getAddress() der Eingabe entspricht. Kombinieren Sie es dann mit einem MX-Lookup und einer SMTP-Postfachprüfung, bevor Sie der Adresse vertrauen.

02Welche Regex sollte ich in Java zur Validierung einer E-Mail-Adresse verwenden?

Eine kurze, nachsichtige Regex, die Sie einmal als static final Pattern kompilieren und mit matcher(email).matches() prüfen. matches() muss die gesamte Zeichenkette abdecken (find() akzeptiert einen Treffer irgendwo darin). Das Muster in diesem Leitfaden verlangt genau ein @, keine Leerzeichen, keine leeren Abschnitte zwischen Punkten und mindestens einen Punkt in der Domain. Begrenzen Sie die TLD-Länge nicht mit etwas wie {2,7}: Echte TLDs wie .photography sind länger. Eine Regex prüft nur die Form und kann Ihnen daher nicht sagen, ob die Domain oder das Postfach existiert; der Artikel Warum die E-Mail-Validierung per Regex scheitert erklärt die Grenzen.

03Wie prüfe ich MX-Einträge in Java ohne externe Bibliothek?

Verwenden Sie den in das JDK integrierten JNDI-DNS-Provider. Erstellen Sie einen InitialDirContext, bei dem java.naming.factory.initial auf com.sun.jndi.dns.DnsContextFactory gesetzt ist, rufen Sie dann getAttributes(domain, new String[] {"MX"}) auf und prüfen Sie das zurückgegebene MX-Attribut. Gibt es keinen MX-Eintrag, fragen Sie zusätzlich "A" und "AAAA" ab (einen Typ pro Aufruf), da Mail auf die eigenen Adresseinträge der Domain ausweichen kann. Behandeln Sie eine NameNotFoundException als Domain, die nicht existiert, lehnen Sie aber bei einem Timeout oder einer anderen NamingException nicht ab: Das ist ein Problem des Resolvers, keine fehlerhafte Adresse.

04Kann ich in Java ein Postfach ohne API verifizieren?

Teilweise. Jakarta Mail und JNDI bestätigen, dass die Adresse wohlgeformt ist und die Domain Mail annimmt - beides kostenlos und mit geringem Abhängigkeitsaufwand. Die Bestätigung des Postfachs selbst erfordert eine SMTP-Konversation, die Sie mit einem rohen Socket versuchen können, aber nicht von Ihrem Anwendungsserver aus ausführen sollten: Port 25 ist weithin blockiert und das Ergebnis hängt von der Reputation Ihrer Sende-IP ab. Genau diese letzte Schicht übernimmt ein Verifizierungsdienst.

05Sollte ich E-Mails bei der Anmeldung oder beim Bereinigen einer Liste validieren?

Beides, in unterschiedlicher Tiefe. Führen Sie die Syntax- und MX-Schichten bei der Anmeldung synchron aus - sie sind schnell genug, um die Anfrage zu blockieren und sofortiges Feedback zu geben - und handeln Sie auch dort nach dem Sofort-Urteil der API (undeliverable ablehnen, ein ausstehendes unknown durchlassen); das Postfach-Urteil überlassen Sie einem Hintergrund-Worker. Reservieren Sie tiefergehende Batch-Arbeit für die Listenbereinigung; der Leitfaden zur serverlosen Anmeldung zeigt das Echtzeit-Muster und der Leitfaden zur Listenbereinigung behandelt die Batch-Seite.


Bereit, die SMTP-Schicht hinzuzufügen? Lassen Sie eine beliebige Adresse durch den kostenlosen E-Mail-Checker laufen, um zuzusehen, wie eine syntaktisch perfekte Zeichenkette mit einem echten Urteil zurückkommt, oder lesen Sie die API-Referenz für den /verify-Endpunkt, das vollständige result-Envelope und Copy-Paste-Beispiele in jeder oben genannten Sprache.

Ihre Reputation, geschützt.

Bereinigen Sie Ihre erste Liste in wenigen Minuten. 100 kostenlose Credits, keine Kreditkarte nötig.

Loslegen