File: //proc/self/root/tmp/ezdns_live__dkim-checker.html
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>DKIM Checker: Selector, DNS-Record und Mail-Signatur prüfen | ezdns.support</title>
<meta name="description" content="Kostenloser DKIM Checker für Domains: fehlende DKIM-Selector, Microsoft 365 oder Google Workspace DKIM prüfen und direkt fixen." />
<link rel="canonical" href="https://ezdns.support/dkim-checker" />
<meta name="robots" content="index, follow" />
<meta name="theme-color" content="#020617" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="ezdns.support" />
<meta property="og:title" content="DKIM Checker: Selector, DNS-Record und Mail-Signatur prüfen | ezdns.support" />
<meta property="og:description" content="Kostenloser DKIM Checker für Domains: fehlende DKIM-Selector, Microsoft 365 oder Google Workspace DKIM prüfen und direkt fixen." />
<meta property="og:url" content="https://ezdns.support/dkim-checker" />
<link rel="icon" href="/app/logo.svg" type="image/svg+xml" />
<link rel="preconnect" href="https://rsms.me/" />
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
<style>
:root{font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:#e2e8f0;background:#020617}
*{box-sizing:border-box}body{margin:0;background:radial-gradient(circle at 80% 0%,rgba(14,165,233,.18),transparent 34%),radial-gradient(circle at 16% 18%,rgba(16,185,129,.12),transparent 30%),#020617;color:#e2e8f0}a{color:inherit}.wrap{max-width:1140px;margin:0 auto;padding:24px}.top{display:flex;justify-content:space-between;gap:18px;align-items:center}.brand{display:flex;align-items:center;gap:10px;text-decoration:none;font-weight:850}.brand img{width:34px;height:34px}.nav{display:flex;gap:10px;flex-wrap:wrap}.nav a{font-size:14px;color:#bfdbfe;text-decoration:none;border:1px solid rgba(148,163,184,.22);border-radius:10px;padding:9px 12px;background:rgba(15,23,42,.58)}
.hero{margin-top:26px;display:grid;grid-template-columns:minmax(0,1.05fr) minmax(320px,.95fr);gap:20px}.panel{border:1px solid rgba(56,189,248,.22);border-radius:18px;background:linear-gradient(135deg,rgba(15,23,42,.96),rgba(2,6,23,.92));box-shadow:0 28px 80px rgba(0,0,0,.35),inset 0 1px 0 rgba(255,255,255,.05)}.copy{padding:28px}.kicker{color:#67e8f9;font-size:13px;font-weight:850;text-transform:uppercase;letter-spacing:.08em}.copy h1{margin:10px 0 0;font-size:clamp(2.25rem,5.7vw,4.75rem);line-height:1.04;letter-spacing:0;color:#fff;max-width:13ch}.copy p{color:#cbd5e1;line-height:1.7;font-size:1.04rem;max-width:58rem}.proof{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-top:18px}.proof div{border:1px solid rgba(148,163,184,.2);border-radius:12px;background:rgba(2,6,23,.56);padding:12px}.proof strong{display:block;color:#fff}.proof span{display:block;margin-top:4px;color:#94a3b8;font-size:13px}
.scanBox{padding:22px;display:grid;gap:14px}.scanBox h2{margin:0;color:#fff}.scanForm{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px}.scanForm input{width:100%;border:1px solid rgba(191,219,254,.8);border-radius:11px;background:#fff;color:#0f172a;padding:13px 14px;font-size:16px}.btn,.scanForm button,.quoteForm button{display:inline-flex;justify-content:center;align-items:center;min-height:44px;padding:12px 16px;border-radius:11px;text-decoration:none;font-weight:850;border:1px solid rgba(148,163,184,.24);cursor:pointer}.scanForm button,.btn.primary,.quoteForm button{background:#16a34a;color:#fff;border-color:#16a34a}.btn.blue{background:#2563eb;color:#fff;border-color:#2563eb}.btn.dark{background:rgba(15,23,42,.78);color:#dbeafe}.btn:disabled,.scanForm button:disabled{opacity:.62;cursor:wait}.result{border:1px solid rgba(148,163,184,.2);border-radius:14px;background:rgba(2,6,23,.58);padding:14px;min-height:150px}.result h3{margin:0;color:#fff}.status{color:#93c5fd}.findings{display:grid;gap:8px;margin-top:12px}.finding{border:1px solid rgba(148,163,184,.18);border-radius:11px;padding:10px;background:#020617}.finding strong{display:block;color:#fff}.finding span{display:block;color:#94a3b8;font-size:13px;margin-top:3px}.actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}
.grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin-top:20px}.card{padding:20px;border:1px solid rgba(148,163,184,.24);border-radius:16px;background:rgba(15,23,42,.84)}.card h2{margin:0;color:#fff}.card p{color:#cbd5e1;line-height:1.62}.list{display:grid;gap:9px;margin:14px 0 0;padding:0;list-style:none}.list li{display:flex;gap:9px;color:#dbeafe}.list li:before{content:"";width:8px;height:8px;margin-top:8px;border-radius:999px;background:#34d399;box-shadow:0 0 0 4px rgba(52,211,153,.12);flex:0 0 auto}
.quote{margin-top:20px;padding:22px;display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr);gap:16px}.quote h2{margin:0;color:#fff;font-size:30px}.quote p{color:#cbd5e1;line-height:1.65}.quoteForm{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.quoteForm label{display:grid;gap:6px;color:#cbd5e1;font-weight:760;font-size:14px}.quoteForm input,.quoteForm textarea,.quoteForm select{width:100%;border:1px solid rgba(148,163,184,.3);border-radius:11px;background:rgba(2,6,23,.78);color:#f8fafc;padding:12px;line-height:1.35}.wide{grid-column:1/-1}.quoteStatus{grid-column:1/-1;color:#93c5fd;min-height:22px;margin:0}.footer{margin:38px 0 10px;text-align:center;color:#94a3b8;font-size:14px}.footer a{color:#60a5fa;text-decoration:none;margin:0 8px}
@media(max-width:900px){.hero,.grid,.quote{grid-template-columns:1fr}.proof{grid-template-columns:1fr}.wrap{padding:16px}}@media(max-width:560px){.top{align-items:flex-start;flex-direction:column}.nav{width:100%}.nav a{flex:1;text-align:center}.copy,.scanBox,.card,.quote{padding:16px}.copy h1{font-size:2.35rem}.scanForm{grid-template-columns:1fr}.actions .btn{width:100%}.quoteForm{grid-template-columns:1fr}}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebApplication",
"name": "Kostenloser DKIM Checker",
"url": "https://ezdns.support/dkim-checker",
"applicationCategory": "SecurityApplication",
"operatingSystem": "Web",
"offers": {"@type": "Offer", "price": "0", "priceCurrency": "EUR"},
"provider": {"@type": "Organization", "name": "Panomity GmbH", "url": "https://panomity.de/"}
}
</script>
</head>
<body>
<main class="wrap">
<header class="top">
<a class="brand" href="/"><img src="/app/logo.svg" alt="" /><span>ezdns.support</span></a>
<nav class="nav" aria-label="Hauptnavigation">
<a href="/">Scan</a>
<a href="/pricing">Preise</a>
<a href="/dkim-checker">Tool</a>
<a href="/app/imprint.html">Impressum</a>
</nav>
</header>
<section class="hero">
<div class="panel copy">
<div class="kicker">Kostenloser DKIM Checker</div>
<h1>DKIM Selector prüfen und Mail-Signaturen reparieren.</h1>
<p>Finde fehlende oder falsch veröffentlichte DKIM-Selector und führe Microsoft 365 oder Google Workspace DKIM direkt in einen messbaren Fix-Pfad.</p>
<div class="proof">
<div><strong>Kostenloser Scan</strong><span>Direkt im Browser starten.</span></div>
<div><strong>Konkrete Findings</strong><span>Priorisiert nach Risiko.</span></div>
<div><strong>Audit ab 49 Euro</strong><span>Niedriger bezahlter Einstieg.</span></div>
</div>
</div>
<aside class="panel scanBox">
<h2>DKIM Selector testen</h2>
<form id="toolScanForm" class="scanForm">
<input id="domain" name="domain" placeholder="example.com" autocomplete="url" />
<button type="submit">Jetzt prüfen</button>
</form>
<div id="result" class="result">
<h3>Bereit für den Scan</h3>
<p class="status">Gib eine Domain ein. Kritische Findings führen direkt zu Audit, Quick Fix oder Cleanup.</p>
</div>
</aside>
</section>
<section class="grid">
<article class="card">
<h2>Was der Check sucht</h2>
<ul class="list"><li>Selector fehlt im DNS</li>
<li>Provider signiert nicht</li>
<li>DMARC Alignment offen</li></ul>
</article>
<article class="card">
<h2>Direkt fixen lassen</h2>
<p>Wenn der Check ein klares Risiko zeigt, ist der nächste Schritt ein Priority Audit, ein abgegrenzter Fix oder ein vollständiger Cleanup.</p>
<div class="actions">
<a class="btn primary" data-service-lead="priority_audit" href="https://support.panomity.com/cart/priority-support/DNS-Priority-Audit/&step=0">Priority Audit buchen</a>
<a class="btn blue" data-service-lead="quick_fix" href="https://support.panomity.com/cart/priority-support/DNS-Quick-Fix/&step=0">DKIM Quick Fix buchen</a>
<a class="btn dark" data-service-lead="cleanup" href="https://support.panomity.com/cart/priority-support/DNS-Mail-Security-Cleanup/&step=0">Mail Cleanup buchen</a>
</div>
</article>
<article class="card">
<h2>Passende Detailseiten</h2>
<p>Für kaufnahe Problemfälle gibt es vertiefte Landingpages mit direktem Checkout.</p>
<div class="actions"><a class="btn dark" href="/dkim-selector-fehlt">dkim-selector-fehlt</a>
<a class="btn dark" href="/google-workspace-dkim-einrichten">google-workspace-dkim-einrichten</a>
<a class="btn dark" href="/microsoft-365-dkim-dmarc">microsoft-365-dkim-dmarc</a></div>
</article>
</section>
<section class="panel quote" id="tool-request">
<div>
<h2>Fix erst einordnen?</h2>
<p>Schick Domain, Kontakt und Problem. Die Anfrage wird als qualifizierter Lead gespeichert und kann direkt in Priority Audit, Quick Fix, Cleanup oder Monitoring überführt werden.</p>
</div>
<form class="quoteForm" data-qualified-form>
<label><span>Domain</span><input name="domain" placeholder="example.com" autocomplete="url" /></label>
<label><span>E-Mail</span><input name="email" type="email" placeholder="admin@example.com" autocomplete="email" required /></label>
<label class="wide"><span>Problem</span><textarea name="message" rows="4" placeholder="DKIM Selector fehlt oder Signatur passt nicht" required></textarea></label>
<label><span>Paket</span><select name="plan"><option value="priority_audit">DNS Priority Audit 49 Euro</option><option value="cleanup">DNS/Mail Cleanup 499 Euro</option><option value="quick_fix">Quick Fix 149 Euro</option><option value="managed_monitoring">Managed Monitoring 199 Euro/Monat</option></select></label>
<button type="submit">Anfrage speichern</button>
<p class="quoteStatus" aria-live="polite"></p>
</form>
</section>
<footer class="footer">
<a href="/">Scan</a>
<a href="/pricing">Preise</a>
<a href="/app/privacy.html">Privacy</a>
<a href="/app/imprint.html">Imprint</a>
<span>© 2026 Panomity GmbH</span>
</footer>
</main>
<script>
const ORDER_POSTS = {
priority_audit: { action: 'https://support.panomity.com/cart/priority-support/DNS-Priority-Audit/&step=0', id: '879', cycle: 'Once' },
quick_fix: { action: 'https://support.panomity.com/cart/priority-support/DNS-Quick-Fix/&step=0', id: '867', cycle: 'Once' },
cleanup: { action: 'https://support.panomity.com/cart/priority-support/DNS-Mail-Security-Cleanup/&step=0', id: '868', cycle: 'Once' }
};
const API_KEY = 'dev-key';
const scanForm = document.getElementById('toolScanForm');
const domainInput = document.getElementById('domain');
const resultBox = document.getElementById('result');
let lastDomain = '';
function escapeHTML(value) {
return String(value ?? '').replace(/[&<>"']/g, (ch) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[ch]));
}
async function fetchJSON(url, opts) {
opts = opts || {};
opts.headers = Object.assign({ 'x-api-key': API_KEY }, opts.headers || {});
const res = await fetch(url, opts);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
}
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
async function pollScan(id) {
const start = Date.now();
while (Date.now() - start < 120000) {
await sleep(1800);
const scan = await fetchJSON(`/v1/scan/${encodeURIComponent(id)}`);
if (scan.status === 'done') return scan;
}
throw new Error('timeout');
}
async function recordToolLead(plan, extra = {}) {
try {
await fetch('/v1/leads', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(Object.assign({ source: 'tool_page', intent: 'tool_interaction', plan, domain: lastDomain, page: window.location.pathname }, extra || {}))
});
} catch (e) {}
}
function submitHostBillOrder(plan) {
const cfg = ORDER_POSTS[plan];
if (!cfg) return false;
const form = document.createElement('form');
form.method = 'post';
form.action = cfg.action;
for (const [name, value] of Object.entries({ action: 'add', id: cfg.id, cycle: cfg.cycle })) {
const input = document.createElement('input');
input.type = 'hidden';
input.name = name;
input.value = value;
form.appendChild(input);
}
document.body.appendChild(form);
form.submit();
return true;
}
function renderScan(scan) {
const findings = (scan.result && Array.isArray(scan.result.findings)) ? scan.result.findings : [];
const critical = findings.filter(f => f.severity === 'error').length;
const warnings = findings.filter(f => f.severity === 'warning').length;
const recommended = critical || findings.length > 1 ? 'cleanup' : 'quick_fix';
const top = findings.slice(0, 5);
const rows = top.length ? top.map((f) => `<div class="finding"><strong>${escapeHTML(f.category || 'DNS Finding')} · ${escapeHTML(f.severity || 'info')}</strong><span>${escapeHTML(f.message || 'Empfohlene Prüfung')}</span></div>`).join('') : '<div class="finding"><strong>Keine kritischen Findings sichtbar</strong><span>Für produktive Domains bleibt Monitoring sinnvoll, damit spätere DNS- und Mail-Änderungen auffallen.</span></div>';
resultBox.innerHTML = `
<h3>${escapeHTML(lastDomain || 'Domain')} geprüft</h3>
<p class="status">${critical} kritisch · ${warnings} Warnungen · ${findings.length} Findings</p>
<div class="findings">${rows}</div>
<div class="actions">
<a class="btn dark" href="/app/detail.html?id=${encodeURIComponent(scan.id)}">Report öffnen</a>
<a class="btn primary" data-service-lead="priority_audit" href="https://support.panomity.com/cart/priority-support/DNS-Priority-Audit/&step=0">Audit für 49 Euro buchen</a>
<a class="btn ${recommended === 'cleanup' ? 'primary' : 'blue'}" data-service-lead="${recommended}" href="${recommended === 'cleanup' ? 'https://support.panomity.com/cart/priority-support/DNS-Mail-Security-Cleanup/&step=0' : 'https://support.panomity.com/cart/priority-support/DNS-Quick-Fix/&step=0'}">${recommended === 'cleanup' ? 'Cleanup für 499 Euro buchen' : 'Quick Fix für 149 Euro buchen'}</a>
</div>
`;
}
if (scanForm) {
scanForm.addEventListener('submit', async (event) => {
event.preventDefault();
const domain = domainInput.value.trim().toLowerCase();
if (!domain) return;
lastDomain = domain;
const button = scanForm.querySelector('button');
button.disabled = true;
button.textContent = 'Scan läuft...';
resultBox.innerHTML = '<h3>Scan läuft</h3><p class="status">DNS-, Mail- und Sicherheitschecks werden ausgeführt.</p>';
await recordToolLead('free_scan', { intent: 'tool_scan_start', domain });
try {
const created = await fetchJSON('/v1/scan', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ domain, listed: true }) });
const scan = await pollScan(created.id);
renderScan(scan);
await recordToolLead('free_scan', { intent: 'tool_scan_done', domain });
} catch (e) {
resultBox.innerHTML = '<h3>Scan konnte nicht abgeschlossen werden</h3><p class="status">Bitte später erneut versuchen oder direkt eine Fix-Anfrage senden.</p>';
} finally {
button.disabled = false;
button.textContent = 'Jetzt prüfen';
}
});
}
document.querySelectorAll('[data-qualified-form]').forEach((form) => {
form.addEventListener('submit', async (event) => {
event.preventDefault();
const data = new FormData(form);
const plan = String(data.get('plan') || 'cleanup');
const status = form.querySelector('.quoteStatus');
if (status) status.textContent = 'Anfrage wird gespeichert...';
await recordToolLead(plan, {
intent: 'qualified_fix_request',
domain: String(data.get('domain') || lastDomain || '').trim().toLowerCase(),
contact_email: String(data.get('email') || '').trim(),
message: String(data.get('message') || '').trim(),
page: window.location.pathname + '#tool-request'
});
if (status) status.textContent = 'Gespeichert. Die Anfrage erscheint im Revenue-Report.';
});
});
document.addEventListener('click', async (event) => {
const cta = event.target.closest('[data-service-lead]');
if (!cta) return;
const plan = cta.dataset.serviceLead;
const fallbackUrl = cta.href;
event.preventDefault();
await recordToolLead(plan, { intent: 'tool_checkout' });
if (submitHostBillOrder(plan)) return;
window.location.href = fallbackUrl;
});
</script>
</body>
</html>