{"id":13345,"date":"2026-08-31T14:47:05","date_gmt":"2026-08-31T12:47:05","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/email-authentication-spf-dkim-dmarc-checker\/"},"modified":"2026-08-31T14:49:56","modified_gmt":"2026-08-31T12:49:56","slug":"email-authentication-spf-dkim-dmarc-checker","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/email-authentication-spf-dkim-dmarc-checker\/","title":{"rendered":"E-Mail-Authentifizierung pr\u00fcfen: SPF, DKIM, DMARC, MX und CAA"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Drei Eintr\u00e4ge entscheiden dar\u00fcber, ob jemand im Namen einer Domain Post verschicken kann. SPF und DKIM sagen, wer darf; erst DMARC sagt dem empfangenden Server, was zu tun ist, wenn beides nicht passt. Eine Domain kann alle drei tragen und trotzdem nichts abweisen &#8211; das ist der Normalfall, nicht die Ausnahme. Hier werden die Eintr\u00e4ge gelesen und benannt, welche davon Wirkung haben.<\/p>\n<div style=\"display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 12px; margin-bottom: 14px;\">\n<div>\n            <label for=\"ma-domain\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Domain<\/label><br \/>\n            <input id=\"ma-domain\" type=\"text\" value=\"example.com\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace;\">\n        <\/div>\n<div>\n            <label for=\"ma-selektoren\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Weitere DKIM-Selektoren, freiwillig<\/label><br \/>\n            <input id=\"ma-selektoren\" type=\"text\" value=\"\" placeholder=\"s1 s2\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace;\">\n        <\/div>\n<\/p><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">Abgefragt wird ausschlie\u00dflich DNS; von der eingegebenen Domain wird nichts abgerufen und keine Nachricht verschickt. Die Abfrage ist \u00fcber reCAPTCHA v3 gesch\u00fctzt, und die aufrufende IP-Adresse wird zusammen mit der Domain eine Stunde lang gespeichert, um die H\u00e4ufigkeit zu begrenzen &#8211; zwanzig Abfragen je Adresse und Stunde. Weiteres wird nicht aufbewahrt.<\/p>\n<p>    <button id=\"ma-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Domain pr\u00fcfen<\/button><\/p>\n<div id=\"ma-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Drei Eintr\u00e4ge entscheiden dar\u00fcber, ob jemand im Namen einer Domain Post verschicken kann. SPF und DKIM sagen, wer darf; erst DMARC sagt dem empfangenden Server, was zu tun ist, wenn beides nicht passt. Eine Domain kann alle drei tragen und trotzdem nichts abweisen - das ist der Normalfall, nicht die Ausnahme. Hier werden die Eintr\u00e4ge gelesen und benannt, welche davon Wirkung haben.\",\"label_domain\":\"Domain\",\"label_selektoren\":\"Weitere DKIM-Selektoren, freiwillig\",\"datenschutz\":\"Abgefragt wird ausschlie\u00dflich DNS; von der eingegebenen Domain wird nichts abgerufen und keine Nachricht verschickt. Die Abfrage ist \u00fcber reCAPTCHA v3 gesch\u00fctzt, und die aufrufende IP-Adresse wird zusammen mit der Domain eine Stunde lang gespeichert, um die H\u00e4ufigkeit zu begrenzen - zwanzig Abfragen je Adresse und Stunde. Weiteres wird nicht aufbewahrt.\",\"knopf\":\"Domain pr\u00fcfen\",\"laeuft\":\"Die DNS-Eintr\u00e4ge werden gelesen...\",\"fehler_kein_token\":\"Die Pr\u00fcfung lie\u00df sich nicht starten, weil reCAPTCHA nicht geladen wurde. Meist liegt das an einem Blocker oder einer strengen Datenschutzeinstellung.\",\"fehler_captcha\":\"reCAPTCHA hat die Anfrage als automatisiert eingestuft. Ein Neuladen der Seite hilft in der Regel.\",\"fehler_zu_viele\":\"Die Grenze von {limit} Abfragen je Stunde ist f\u00fcr diese Adresse erreicht. Sie l\u00e4uft von allein wieder ab.\",\"fehler_domain\":\"Das ist kein brauchbarer Domainname.\",\"fehler_zaehler\":\"Der Z\u00e4hler ist nicht erreichbar, deshalb wurde die Abfrage nicht ausgef\u00fchrt. Ohne ihn wird nicht bedient.\",\"fehler_pruefdienst\":\"Der reCAPTCHA-Dienst war nicht erreichbar.\",\"fehler_aufbau\":\"Der Dienst ist nicht richtig eingerichtet. Der Fehler liegt auf dieser Seite.\",\"fehler_eingabe\":\"Die Anfrage lie\u00df sich nicht lesen.\",\"fehler_methode\":\"Falsche Anfragemethode.\",\"fehler_netz\":\"Der Dienst war nicht erreichbar.\",\"fehler_antwort\":\"Die Antwort lie\u00df sich nicht lesen.\",\"fehler_unbekannt\":\"Es ging etwas schief, wof\u00fcr es keine eigene Meldung gibt.\",\"grund_leer\":\"Es wurde nichts eingegeben.\",\"grund_zu_lang\":\"Der Name ist l\u00e4nger, als ein Domainname sein darf.\",\"grund_ip_adresse\":\"Das ist eine IP-Adresse, keine Domain.\",\"grund_kein_punkt\":\"Ein Domainname braucht mindestens einen Punkt.\",\"grund_form\":\"Erlaubt sind Buchstaben, Ziffern und Bindestriche, getrennt durch Punkte.\",\"h_uebersicht\":\"\u00dcberblick\",\"zeile_domain\":\"Domain\",\"ampel_gut\":\"wirksam\",\"ampel_teilweise\":\"vorhanden, ohne Wirkung\",\"ampel_fehlt\":\"fehlt\",\"urteil_geschlossen\":\"Alle drei Eintr\u00e4ge sind gesetzt und wirksam.\",\"urteil_halb\":\"Die Eintr\u00e4ge sind da, aber mindestens einer davon setzt nichts durch.\",\"urteil_offen\":\"Eine Nachricht im Namen dieser Domain kommt ungehindert durch.\",\"h_spf\":\"SPF: wer senden darf\",\"spf_keiner\":\"Kein SPF-Eintrag. Jeder Server darf behaupten, f\u00fcr diese Domain zu senden, und die Gegenseite hat keine Liste zum Abgleichen.\",\"zeile_all\":\"Abschlussregel\",\"zeile_lookups\":\"Verbrauchte DNS-Abfragen\",\"zeile_kette\":\"Kette\",\"all_-\":\"-all, harte Ablehnung\",\"all_~\":\"~all, weiche Ablehnung\",\"all_?\":\"?all, neutral\",\"all_+\":\"+all, alles kommt durch\",\"h_dkim\":\"DKIM: die Unterschrift\",\"dkim_keiner\":\"Unter den bekannten Selektoren wurde kein Schl\u00fcssel gefunden. Das beweist nicht, dass keiner existiert - ein Selektor l\u00e4sst sich nicht auflisten, nur erraten. Nennt der Versanddienst einen, geh\u00f6rt er in das Feld oben.\",\"spalte_selektor\":\"Selektor\",\"spalte_typ\":\"Typ\",\"spalte_bits\":\"Bit\",\"dkim_widerrufen\":\"widerrufen\",\"h_dmarc\":\"DMARC: was die Gegenseite tun soll\",\"dmarc_keiner\":\"Kein DMARC-Eintrag. SPF und DKIM sagen dann, wer senden darf, und niemand sagt, was geschieht, wenn beides nicht passt.\",\"zeile_politik\":\"Politik\",\"zeile_pct\":\"Gilt f\u00fcr\",\"zeile_rua\":\"Berichte an\",\"zeile_ausrichtung\":\"Ausrichtung\",\"p_none\":\"none - nur zusehen\",\"p_quarantine\":\"quarantine - in den Spam-Ordner\",\"p_reject\":\"reject - abgewiesen\",\"h_umfeld\":\"Drumherum\",\"zeile_mx\":\"MX\",\"zeile_caa\":\"CAA\",\"zeile_bimi\":\"BIMI\",\"zeile_dauer\":\"Abfrage dauerte\",\"wert_keiner\":\"keiner\",\"h_befunde\":\"Befunde\",\"befund_mx_fehlt\":\"Kein MX-Eintrag. Die Domain empf\u00e4ngt keine Post - bei einer reinen Versanddomain in Ordnung, \u00fcberall sonst ein Fehler.\",\"befund_mx_einzeln\":\"Nur ein MX-Host. Ist der nicht erreichbar, staut der Absender die Nachricht und gibt irgendwann auf; ein zweiter Host mit h\u00f6herer Zahl kostet im Normalbetrieb nichts.\",\"befund_spf_fehlt\":\"\u00dcberhaupt kein SPF-Eintrag.\",\"befund_spf_mehrfach\":\"Mehr als ein SPF-Eintrag. Das ist laut Festlegung ein dauerhafter Fehler - die Gegenseite sucht sich keinen aus, sie h\u00f6rt auf zu pr\u00fcfen.\",\"befund_spf_lookups_ueber\":\"Mehr als {limit} DNS-Abfragen. Die Festlegung erlaubt genau so viele; dar\u00fcber endet die Pr\u00fcfung im permerror, und alles, was der Eintrag erlaubt h\u00e4tte, ist wertlos. Meist ist es eine include-Kette zu viel.\",\"befund_spf_lookups_knapp\":\"Dicht an der Grenze von {limit} Abfragen. Ein weiterer Dienstleister im Eintrag, und er kippt - und er sieht dabei weiterhin richtig aus.\",\"befund_spf_schleife\":\"Eine include-Kette verweist auf sich selbst zur\u00fcck.\",\"befund_spf_ohne_all\":\"Keine Abschlussregel. Ohne sie endet der Eintrag neutral, und das h\u00e4lt nichts auf.\",\"befund_spf_plus_all\":\"+all l\u00e4sst jeden Server durch. Das entspricht keinem Eintrag, nur schwerer zu bemerken.\",\"befund_spf_neutral\":\"?all ist neutral: der Eintrag benennt Absender und erkl\u00e4rt dann trotzdem alles f\u00fcr annehmbar.\",\"befund_spf_softfail\":\"~all ist eine weiche Ablehnung. Die Gegenseite nimmt die Nachricht an und kennzeichnet sie. Erst -all bittet um Abweisung - und erst DMARC macht daraus etwas Verbindliches.\",\"befund_spf_ptr\":\"Der Eintrag benutzt ptr. Dieser Mechanismus gilt als \u00fcberholt; mehrere gro\u00dfe Empf\u00e4nger \u00fcbergehen ihn ganz.\",\"befund_dmarc_fehlt\":\"Kein DMARC-Eintrag. Nichts sagt einer Gegenseite, was mit einer Nachricht geschehen soll, die an SPF und DKIM scheitert.\",\"befund_dmarc_mehrfach\":\"Mehr als ein DMARC-Eintrag. Wie bei SPF ist das ein Fehler und keine Auswahl.\",\"befund_dmarc_none\":\"p=none hei\u00dft: nur Berichte. Nichts wird aussortiert, nichts abgewiesen. Das ist die vorgesehene Anfangsstellung - und die Stellung, die die meisten Domains nie verlassen.\",\"befund_dmarc_quarantine\":\"p=quarantine schickt scheiternde Nachrichten in den Spam-Ordner, statt sie abzuweisen.\",\"befund_dmarc_reject\":\"p=reject weist scheiternde Nachrichten ab. Das ist die durchsetzende Einstellung.\",\"befund_dmarc_ohne_rua\":\"Keine rua-Adresse. Ohne Berichte l\u00e4sst sich nicht sehen, wer in diesem Namen sendet, und nicht beurteilen, ob eine sch\u00e4rfere Politik etwas kaputtmachen w\u00fcrde.\",\"befund_dmarc_pct\":\"Die Politik gilt nur f\u00fcr einen Teil der Post. Der Rest wird wie p=none behandelt.\",\"befund_dmarc_fehlerhaft\":\"Der DMARC-Eintrag hat einen formalen Fehler. Gegenstellen, die ihn streng lesen, \u00fcbergehen den ganzen Eintrag.\",\"befund_dkim_widerrufen\":\"Ein Schl\u00fcssel mit leerem p= ist widerrufen. Er bleibt als Merkzeichen in der Zone; damit erzeugte Unterschriften gehen nicht mehr auf.\",\"befund_dkim_zu_kurz\":\"Ein RSA-Schl\u00fcssel unter 1024 Bit. Mehrere Gegenstellen behandeln eine solche Unterschrift wie gar keine.\",\"befund_dkim_1024\":\"Ein RSA-Schl\u00fcssel mit 1024 Bit. Wird noch angenommen, liegt aber unter dem, was heute empfohlen wird; \u00fcblich sind 2048.\",\"befund_dkim_keiner_gefunden\":\"Unter den bekannten Selektoren wurde kein Schl\u00fcssel gefunden. Selektoren lassen sich nicht auflisten, das ist also kein Beweis, dass keiner existiert.\",\"befund_caa_fehlt\":\"Kein CAA-Eintrag. Jede Zertifizierungsstelle darf f\u00fcr diese Domain ausstellen. Keine E-Mail-Sache, aber dieselbe Zone.\",\"befund_bimi_ohne_durchsetzung\":\"Es gibt einen BIMI-Eintrag, aber DMARC setzt nichts durch. BIMI verlangt quarantine oder reject, das Logo wird also nicht gezeigt.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-mailauth.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var SPF_LIMIT = 10;<\/p>\n<p>    \/\/ =========================================================================\n    \/\/ Bewertung - reine Funktion ueber der Antwort des Endpunkts\n    \/\/ =========================================================================\n    \/\/\n    \/\/ Der Abruf steckt bewusst daneben und nicht hier drin: nur so laesst sich\n    \/\/ die Darstellung gegen erfundene Antworten pruefen, ohne dass ein Lauf\n    \/\/ vom Netz und vom Zustand fremder Zonen abhaengt.<\/p>\n<p>    function zahlOderNull(w) {\n        return (typeof w === 'number' && isFinite(w)) ? w : null;\n    }<\/p>\n<p>    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) {\n            return { fehler: a.fehler, grund: a.grund || null, limit: zahlOderNull(a.limit) };\n        }<\/p>\n<p>        var spf = a.spf || {};\n        var dmarc = (a.dmarc && a.dmarc.zerlegt) ? a.dmarc.zerlegt : { gefunden: false, kennwerte: {} };\n        var dkim = Array.isArray(a.dkim) ? a.dkim : [];\n        var befunde = Array.isArray(a.befunde) ? a.befunde : [];<\/p>\n<p>        var lookups = zahlOderNull(spf.lookups);\n        var p = (dmarc.kennwerte && dmarc.kennwerte.p) ? String(dmarc.kennwerte.p).toLowerCase() : null;<\/p>\n<p>        \/\/ Eine Ampel je Baustein. \"teilweise\" heisst: vorhanden, aber ohne\n        \/\/ Wirkung - der haeufigste Zustand und der, der am meisten taeuscht.\n        function ampelSpf() {\n            if (!spf.satz) { return 'fehlt'; }\n            if (lookups !== null && lookups > SPF_LIMIT) { return 'fehlt'; }\n            if (spf.all === '-') { return 'gut'; }\n            if (spf.all === '~' || spf.all === '?') { return 'teilweise'; }\n            if (spf.all === '+') { return 'fehlt'; }\n            return 'teilweise';\n        }\n        function ampelDmarc() {\n            if (!dmarc.gefunden) { return 'fehlt'; }\n            if (p === 'reject') { return 'gut'; }\n            if (p === 'quarantine') { return 'teilweise'; }\n            return 'teilweise';\n        }\n        function ampelDkim() {\n            if (!dkim.length) { return 'fehlt'; }\n            var schwach = dkim.filter(function (k) {\n                return k.widerrufen || (k.typ === 'rsa' && zahlOderNull(k.bits) !== null && k.bits < 2048);\n            });\n            return schwach.length === dkim.length ? 'teilweise' : 'gut';\n        }\n\n        var ampeln = { spf: ampelSpf(), dkim: ampelDkim(), dmarc: ampelDmarc() };\n        var gut = 0;\n        ['spf', 'dkim', 'dmarc'].forEach(function (k) { if (ampeln[k] === 'gut') { gut++; } });\n\n        var urteil;\n        if (ampeln.dmarc === 'fehlt' || ampeln.spf === 'fehlt') { urteil = 'offen'; }\n        else if (gut === 3) { urteil = 'geschlossen'; }\n        else { urteil = 'halb'; }\n\n        return {\n            fehler: null,\n            domain: a.domain || '',\n            ampeln: ampeln,\n            urteil: urteil,\n            spf: {\n                satz: spf.satz || null,\n                all: spf.all || null,\n                lookups: lookups,\n                limit: SPF_LIMIT,\n                kette: Array.isArray(spf.kette) ? spf.kette : [],\n                mehrfach: !!spf.mehrfach\n            },\n            dmarc: {\n                satz: (a.dmarc &#038;&#038; a.dmarc.satz) ? a.dmarc.satz : null,\n                p: p,\n                sp: (dmarc.kennwerte &#038;&#038; dmarc.kennwerte.sp) ? dmarc.kennwerte.sp : null,\n                pct: (dmarc.kennwerte &#038;&#038; dmarc.kennwerte.pct) ? dmarc.kennwerte.pct : '100',\n                rua: (dmarc.kennwerte &#038;&#038; dmarc.kennwerte.rua) ? dmarc.kennwerte.rua : null,\n                adkim: (dmarc.kennwerte &#038;&#038; dmarc.kennwerte.adkim) ? dmarc.kennwerte.adkim : 'r',\n                aspf: (dmarc.kennwerte &#038;&#038; dmarc.kennwerte.aspf) ? dmarc.kennwerte.aspf : 'r'\n            },\n            dkim: dkim,\n            mx: Array.isArray(a.mx) ? a.mx : [],\n            caa: Array.isArray(a.caa) ? a.caa : [],\n            bimi: a.bimi || null,\n            dauer: zahlOderNull(a.dauer_ms),\n            rest: zahlOderNull(a.limit_rest),\n            befunde: befunde\n        };\n    }\n\n    \/\/ =========================================================================\n    \/\/ Abruf - der einzige Teil, der ans Netz geht\n    \/\/ =========================================================================\n\n    \/** Laedt api.js. Sagt nur, ob das Skript da ist - nicht, ob es bereit ist. *\/\n    function skriptLaden() {\n        return new Promise(function (aufloesen) {\n            if (window.grecaptcha) { aufloesen(true); return; }\n            var s = document.createElement('script');\n            s.src = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + SITEKEY;\n            s.onload = function () { aufloesen(true); };\n            s.onerror = function () { aufloesen(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { aufloesen(!!window.grecaptcha); }, 8000);\n        });\n    }\n\n    \/**\n     * Holt ein Token.\n     *\n     * Auf grecaptcha.ready() zu warten ist nicht optional: onload des Skripts\n     * feuert, bevor grecaptcha.execute ueberhaupt definiert ist. Wer direkt\n     * nach onload auf execute prueft, findet nichts und gibt null zurueck,\n     * obwohl reCAPTCHA einwandfrei laeuft.\n     *\/\n    function tokenHolen() {\n        return skriptLaden().then(function (da) {\n            if (!da || !window.grecaptcha || !window.grecaptcha.ready) { return null; }\n            return new Promise(function (aufloesen) {\n                var fertig = false;\n                function einmal(wert) {\n                    if (fertig) { return; }\n                    fertig = true;\n                    aufloesen(wert);\n                }\n                setTimeout(function () { einmal(null); }, 12000);\n                try {\n                    window.grecaptcha.ready(function () {\n                        if (fertig) { return; }\n                        if (!window.grecaptcha.execute) { einmal(null); return; }\n                        window.grecaptcha.execute(SITEKEY, { action: 'mailauth' })\n                            .then(function (t) { einmal(t || null); }, function () { einmal(null); });\n                    });\n                } catch (e) { einmal(null); }\n            });\n        }, function () { return null; });\n    }\n\n    function abfragen(domain, selektoren) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, {\n                method: 'POST',\n                headers: { 'Content-Type': 'application\/json' },\n                body: JSON.stringify({ domain: domain, selektoren: selektoren, token: token || '' })\n            }).then(function (r) {\n                return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; });\n            }, function () { return { fehler: 'netz' }; });\n        });\n    }\n\n    \/\/ --- Pruefpunkt ----------------------------------------------------------\n    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.MA = {\n        bewerten: bewerten,\n        darstellen: null,      \/\/ wird unten gesetzt\n        SPF_LIMIT: SPF_LIMIT,\n        ENDPUNKT: ENDPUNKT,\n        T: T\n    };\n\n    \/\/ =========================================================================\n    \/\/ Oberflaeche\n    \/\/ =========================================================================\n\n    var btn = document.getElementById('ma-btn');\n    var out = document.getElementById('ma-ausgabe');\n    if (!btn || !out) { return; }\n\n    function el(tag, stil, text) {\n        var e = document.createElement(tag);\n        if (stil) { e.setAttribute('style', stil); }\n        if (text !== undefined) { e.textContent = text; }\n        return e;\n    }\n    function wert(id) { var e = document.getElementById(id); return e ? e.value : ''; }\n\n    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.92rem; margin: 18px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var VORFORM = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 10px; color: var(--text-primary, #e8e8ee); font-family: monospace; font-size: 0.78rem; white-space: pre-wrap; word-break: break-all; margin: 0;';\n    var GUT = ' color: #7ee787;';\n    var WARN = ' color: #ffa94d;';\n    var GRAU = ' color: #8a8a99;';\n\n    function farbe(ampel) {\n        if (ampel === 'gut') { return GUT; }\n        if (ampel === 'teilweise') { return WARN; }\n        return WARN;\n    }\n    function gitter(spalten) {\n        return el('div', 'display: grid; grid-template-columns: ' + spalten + '; gap: 0 18px; align-items: baseline;');\n    }\n    function paar(g, name, w, stil) {\n        g.appendChild(el('div', ZELLE, name));\n        g.appendChild(el('div', ZELLE_WERT + (stil || ''), w));\n    }\n    function kopf(g, spalten) {\n        spalten.forEach(function (s) {\n            g.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee);', s));\n        });\n    }\n\n    \/** Zeichnet einen bewerteten Befund. Bekommt nur Daten, ruft nichts ab. *\/\n    function darstellen(b, ziel) {\n        ziel.innerHTML = '';\n        if (b.fehler) {\n            var text = T['fehler_' + b.fehler] || T.fehler_unbekannt;\n            if (b.fehler === 'domain' &#038;&#038; b.grund &#038;&#038; T['grund_' + b.grund]) {\n                text = text + ' ' + T['grund_' + b.grund];\n            }\n            if (b.fehler === 'zu_viele' &#038;&#038; b.limit !== null) {\n                text = text.replace('{limit}', String(b.limit));\n            }\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', text));\n            return;\n        }\n\n        \/\/ --- Ampeln ---\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_uebersicht));\n        var g = gitter('auto auto');\n        paar(g, T.zeile_domain, b.domain);\n        paar(g, 'SPF', T['ampel_' + b.ampeln.spf], farbe(b.ampeln.spf));\n        paar(g, 'DKIM', T['ampel_' + b.ampeln.dkim], farbe(b.ampeln.dkim));\n        paar(g, 'DMARC', T['ampel_' + b.ampeln.dmarc], farbe(b.ampeln.dmarc));\n        ziel.appendChild(g);\n        ziel.appendChild(el('div', 'margin: 10px 0 0; font-size: 0.9rem; font-weight: 700;'\n            + (b.urteil === 'geschlossen' ? GUT : WARN), T['urteil_' + b.urteil]));\n\n        \/\/ --- SPF ---\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_spf));\n        if (!b.spf.satz) {\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', T.spf_keiner));\n        } else {\n            ziel.appendChild(el('pre', VORFORM, b.spf.satz));\n            var gs = gitter('auto auto');\n            paar(gs, T.zeile_all, b.spf.all ? (T['all_' + b.spf.all] || b.spf.all) : T.wert_keiner,\n                b.spf.all === '-' ? GUT : WARN);\n            paar(gs, T.zeile_lookups,\n                (b.spf.lookups === null ? '-' : b.spf.lookups) + ' \/ ' + b.spf.limit,\n                (b.spf.lookups !== null &#038;&#038; b.spf.lookups > b.spf.limit) ? WARN\n                    : ((b.spf.lookups !== null && b.spf.lookups >= 9) ? WARN : GUT));\n            if (b.spf.kette.length) { paar(gs, T.zeile_kette, b.spf.kette.join(' \u2192 '), GRAU); }\n            ziel.appendChild(gs);\n        }<\/p>\n<p>        \/\/ --- DKIM ---\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_dkim));\n        if (!b.dkim.length) {\n            ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.dkim_keiner));\n        } else {\n            var gd = gitter('auto auto auto');\n            kopf(gd, [T.spalte_selektor, T.spalte_typ, T.spalte_bits]);\n            b.dkim.forEach(function (k) {\n                gd.appendChild(el('div', ZELLE_WERT, k.selektor));\n                gd.appendChild(el('div', ZELLE_WERT, k.typ || '-'));\n                var schwach = k.widerrufen || (k.typ === 'rsa' && typeof k.bits === 'number' && k.bits < 2048);\n                gd.appendChild(el('div', ZELLE_WERT + (schwach ? WARN : GUT),\n                    k.widerrufen ? T.dkim_widerrufen : (k.bits ? String(k.bits) : '-')));\n            });\n            ziel.appendChild(gd);\n        }\n\n        \/\/ --- DMARC ---\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_dmarc));\n        if (!b.dmarc.satz) {\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', T.dmarc_keiner));\n        } else {\n            ziel.appendChild(el('pre', VORFORM, b.dmarc.satz));\n            var gm = gitter('auto auto');\n            paar(gm, T.zeile_politik, b.dmarc.p ? (T['p_' + b.dmarc.p] || b.dmarc.p) : T.wert_keiner,\n                b.dmarc.p === 'reject' ? GUT : WARN);\n            paar(gm, T.zeile_pct, b.dmarc.pct + ' %', b.dmarc.pct !== '100' ? WARN : '');\n            paar(gm, T.zeile_rua, b.dmarc.rua || T.wert_keiner, b.dmarc.rua ? '' : WARN);\n            paar(gm, T.zeile_ausrichtung,\n                'adkim=' + b.dmarc.adkim + '  aspf=' + b.dmarc.aspf, GRAU);\n            ziel.appendChild(gm);\n        }\n\n        \/\/ --- Umfeld ---\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_umfeld));\n        var gu = gitter('auto auto');\n        paar(gu, T.zeile_mx, b.mx.length ? b.mx.join(', ') : T.wert_keiner, b.mx.length ? '' : WARN);\n        paar(gu, T.zeile_caa, b.caa.length ? b.caa.join(' | ') : T.wert_keiner, b.caa.length ? '' : GRAU);\n        paar(gu, T.zeile_bimi, b.bimi || T.wert_keiner, GRAU);\n        if (b.dauer !== null) { paar(gu, T.zeile_dauer, b.dauer + ' ms', GRAU); }\n        ziel.appendChild(gu);\n\n        \/\/ --- Befunde ---\n        if (b.befunde.length) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n            var liste = el('ul', 'margin: 0 0 0 18px; padding: 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem; line-height: 1.65;');\n            b.befunde.forEach(function (f) {\n                var text = T['befund_' + f];\n                if (text) { liste.appendChild(el('li', '', text.replace('{limit}', String(b.spf.limit)))); }\n            });\n            ziel.appendChild(liste);\n        }\n    }\n    window.LW_TEST.MA.darstellen = darstellen;\n\n    var laeuft = false;\n    btn.addEventListener('click', function () {\n        if (laeuft) { return; }\n        laeuft = true;\n        btn.disabled = true;\n        out.innerHTML = '';\n        out.appendChild(el('p', ZELLE + GRAU + ' margin: 0;', T.laeuft));\n        abfragen(wert('ma-domain'), wert('ma-selektoren')).then(function (antwort) {\n            darstellen(bewerten(antwort), out);\n            laeuft = false;\n            btn.disabled = false;\n        }, function () {\n            darstellen(bewerten({ fehler: 'netz' }), out);\n            laeuft = false;\n            btn.disabled = false;\n        });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Liest das DNS einer Domain und sagt, was mit einer gef\u00e4lschten Nachricht tats\u00e4chlich geschieht: wie viele der zehn erlaubten SPF-Abfragen verbraucht sind, ob die DKIM-Schl\u00fcssel lang genug sind, und ob DMARC jemandem etwas auftr\u00e4gt oder blo\u00df zusieht.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9283,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92265,92214,92071],"class_list":["post-13345","page","type-page","status-publish","hentry","tag-prywatnosc-danych-pl-de","tag-devops-de","tag-web-security-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>E-Mail-Authentifizierung pr\u00fcfen: SPF, DKIM, DMARC, MX und CAA - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/email-authentication-spf-dkim-dmarc-checker\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"E-Mail-Authentifizierung pr\u00fcfen: SPF, DKIM, DMARC, MX und CAA - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Liest das DNS einer Domain und sagt, was mit einer gef\u00e4lschten Nachricht tats\u00e4chlich geschieht: wie viele der zehn erlaubten SPF-Abfragen verbraucht sind, ob die DKIM-Schl\u00fcssel lang genug sind, und ob DMARC jemandem etwas auftr\u00e4gt oder blo\u00df zusieht.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/email-authentication-spf-dkim-dmarc-checker\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-31T12:49:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/email-authentication-spf-dkim-dmarc-checker\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/email-authentication-spf-dkim-dmarc-checker\\\/\",\"name\":\"E-Mail-Authentifizierung pr\u00fcfen: SPF, DKIM, DMARC, MX und CAA - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-31T12:47:05+00:00\",\"dateModified\":\"2026-08-31T12:49:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/email-authentication-spf-dkim-dmarc-checker\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/email-authentication-spf-dkim-dmarc-checker\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/email-authentication-spf-dkim-dmarc-checker\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-2\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"E-Mail-Authentifizierung pr\u00fcfen: SPF, DKIM, DMARC, MX und CAA\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"E-Mail-Authentifizierung pr\u00fcfen: SPF, DKIM, DMARC, MX und CAA - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/email-authentication-spf-dkim-dmarc-checker\/","og_locale":"en_US","og_type":"article","og_title":"E-Mail-Authentifizierung pr\u00fcfen: SPF, DKIM, DMARC, MX und CAA - Lukas Wojcik - Blog","og_description":"Liest das DNS einer Domain und sagt, was mit einer gef\u00e4lschten Nachricht tats\u00e4chlich geschieht: wie viele der zehn erlaubten SPF-Abfragen verbraucht sind, ob die DKIM-Schl\u00fcssel lang genug sind, und ob DMARC jemandem etwas auftr\u00e4gt oder blo\u00df zusieht.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/email-authentication-spf-dkim-dmarc-checker\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-08-31T12:49:56+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/email-authentication-spf-dkim-dmarc-checker\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/email-authentication-spf-dkim-dmarc-checker\/","name":"E-Mail-Authentifizierung pr\u00fcfen: SPF, DKIM, DMARC, MX und CAA - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-31T12:47:05+00:00","dateModified":"2026-08-31T12:49:56+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/email-authentication-spf-dkim-dmarc-checker\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/email-authentication-spf-dkim-dmarc-checker\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/email-authentication-spf-dkim-dmarc-checker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-2\/"},{"@type":"ListItem","position":3,"name":"E-Mail-Authentifizierung pr\u00fcfen: SPF, DKIM, DMARC, MX und CAA"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/13345","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13345"}],"version-history":[{"count":1,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/13345\/revisions"}],"predecessor-version":[{"id":13374,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/13345\/revisions\/13374"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9283"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13345"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}