[{"data":1,"prerenderedAt":1096},["ShallowReactive",2],{"search-de":3,"content-de-developer\u002Fself-hosting-dns-email":4,"surround-de-\u002Fdeveloper\u002Fself-hosting-dns-email":1087},[],{"id":5,"title":6,"body":7,"description":1080,"extension":1081,"meta":1082,"navigation":988,"path":1083,"seo":1084,"stem":1085,"__hash__":1086},"content_de\u002F3.developer\u002F32.self-hosting-dns-email.md","DNS- & E-Mail-Setup",{"type":8,"value":9,"toc":1059},"minimark",[10,14,28,34,39,44,47,58,62,78,84,87,94,97,111,117,121,128,134,138,171,174,187,193,196,202,219,225,234,255,259,286,292,298,301,307,323,329,346,349,352,385,389,420,424,427,433,439,446,450,470,485,569,572,693,696,703,709,759,771,775,778,809,816,820,823,863,866,869,897,903,907,913,916,924,928,931,1048,1055],[11,12,13],"p",{},"Für den produktiven E-Mail-Versand benötigt Ihre selbst gehostete Owlat-Instanz eine korrekte DNS-Konfiguration. Ohne sie weisen die meisten E-Mail-Anbieter Ihre Nachrichten ab oder verschieben sie in den Spam-Ordner.",[15,16,19],"callout",{"title":17,"type":18},"Nur beim Versand über den eingebauten MTA","info",[11,20,21,22,27],{},"Diese Seite gilt, wenn Sie über den eingebauten MTA von Owlat versenden. Versenden Sie über Resend oder SES, folgen Sie stattdessen deren Anleitungen zur Domain-Authentifizierung; betreiben Sie einen ",[23,24,26],"a",{"href":25},"\u002Fguide\u002Foperating-modes","reinen IMAP-Modus"," (Lesen eines externen Postfachs, Antworten über Ihren eigenen SMTP), können Sie das DNS-Setup vollständig überspringen.",[15,29,31],{"title":30,"type":18},"Lokale Entwicklung",[11,32,33],{},"Das DNS-Setup wird nur für die Produktion benötigt. Für lokale Tests versucht der MTA die Zustellung mit den Standardeinstellungen — die meisten E-Mails werden von empfangenden Servern abgewiesen, Sie können aber überprüfen, dass die Pipeline durchgängig funktioniert.",[35,36,38],"h2",{"id":37},"erforderliche-dns-einträge","Erforderliche DNS-Einträge",[40,41,43],"h3",{"id":42},"a-record","A-Record",[11,45,46],{},"Richten Sie Ihre Anwendungsdomain auf die IP-Adresse Ihres Servers:",[48,49,54],"pre",{"className":50,"code":52,"language":53},[51],"language-text","owlat.example.com.    A    203.0.113.10\n","text",[55,56,52],"code",{"__ignoreMap":57},"",[40,59,61],{"id":60},"ptr-reverse-dns","PTR \u002F Reverse DNS",[11,63,64,65,68,69,72,73,77],{},"Der ",[55,66,67],{},"EHLO_HOSTNAME"," in Ihrer ",[55,70,71],{},".env"," ",[74,75,76],"strong",{},"muss"," einen PTR-Record besitzen, der zur IP-Adresse Ihres Servers passt. Dieser wird im Control Panel Ihres Hosting-Anbieters gesetzt (nicht bei Ihrem DNS-Anbieter).",[48,79,82],{"className":80,"code":81,"language":53},[51],"# Your .env\nEHLO_HOSTNAME=mail.example.com\n\n# PTR record (set in hosting provider)\n203.0.113.10    PTR    mail.example.com\n",[55,83,81],{"__ignoreMap":57},[11,85,86],{},"Die meisten empfangenden Mailserver weisen Verbindungen ab, bei denen der EHLO-Hostname nicht zum PTR-Record passt.",[11,88,89,90,93],{},"Owlat prüft die vollständige Kette, bevor es eine Adresse auswählt: Der PTR muss\nexistieren, einen gültigen FQDN enthalten, vorwärts auf die sendende IP auflösen\nund zum EHLO-Namen passen. Das Ergebnis wird fortlaufend gespeichert und stündlich\ngeprüft. Ein harter Fehlschlag stellt die IP unter Quarantäne, sodass eine\nInstallation mit Provider-Standard- oder fehlendem Reverse DNS nicht stillschweigend\nversenden kann. Provider-Standard-PTRs, die sich vorwärts bestätigen lassen, bleiben\nnutzbar, erscheinen jedoch als Reputationswarnung unter ",[74,91,92],{},"Zustellgesundheit →\nAusgehende IPs",".",[11,95,96],{},"Geben Sie bei einem Pool mit mehreren IPs jeder Adresse eine eigene Identität:",[48,98,102],{"className":99,"code":100,"language":101,"meta":57,"style":57},"language-env shiki shiki-themes github-light github-dark-dimmed","EHLO_HOSTNAMES={\"203.0.113.10\":\"mail1.example.com\",\"203.0.113.11\":\"mail2.example.com\"}\n","env",[55,103,104],{"__ignoreMap":57},[105,106,109],"span",{"class":107,"line":108},"line",1,[105,110,100],{},[11,112,113,116],{},[55,114,115],{},"MTA_ALLOW_UNVERIFIED_FCRDNS=true"," ist eine ausdrückliche Notluke nur für\nLaborumgebungen, gedacht für Experimente mit privaten\u002Flokalen IPv4-Adressen. Eine\nunverifizierte IPv6-Adresse lässt sie niemals zu.",[40,118,120],{"id":119},"mx-record-für-die-bounce-verarbeitung","MX-Record für die Bounce-Verarbeitung",[11,122,123,124,127],{},"Die ",[55,125,126],{},"RETURN_PATH_DOMAIN"," benötigt einen MX-Record, der auf Ihren Server zeigt, damit Bounce-E-Mails auf Port 25 zum MTA zurückgeleitet werden:",[48,129,132],{"className":130,"code":131,"language":53},[51],"bounces.example.com.    MX    10 mail.example.com.\n",[55,133,131],{"__ignoreMap":57},[35,135,137],{"id":136},"spf","SPF",[15,139,142],{"title":140,"type":141},"Der eingebaute MTA erzeugt standardmäßig keinen SPF-Record automatisch","warning",[11,143,144,145,148,149,152,153,156,157,159,160,163,164,166,167,170],{},"Wenn Sie auf ",[74,146,147],{},"Domain hinzufügen"," klicken, erzeugt der eingebaute MTA Ihre ",[74,150,151],{},"DKIM","- und ",[74,154,155],{},"DMARC","-Einträge, gibt aber nur dann einen ",[74,158,137],{},"-Eintrag aus, wenn die Umgebungsvariable ",[55,161,162],{},"MTA_SPF_INCLUDE"," gesetzt ist. Ist ",[55,165,162],{}," nicht gesetzt, wird kein SPF-Eintrag angezeigt und ",[74,168,169],{},"Sie müssen ihn wie unten beschrieben manuell hinzufügen",". Die Ausrichtung von DKIM + DMARC funktioniert auch ohne SPF, doch ein fehlender oder falscher SPF-Eintrag schadet der Zustellbarkeit.",[11,172,173],{},"Sie haben zwei Möglichkeiten, SPF zu veröffentlichen — je nachdem, wie Sie den MTA betreiben:",[11,175,176,183,184,186],{},[74,177,178,179,182],{},"Option A — einen ",[55,180,181],{},"ip4","-Eintrag manuell hinzufügen (Standard)."," Wenn Sie ",[55,185,162],{}," nicht gesetzt haben, fügen Sie auf Ihrer Versanddomain einen TXT-Record hinzu, der die IP Ihres Servers direkt autorisiert:",[48,188,191],{"className":189,"code":190,"language":53},[51],"example.com.    TXT    \"v=spf1 ip4:203.0.113.10 -all\"\n",[55,192,190],{"__ignoreMap":57},[11,194,195],{},"Wenn Sie mehrere IPs verwenden (getrennte Pools für transaktionale Mail und Kampagnen), führen Sie alle davon auf:",[48,197,200],{"className":198,"code":199,"language":53},[51],"example.com.    TXT    \"v=spf1 ip4:203.0.113.10 ip4:203.0.113.11 -all\"\n",[55,201,199],{"__ignoreMap":57},[11,203,204,211,212,214,215,218],{},[74,205,206,207,210],{},"Option B — den MTA einen ",[55,208,209],{},"include:","-Eintrag erzeugen lassen."," Setzen Sie ",[55,213,162],{}," im Convex-Backend auf eine Domain, deren eigener SPF-Record Ihre Versand-IPs auflistet (zum Beispiel eine gemeinsame ",[55,216,217],{},"_spf","-Subdomain, die Sie pflegen). Der Ablauf „Domain hinzufügen“ gibt dann diesen Eintrag für Sie aus:",[48,220,223],{"className":221,"code":222,"language":53},[51],"example.com.    TXT    \"v=spf1 include:\u003CMTA_SPF_INCLUDE value> ~all\"\n",[55,224,222],{"__ignoreMap":57},[11,226,227,228,230,231,233],{},"Verwenden Sie die ",[55,229,181],{},"-Form (Option A), sofern Sie keine gepflegte ",[55,232,209],{},"-Domain betreiben — so bleiben Ihre autorisierten IPs explizit und innerhalb des Limits von 10 Lookups bei SPF (RFC 7208 §4.6.4).",[15,235,237],{"title":236,"type":18},"Soft-Fail vs. Hard-Fail (~all vs. -all)",[11,238,239,240,243,244,247,248,250,251,254],{},"Solange Sie noch IPs oder Relays hinzufügen, veröffentlichen Sie ",[55,241,242],{},"~all"," (Soft-Fail), damit eine Nachricht von einer noch nicht aufgeführten IP markiert und nicht abgewiesen wird. Sobald Ihr Satz autorisierter IPs stabil ist, wechseln Sie auf ",[55,245,246],{},"-all"," (Hard-Fail). Der Domain-Verifizierungsablauf von Owlat erzeugt standardmäßig ",[55,249,242],{},"; setzen Sie ",[55,252,253],{},"SPF_QUALIFIER=-all",", sobald Sie Ihrer IP-Liste vertrauen.",[40,256,258],{"id":257},"spf-für-die-bounce-return-path-domain","SPF für die Bounce-Return-Path-Domain",[11,260,261,262,265,266,270,271,273,274,277,278,281,282,285],{},"Diesen Schritt übersehen die meisten Self-Hoster. Der MTA versendet mit einem VERP-Bounce-Envelope (",[55,263,264],{},"MAIL FROM: bounce+…@RETURN_PATH_DOMAIN","), Empfänger bewerten SPF also gegen Ihre ",[74,267,268],{},[55,269,126],{}," und nicht gegen den Apex Ihrer From-Domain. Hat ",[55,272,126],{}," keinen SPF-Record, scheitert der Bounce-Envelope an SPF — und da die Return-Path-Domain (",[55,275,276],{},"bounces.example.com",") nicht zu Ihrer From-Domain (",[55,279,280],{},"example.com",") ausgerichtet ist, ",[74,283,284],{},"kann SPF für Ihre From-Domain allein niemals zu DMARC beitragen",". DKIM richtet sich weiterhin aus und trägt DMARC, dennoch sollten Sie den Return-Path autorisieren.",[11,287,288,289,291],{},"Veröffentlichen Sie auf ",[55,290,126],{}," einen TXT-Record, der jede Pool-IP autorisiert:",[48,293,296],{"className":294,"code":295,"language":53},[51],"bounces.example.com.    TXT    \"v=spf1 ip4:203.0.113.10 -all\"\n",[55,297,295],{"__ignoreMap":57},[11,299,300],{},"Bei mehreren Pool-IPs führen Sie alle davon auf:",[48,302,305],{"className":303,"code":304,"language":53},[51],"bounces.example.com.    TXT    \"v=spf1 ip4:203.0.113.10 ip4:203.0.113.11 -all\"\n",[55,306,304],{"__ignoreMap":57},[11,308,309,310,314,315,318,319,322],{},"Damit SPF ",[311,312,313],"em",{},"ausgerichtet"," ist (SPF also DMARC allein erfüllen kann), verwenden Sie statt einer gemeinsamen Bounce-Domain eine Return-Path-Subdomain ",[74,316,317],{},"Ihrer Versanddomain"," — setzen Sie z. B. ",[55,320,321],{},"RETURN_PATH_DOMAIN=bounce.example.com",", damit der Return-Path dieselbe organisatorische Domain wie Ihre From-Domain nutzt und sich im Relaxed-Modus von DMARC ausrichtet. Veröffentlichen Sie den SPF-Record dann auf dieser Subdomain:",[48,324,327],{"className":325,"code":326,"language":53},[51],"bounce.example.com.    TXT    \"v=spf1 ip4:203.0.113.10 -all\"\n",[55,328,326],{"__ignoreMap":57},[15,330,332],{"title":331,"type":18},"Owlat den Eintrag erzeugen lassen",[11,333,334,335,338,339,342,343,93],{},"Setzen Sie ",[55,336,337],{},"MTA_RETURN_PATH_DOMAIN"," und ",[55,340,341],{},"MTA_IP_POOLS"," (kommagetrennte Versand-IPs) in den Umgebungsvariablen des Convex-Backends, dann erzeugt der Domain-Verifizierungsablauf in der App den Return-Path-SPF-Record für Sie — mit dem Qualifier aus ",[55,344,345],{},"SPF_QUALIFIER",[35,347,151],{"id":348},"dkim",[11,350,351],{},"DKIM signiert ausgehende E-Mails mit einem kryptografischen Schlüssel, sodass Empfänger überprüfen können, dass die Nachricht nicht manipuliert wurde.",[15,353,355],{"title":354,"type":141},"DKIM in der App erzeugen — keinen Schlüssel selbst basteln",[11,356,357,358,361,362,364,365,368,369,372,373,376,377,380,381,384],{},"Nutzen Sie ",[74,359,360],{},"einen"," DKIM-Weg: den Ablauf ",[74,363,147],{}," in der App. Wenn Sie eine Domain hinzufügen, erzeugt der eingebaute MTA das RSA-Schlüsselpaar mit 2048 Bit für Sie, speichert den privaten Schlüssel in Redis und zeigt Ihnen den exakten DNS-TXT-Record, den Sie veröffentlichen müssen. Erzeugen Sie für dieselbe Domain ",[74,366,367],{},"nicht"," zusätzlich einen Schlüssel mit ",[55,370,371],{},"openssl"," und setzen ihn über ",[55,374,375],{},"DKIM_KEYS"," — der Ablauf „Domain hinzufügen“ vergibt einen eigenen Selector (",[55,378,379],{},"s{timestamp}",") und überschreibt den Redis-Schlüssel, sodass ein von Hand erzeugter ",[55,382,383],{},"s1","-Schlüssel nicht mehr zu dem passt, womit der MTA signiert, und DKIM bricht.",[40,386,388],{"id":387},"_1-schlüssel-erzeugen-in-der-app","1. Schlüssel erzeugen (in der App)",[390,391,392,399,405],"ol",{},[393,394,395,396,93],"li",{},"Öffnen Sie ",[74,397,398],{},"Einstellungen > Technisch > Versanddomains",[393,400,401,402,404],{},"Klicken Sie auf ",[74,403,147],{}," und geben Sie Ihre Domain ein.",[393,406,407,408,411,412,415,416,419],{},"Der MTA erzeugt ein Schlüsselpaar und zeigt einen DKIM-TXT-Record unter ",[55,409,410],{},"\u003Cselector>._domainkey.example.com"," an, wobei ",[55,413,414],{},"\u003Cselector>"," der automatisch vergebene Selector ist (zum Beispiel ",[55,417,418],{},"s1718000000000",").",[40,421,423],{"id":422},"_2-dns-txt-record-hinzufügen","2. DNS-TXT-Record hinzufügen",[11,425,426],{},"Veröffentlichen Sie den TXT-Record exakt so, wie die Oberfläche ihn anzeigt, unter dem angezeigten Selector-Host:",[48,428,431],{"className":429,"code":430,"language":53},[51],"s1718000000000._domainkey.example.com.    TXT    \"v=DKIM1; k=rsa; p=MIIBIjANBgkq...\"\n",[55,432,430],{"__ignoreMap":57},[15,434,436],{"title":435,"type":141},"Länge von DNS-TXT-Records",[11,437,438],{},"Ist Ihr öffentlicher Schlüssel länger als 255 Zeichen, müssen Sie ihn im TXT-Record eventuell auf mehrere Zeichenketten in Anführungszeichen aufteilen. Die meisten DNS-Anbieter erledigen das automatisch.",[11,440,441,442,445],{},"Klicken Sie anschließend in der Oberfläche auf ",[74,443,444],{},"Verifizieren",", um zu bestätigen, dass der Eintrag aktiv ist.",[40,447,449],{"id":448},"schlüssel-über-die-umgebungsvariable-dkim_keys-vorbelegen-optional","Schlüssel über die Umgebungsvariable DKIM_KEYS vorbelegen (optional)",[11,451,452,454,455,458,459,462,463,465,466,469],{},[55,453,375],{}," dient ausschließlich dazu, ",[74,456,457],{},"einen bestehenden DKIM-Schlüssel"," in einen frischen Self-Host zu ",[74,460,461],{},"migrieren"," (etwa beim Anbieterwechsel, wenn Sie Ihren bereits veröffentlichten ",[55,464,383],{},"-Record behalten wollen). Der MTA legt diese Schlüssel beim Start in Redis ab, und zwar ",[74,467,468],{},"nur, wenn für die betreffende Domain noch kein Schlüssel existiert"," — einen vom Ablauf „Domain hinzufügen“ erzeugten Schlüssel überschreibt er nie.",[11,471,472,473,475,476,478,479,481,482,484],{},"Wenn Sie ",[55,474,375],{}," für eine Domain verwenden, klicken Sie für diese ",[74,477,367],{}," zusätzlich auf ",[74,480,147],{},": Der Ablauf in der App ist der kanonische Weg, und das Registrieren einer Domain ohne vorhandenen Schlüssel würde einen neuen Selector erzeugen. Wählen Sie pro Domain einen Weg — den Ablauf in der App für neue Domains, ",[55,483,375],{}," nur zur Übernahme eines bereits vorhandenen Schlüssels.",[48,486,490],{"className":487,"code":488,"language":489,"meta":57,"style":57},"language-bash shiki shiki-themes github-light github-dark-dimmed","DKIM_KEYS={\"example.com\":{\"selector\":\"s1\",\"privateKey\":\"-----BEGIN RSA PRIVATE KEY-----\\nMIIEpAIBAAK...\\n-----END RSA PRIVATE KEY-----\\n\"}}\n","bash",[55,491,492],{"__ignoreMap":57},[105,493,494,497,501,504,508,512,515,518,521,524,526,529,532,534,537,540,543,546,550,553,555,558,560,562,564,566],{"class":107,"line":108},[105,495,375],{"class":496},"sYgZi",[105,498,500],{"class":499},"s7YZ4","=",[105,502,503],{"class":496},"{",[105,505,507],{"class":506},"sOLd2","\"example.com\"",[105,509,511],{"class":510},"sviXB",":",[105,513,503],{"class":514},"s-HuK",[105,516,517],{"class":496},"\"",[105,519,520],{"class":506},"selector",[105,522,523],{"class":506},"\":\"",[105,525,383],{"class":506},[105,527,528],{"class":506},"\",\"",[105,530,531],{"class":506},"privateKey",[105,533,523],{"class":506},[105,535,536],{"class":506},"-----BEGIN",[105,538,539],{"class":514}," RSA",[105,541,542],{"class":514}," PRIVATE",[105,544,545],{"class":514}," KEY-----",[105,547,549],{"class":548},"s74oq","\\n",[105,551,552],{"class":514},"MIIEpAIBAAK...",[105,554,549],{"class":548},[105,556,557],{"class":514},"-----END",[105,559,539],{"class":514},[105,561,542],{"class":514},[105,563,545],{"class":514},[105,565,549],{"class":548},[105,567,568],{"class":514},"\"}}\n",[11,570,571],{},"Das JSON-Format unterstützt mehrere Domains:",[48,573,577],{"className":574,"code":575,"language":576,"meta":57,"style":57},"language-json shiki shiki-themes github-light github-dark-dimmed","{\n  \"example.com\": {\n    \"selector\": \"s1\",\n    \"privateKey\": \"-----BEGIN RSA PRIVATE KEY-----\\n...\\n-----END RSA PRIVATE KEY-----\\n\"\n  },\n  \"anotherdomain.com\": {\n    \"selector\": \"s1\",\n    \"privateKey\": \"-----BEGIN RSA PRIVATE KEY-----\\n...\\n-----END RSA PRIVATE KEY-----\\n\"\n  }\n}\n","json",[55,578,579,584,594,609,635,641,649,660,681,687],{"__ignoreMap":57},[105,580,581],{"class":107,"line":108},[105,582,583],{"class":496},"{\n",[105,585,587,591],{"class":107,"line":586},2,[105,588,590],{"class":589},"snmFh","  \"example.com\"",[105,592,593],{"class":496},": {\n",[105,595,597,600,603,606],{"class":107,"line":596},3,[105,598,599],{"class":589},"    \"selector\"",[105,601,602],{"class":496},": ",[105,604,605],{"class":514},"\"s1\"",[105,607,608],{"class":496},",\n",[105,610,612,615,617,620,622,625,627,630,632],{"class":107,"line":611},4,[105,613,614],{"class":589},"    \"privateKey\"",[105,616,602],{"class":496},[105,618,619],{"class":514},"\"-----BEGIN RSA PRIVATE KEY-----",[105,621,549],{"class":548},[105,623,624],{"class":514},"...",[105,626,549],{"class":548},[105,628,629],{"class":514},"-----END RSA PRIVATE KEY-----",[105,631,549],{"class":548},[105,633,634],{"class":514},"\"\n",[105,636,638],{"class":107,"line":637},5,[105,639,640],{"class":496},"  },\n",[105,642,644,647],{"class":107,"line":643},6,[105,645,646],{"class":589},"  \"anotherdomain.com\"",[105,648,593],{"class":496},[105,650,652,654,656,658],{"class":107,"line":651},7,[105,653,599],{"class":589},[105,655,602],{"class":496},[105,657,605],{"class":514},[105,659,608],{"class":496},[105,661,663,665,667,669,671,673,675,677,679],{"class":107,"line":662},8,[105,664,614],{"class":589},[105,666,602],{"class":496},[105,668,619],{"class":514},[105,670,549],{"class":548},[105,672,624],{"class":514},[105,674,549],{"class":548},[105,676,629],{"class":514},[105,678,549],{"class":548},[105,680,634],{"class":514},[105,682,684],{"class":107,"line":683},9,[105,685,686],{"class":496},"  }\n",[105,688,690],{"class":107,"line":689},10,[105,691,692],{"class":496},"}\n",[35,694,155],{"id":695},"dmarc",[11,697,698,699,702],{},"DMARC teilt empfangenden Servern mit, was zu tun ist, wenn SPF- oder DKIM-Prüfungen fehlschlagen. Fügen Sie einen TXT-Record unter ",[55,700,701],{},"_dmarc.example.com"," hinzu:",[48,704,707],{"className":705,"code":706,"language":53},[51],"_dmarc.example.com.    TXT    \"v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com\"\n",[55,708,706],{"__ignoreMap":57},[710,711,712,725],"table",{},[713,714,715],"thead",{},[716,717,718,722],"tr",{},[719,720,721],"th",{},"Policy",[719,723,724],{},"Verhalten",[726,727,728,739,749],"tbody",{},[716,729,730,736],{},[731,732,733],"td",{},[55,734,735],{},"p=none",[731,737,738],{},"Nur Beobachtung — keine Maßnahme bei Fehlschlägen (gut für die Ersteinrichtung)",[716,740,741,746],{},[731,742,743],{},[55,744,745],{},"p=quarantine",[731,747,748],{},"Fehlschlagende Nachrichten in den Spam-Ordner zustellen",[716,750,751,756],{},[731,752,753],{},[55,754,755],{},"p=reject",[731,757,758],{},"Fehlschlagende Nachrichten vollständig abweisen (am striktesten)",[11,760,761,762,764,765,767,768,770],{},"Beginnen Sie mit ",[55,763,735],{},", während Sie Ihr Setup überprüfen, und wechseln Sie auf ",[55,766,745],{}," oder ",[55,769,755],{},", sobald alles funktioniert.",[35,772,774],{"id":773},"ip-pools","IP-Pools",[11,776,777],{},"Der MTA unterstützt getrennte IP-Pools für transaktionale E-Mails und Kampagnen. Das schützt die Reputation Ihrer transaktionalen E-Mails davor, von Marketingkampagnen beeinträchtigt zu werden.",[48,779,781],{"className":487,"code":780,"language":489,"meta":57,"style":57},"# In .env\nIP_POOLS_TRANSACTIONAL=203.0.113.10\nIP_POOLS_CAMPAIGN=203.0.113.11,203.0.113.12\n",[55,782,783,789,799],{"__ignoreMap":57},[105,784,785],{"class":107,"line":108},[105,786,788],{"class":787},"sDN9O","# In .env\n",[105,790,791,794,796],{"class":107,"line":586},[105,792,793],{"class":496},"IP_POOLS_TRANSACTIONAL",[105,795,500],{"class":499},[105,797,798],{"class":514},"203.0.113.10\n",[105,800,801,804,806],{"class":107,"line":596},[105,802,803],{"class":496},"IP_POOLS_CAMPAIGN",[105,805,500],{"class":499},[105,807,808],{"class":514},"203.0.113.11,203.0.113.12\n",[11,810,811,812,815],{},"Jede IP in einem Pool benötigt einen eigenen PTR-Record und muss in Ihrem SPF-Record enthalten sein.\nFühren Sie nach Änderungen am Reverse DNS ",[55,813,814],{},"owlat doctor"," aus. Das Kommando meldet den\nexakten PTR-Wert, den Owlat erwartet, sowie passgenaue Konsolenschritte für Hetzner,\nDigitalOcean und OVHcloud.",[40,817,819],{"id":818},"optionales-ausgehendes-ipv6","Optionales ausgehendes IPv6",[11,821,822],{},"Ausgehendes IPv6 ist standardmäßig aus, weil es keinen automatischen Vorteil für die\nZustellbarkeit bringt und Empfänger bei unvollständiger Identität unnachgiebig sind.\nDie IPv6-Bridge von Docker stellt Ihnen zudem keine öffentliche Adresse bereit.\nHalten Sie IPv4 funktionsfähig und aktivieren Sie IPv6 nur in dieser Reihenfolge:",[390,824,825,828,835,838,852],{},[393,826,827],{},"Weisen Sie dem MTA-Host\u002F-Container eine stabile, öffentlich geroutete IPv6-Adresse\nzu und stellen Sie sicher, dass die quellgebundene SMTP-Probe sie nutzen kann.",[393,829,830,831,834],{},"Setzen Sie den PTR dieser Adresse auf ihren nicht generischen EHLO-Hostnamen. ",[55,832,833],{},"dig -x 2001:db8::10"," muss genau diesen FQDN zurückgeben.",[393,836,837],{},"Veröffentlichen Sie einen AAAA-Record, der vom EHLO-Hostnamen zurück auf exakt diese Adresse zeigt.",[393,839,840,841,844,845,848,849,851],{},"Fügen Sie ",[55,842,843],{},"ip6:2001:db8::10"," den SPF-Records für Versand und Return-Path hinzu. Der\nMTA-Domain-Generator von Owlat gibt ",[55,846,847],{},"ip6:"," automatisch aus kanonischen IPv6-Werten in\n",[55,850,341],{}," aus.",[393,853,854,855,858,859,862],{},"Erst dann setzen Sie ",[55,856,857],{},"MTA_IPV6_ENABLED=true"," und tragen die nackte Adresse (ohne Klammern,\nPort, CIDR oder Zone-ID) in ",[55,860,861],{},"IP_POOLS_*"," ein.",[11,864,865],{},"Owlat prüft dies als tatsächlichen Live-Zustand, nicht als manuelles Häkchen. Jede\nIPv4-Identität muss grün bleiben; IPv6-PTR\u002FAAAA und der exakte Return-Path-SPF werden\nstündlich erneut geprüft. Eine bestätigte Regression stellt IPv6 unter Quarantäne und\ninvalidiert dessen gepoolte Sockets, während geeignetes IPv4 weiterläuft.",[11,867,868],{},"Anbieterwege, gegen deren aktuelle Dokumentation geprüft:",[870,871,872,881,889],"ul",{},[393,873,874,880],{},[23,875,879],{"href":876,"rel":877},"https:\u002F\u002Fdocs.hetzner.com\u002Fcloud\u002Fservers\u002Fcloud-server-rdns\u002F",[878],"nofollow","Hetzner Cloud rDNS","\nakzeptiert den IPv6-Interface-Identifier unter Console → Server → Networking.",[393,882,883,888],{},[23,884,887],{"href":885,"rel":886},"https:\u002F\u002Fdocs.digitalocean.com\u002Fproducts\u002Fnetworking\u002Fipv6\u002Fhow-to\u002Fenable\u002F",[878],"DigitalOcean IPv6","\nmuss auf dem Droplet aktiviert und geroutet sein; DigitalOcean dokumentiert das Anlegen\neines PTR aus einem gültigen FQDN-Droplet-Namen und unterstützt PTR nur für die zuerst\nzugewiesene IPv6-Adresse.",[393,890,891,896],{},[23,892,895],{"href":893,"rel":894},"https:\u002F\u002Fdocs.ovhcloud.com\u002Fen\u002Fguides\u002Fbare-metal-cloud\u002Fvirtual-private-servers\u002Fconfiguring-reverse-dns",[878],"OVHcloud Reverse DNS","\nfindet sich unter Network → Public IP Addresses → Configure reverse DNS. Vergewissern Sie\nsich, dass Ihr Produkt die gewählte IPv6 dort überhaupt anbietet, bevor Sie sie einem Pool\nhinzufügen; die zitierten Anbieteranleitungen dokumentieren keine Delegation der Reverse-Zone.",[15,898,900],{"title":899,"type":18},"Setup mit einer einzelnen IP",[11,901,902],{},"Wenn Sie nur eine IP-Adresse haben, verwenden Sie sie für beide Pools. Eine Trennung der Reputation ist dann nicht möglich, aber alles funktioniert korrekt.",[35,904,906],{"id":905},"ip-warming","IP-Warming",[15,908,910],{"title":909,"type":141},"Neue IPs haben keine Reputation",[11,911,912],{},"Frische IP-Adressen haben keine Versandreputation. Sofort große Volumen zu versenden löst Spamfilter aus und kann dazu führen, dass Ihre IP auf einer Blockliste landet. Steigern Sie das Volumen über 2–4 Wochen schrittweise.",[11,914,915],{},"Owlat erzwingt einen im Code hinterlegten adaptiven Zeitplan statt allgemeiner\nWochenschätzungen. Er beginnt am Warming-Tag 1 mit 50 Nachrichten pro IP, erreicht\nbis Tag 25 Checkpoint-Obergrenzen und hebt die Obergrenze ab Tag 30 erst dann auf,\nwenn das Gesundheits-Gate für die Graduierung bestanden ist. Tage ohne Versand\nbringen den Zustand nicht voran; gute Signale können ihn beschleunigen, während\nBounces und Deferrals ihn verlangsamen oder pausieren.",[11,917,918,919,923],{},"Unter ",[23,920,922],{"href":921},"\u002Fguide\u002Fsending-from-a-vps#what-warming-weeks-1-4-look-like","Versand von einem VPS — So sehen die Warming-Wochen 1–4 aus","\nfinden Sie die exakten, testabgesicherten Checkpoints und adaptiven Schwellenwerte.\nKonzentrieren Sie sich zuerst auf aktuelle, ausdrückliche Opt-ins, die die Nachricht erwarten.",[35,925,927],{"id":926},"überprüfung","Überprüfung",[11,929,930],{},"Sobald Ihre DNS-Einträge konfiguriert sind:",[390,932,933,943,955],{},[393,934,935,938,939,93],{},[74,936,937],{},"Überprüfung in der App"," — der Domain-Verifizierungsablauf von Owlat prüft SPF-, DKIM- und DMARC-Einträge automatisch. Details finden Sie unter ",[23,940,942],{"href":941},"\u002Fguide\u002Fdeliverability","Zustellbarkeit",[393,944,945,948,949,954],{},[74,946,947],{},"Externe Tests"," — senden Sie eine Test-E-Mail an ",[23,950,953],{"href":951,"rel":952},"https:\u002F\u002Fwww.mail-tester.com",[878],"mail-tester.com"," und streben Sie eine Bewertung von 9+\u002F10 an.",[393,956,957,511,960],{},[74,958,959],{},"Manuelle Prüfungen",[48,961,963],{"className":487,"code":962,"language":489,"meta":57,"style":57},"# Verify SPF\ndig TXT example.com +short\n\n# Verify DKIM (use the selector the Add-domain flow displayed)\ndig TXT s1718000000000._domainkey.example.com +short\n\n# Verify DMARC\ndig TXT _dmarc.example.com +short\n\n# Verify PTR\ndig -x 203.0.113.10 +short\n",[55,964,965,970,984,990,995,1006,1010,1015,1026,1030,1035],{"__ignoreMap":57},[105,966,967],{"class":107,"line":108},[105,968,969],{"class":787},"# Verify SPF\n",[105,971,972,975,978,981],{"class":107,"line":586},[105,973,974],{"class":506},"dig",[105,976,977],{"class":514}," TXT",[105,979,980],{"class":514}," example.com",[105,982,983],{"class":514}," +short\n",[105,985,986],{"class":107,"line":596},[105,987,989],{"emptyLinePlaceholder":988},true,"\n",[105,991,992],{"class":107,"line":611},[105,993,994],{"class":787},"# Verify DKIM (use the selector the Add-domain flow displayed)\n",[105,996,997,999,1001,1004],{"class":107,"line":637},[105,998,974],{"class":506},[105,1000,977],{"class":514},[105,1002,1003],{"class":514}," s1718000000000._domainkey.example.com",[105,1005,983],{"class":514},[105,1007,1008],{"class":107,"line":643},[105,1009,989],{"emptyLinePlaceholder":988},[105,1011,1012],{"class":107,"line":651},[105,1013,1014],{"class":787},"# Verify DMARC\n",[105,1016,1017,1019,1021,1024],{"class":107,"line":662},[105,1018,974],{"class":506},[105,1020,977],{"class":514},[105,1022,1023],{"class":514}," _dmarc.example.com",[105,1025,983],{"class":514},[105,1027,1028],{"class":107,"line":683},[105,1029,989],{"emptyLinePlaceholder":988},[105,1031,1032],{"class":107,"line":689},[105,1033,1034],{"class":787},"# Verify PTR\n",[105,1036,1038,1040,1043,1046],{"class":107,"line":1037},11,[105,1039,974],{"class":506},[105,1041,1042],{"class":510}," -x",[105,1044,1045],{"class":510}," 203.0.113.10",[105,1047,983],{"class":514},[11,1049,1050,1051,93],{},"Details zur MTA-Architektur, zum Rate Limiting und zur Bounce-Verarbeitung finden Sie unter ",[23,1052,1054],{"href":1053},"\u002Fdeveloper\u002Fmta-system","MTA-System",[1056,1057,1058],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}html pre.shiki code .s7YZ4, html code.shiki .s7YZ4{--shiki-default:#D73A49;--shiki-dark:#F47067}html pre.shiki code .sOLd2, html code.shiki .sOLd2{--shiki-default:#6F42C1;--shiki-dark:#F69D50}html pre.shiki code .sviXB, html code.shiki .sviXB{--shiki-default:#005CC5;--shiki-dark:#6CB6FF}html pre.shiki code .s-HuK, html code.shiki .s-HuK{--shiki-default:#032F62;--shiki-dark:#96D0FF}html pre.shiki code .s74oq, html code.shiki .s74oq{--shiki-default:#005CC5;--shiki-dark:#F47067}html pre.shiki code .snmFh, html code.shiki .snmFh{--shiki-default:#005CC5;--shiki-dark:#8DDB8C}html pre.shiki code .sDN9O, html code.shiki .sDN9O{--shiki-default:#6A737D;--shiki-dark:#768390}",{"title":57,"searchDepth":586,"depth":586,"links":1060},[1061,1066,1069,1074,1075,1078,1079],{"id":37,"depth":586,"text":38,"children":1062},[1063,1064,1065],{"id":42,"depth":596,"text":43},{"id":60,"depth":596,"text":61},{"id":119,"depth":596,"text":120},{"id":136,"depth":586,"text":137,"children":1067},[1068],{"id":257,"depth":596,"text":258},{"id":348,"depth":586,"text":151,"children":1070},[1071,1072,1073],{"id":387,"depth":596,"text":388},{"id":422,"depth":596,"text":423},{"id":448,"depth":596,"text":449},{"id":695,"depth":586,"text":155},{"id":773,"depth":586,"text":774,"children":1076},[1077],{"id":818,"depth":596,"text":819},{"id":905,"depth":586,"text":906},{"id":926,"depth":586,"text":927},"DNS-Einträge, DKIM-Signierung, SPF, DMARC und Bounce-Verarbeitung für eine zuverlässige E-Mail-Zustellung konfigurieren.","md",{},"\u002Fdeveloper\u002Fself-hosting-dns-email",{"title":6,"description":1080},"3.developer\u002F32.self-hosting-dns-email","rurcNCA6naQde1QONP09T3rD_NucXsTVpTl3N-X2Nqw",[1088,1092],{"title":1089,"path":1090,"stem":1091,"children":-1},"Self-Hosting-Konfiguration","\u002Fdeveloper\u002Fself-hosting-config","3.developer\u002F31.self-hosting-config",{"title":1093,"path":1094,"stem":1095,"children":-1},"Produktions-Deployment","\u002Fdeveloper\u002Fself-hosting-production","3.developer\u002F33.self-hosting-production",1786915109973]