From 80596ab347dba05f75d45139313434bed0358742 Mon Sep 17 00:00:00 2001 From: Andreas Knuth Date: Mon, 2 Mar 2026 16:48:55 -0600 Subject: [PATCH] autodiscover --- caddy/email_autodiscover | 57 +++++++++++++++++++++++-------------- caddy/update-caddy-certs.sh | 54 ++++++++++++++++++++++++++++++----- 2 files changed, 83 insertions(+), 28 deletions(-) diff --git a/caddy/email_autodiscover b/caddy/email_autodiscover index 5f9b24f..78ccedd 100644 --- a/caddy/email_autodiscover +++ b/caddy/email_autodiscover @@ -1,8 +1,21 @@ +# email_autodiscover - Dynamisches Autodiscover/Autoconfig Snippet +# Importiert im Caddyfile via: import email_autodiscover +# +# Funktioniert mit JEDER Domain automatisch, solange der Caddy-Block +# auf autodiscover. oder autoconfig. hört. +# +# Hostnames werden dynamisch abgeleitet: +# autodiscover.cielectrical.com → imap.cielectrical.com / smtp.cielectrical.com +# autoconfig.bayarea-cc.com → imap.bayarea-cc.com / smtp.bayarea-cc.com +# +# {labels.2}.{labels.1} extrahiert die Basisdomain aus dem Host: +# autodiscover.cielectrical.com → labels: [com=0, cielectrical=1, autodiscover=2] +# → {labels.1}.{labels.0} = cielectrical.com + (email_settings) { - # 1. Autodiscover für Outlook + # 1. Outlook Autodiscover (XML) route /autodiscover/autodiscover.xml { header Content-Type "application/xml" - # Wir nutzen {header.X-Anchormailbox} um die Email dynamisch einzufügen respond ` @@ -11,7 +24,7 @@ settings IMAP - mail.email-srvr.com + imap.{labels.1}.{labels.0} 993 on {header.X-Anchormailbox} @@ -21,17 +34,17 @@ POP3 - mail.email-srvr.com + pop.{labels.1}.{labels.0} 995 on {header.X-Anchormailbox} off on on - + SMTP - mail.email-srvr.com + smtp.{labels.1}.{labels.0} 465 on {header.X-Anchormailbox} @@ -44,31 +57,39 @@ ` 200 } - # 2. JSON Autodiscover (Modern Outlook) - bleibt gleich + # 2. Modern Outlook (JSON) - Redirect zum XML Endpoint route /autodiscover/autodiscover.json { header Content-Type "application/json" respond `{ "Protocol": "AutodiscoverV1", - "Url": "https://autodiscover.bayarea-cc.com/autodiscover/autodiscover.xml" + "Url": "https://autodiscover.{labels.1}.{labels.0}/autodiscover/autodiscover.xml" }` 200 } - # 3. Thunderbird Autoconfig - bleibt gleich (dort funktioniert %EMAILADDRESS% ja nativ) + # 3. Thunderbird Autoconfig route /mail/config-v1.1.xml { header Content-Type "application/xml" respond ` - - Rackspace Email + + {labels.1}.{labels.0} Mail + {labels.1}.{labels.0} - mail.email-srvr.com + imap.{labels.1}.{labels.0} 993 SSL password-cleartext %EMAILADDRESS% + + pop.{labels.1}.{labels.0} + 995 + SSL + password-cleartext + %EMAILADDRESS% + - mail.email-srvr.com + smtp.{labels.1}.{labels.0} 465 SSL password-cleartext @@ -78,20 +99,14 @@ ` 200 } - # NEU: Apple MobileConfig Route - # Aufrufbar über: /apple?email=kunde@domain.de + # 4. Apple MobileConfig route /apple { - # KORREKTUR: Wir müssen Caddy sagen, dass er diesen MIME-Type bearbeiten soll! templates { mime "application/x-apple-aspen-config" } - - # Den richtigen MIME-Type setzen header Content-Type "application/x-apple-aspen-config; charset=utf-8" - - # Pfad zur Datei im Container root * /etc/caddy rewrite * /email.mobileconfig.tpl file_server } -} \ No newline at end of file +} diff --git a/caddy/update-caddy-certs.sh b/caddy/update-caddy-certs.sh index ca0d076..8090ef0 100755 --- a/caddy/update-caddy-certs.sh +++ b/caddy/update-caddy-certs.sh @@ -5,6 +5,11 @@ # Liest alle Domains aus dem DMS und generiert die Wildcard-Cert-Blöcke # für Caddy in die Datei "mail_certs" (per "import mail_certs" im Caddyfile). # +# Generiert pro Domain: +# - Wildcard-Cert Block (*.domain + domain) +# - Webmail Block (reverse_proxy zu Roundcube) +# - Autodiscover/Autoconfig Block (importiert email_settings Snippet) +# # Bei neuen Domains: Script erneut laufen lassen + caddy reload. # # Usage: @@ -21,7 +26,6 @@ OUTPUT_FILE="$SCRIPT_DIR/mail_certs" DRY_RUN=${DRY_RUN:-"false"} # Node-Hostname des Mailservers (für Default-Cert Block) -# Wird immer mit eingetragen, auch wenn keine DMS-Accounts existieren. NODE_HOSTNAME=${NODE_HOSTNAME:-"node1.email-srvr.com"} echo "============================================================" @@ -55,7 +59,7 @@ echo "📝 Generiere Caddy-Konfiguration..." OUTPUT="" OUTPUT="${OUTPUT}# mail_certs - Automatisch generiert von update-caddy-certs.sh\n" -OUTPUT="${OUTPUT}# Wildcard-Zertifikate für DMS-Domains + Node-Hostname.\n" +OUTPUT="${OUTPUT}# Wildcard-Zertifikate + Webmail + Autodiscover für DMS-Domains.\n" OUTPUT="${OUTPUT}# Einbinden im Caddyfile: import mail_certs\n" OUTPUT="${OUTPUT}# Generiert: $(date)\n" OUTPUT="${OUTPUT}\n" @@ -70,12 +74,17 @@ OUTPUT="${OUTPUT} }\n" OUTPUT="${OUTPUT} respond \"OK\" 200\n" OUTPUT="${OUTPUT}}\n\n" -# Wildcard-Blocks + webmail Block pro Kundendomain +# Wildcard-Blocks + Webmail + Autodiscover pro Kundendomain for domain in $DOMAINS; do - echo " → Wildcard Block: *.${domain}" - echo " → Webmail Block: webmail.${domain}" + echo " → Wildcard Block: *.${domain}" + echo " → Webmail Block: webmail.${domain}" + echo " → Autodiscover Block: autodiscover.${domain}, autoconfig.${domain}" # Wildcard-Cert Block (für Cert-Generierung + Fallback) + OUTPUT="${OUTPUT}# ═══════════════════════════════════════════════\n" + OUTPUT="${OUTPUT}# ${domain}\n" + OUTPUT="${OUTPUT}# ═══════════════════════════════════════════════\n\n" + OUTPUT="${OUTPUT}# Wildcard-Cert für $domain\n" OUTPUT="${OUTPUT}*.${domain}, ${domain} {\n" OUTPUT="${OUTPUT} tls {\n" @@ -84,8 +93,7 @@ for domain in $DOMAINS; do OUTPUT="${OUTPUT} respond \"OK\" 200\n" OUTPUT="${OUTPUT}}\n\n" - # Webmail Block (Roundcube) - muss VOR dem Wildcard-Block matchen - # Caddy wertet Blöcke in Reihenfolge aus, spezifischere Hosts gewinnen + # Webmail Block (Roundcube) OUTPUT="${OUTPUT}# Roundcube Webmail für $domain\n" OUTPUT="${OUTPUT}webmail.${domain} {\n" OUTPUT="${OUTPUT} reverse_proxy roundcube:80\n" @@ -95,6 +103,13 @@ for domain in $DOMAINS; do OUTPUT="${OUTPUT} format console\n" OUTPUT="${OUTPUT} }\n" OUTPUT="${OUTPUT}}\n\n" + + # Autodiscover / Autoconfig Block + OUTPUT="${OUTPUT}# Autodiscover/Autoconfig für $domain\n" + OUTPUT="${OUTPUT}autodiscover.${domain}, autoconfig.${domain} {\n" + OUTPUT="${OUTPUT} import email_settings\n" + OUTPUT="${OUTPUT} respond \"Autodiscover Service Online\" 200\n" + OUTPUT="${OUTPUT}}\n\n" done # --- Ausgabe --- @@ -126,6 +141,26 @@ if [ -f "$CADDYFILE" ]; then echo " import email_autodiscover" echo " ..." fi + + # Autodiscover-Snippet prüfen + if grep -q "import email_autodiscover" "$CADDYFILE"; then + echo " ✅ 'import email_autodiscover' bereits im Caddyfile vorhanden." + else + echo "" + echo "⚠️ AKTION: 'import email_autodiscover' fehlt noch im Caddyfile!" + echo " Die Datei email_autodiscover enthält das (email_settings) Snippet." + fi +fi + +# --- Prüfe ob alte hartcodierte Autodiscover-Blöcke existieren --- +if [ -f "$CADDYFILE" ]; then + if grep -q "autodiscover\.bayarea-cc\.com\|autodiscover\.bizmatch\.net\|autodiscover\.ruehrgedoens\.de" "$CADDYFILE"; then + echo "" + echo "⚠️ AUFRÄUMEN: Alte hartcodierte Autodiscover-Blöcke im Caddyfile gefunden!" + echo " Diese werden jetzt dynamisch über mail_certs generiert." + echo " Bitte den alten 'Block A' manuell aus dem Caddyfile entfernen:" + echo " → autodiscover.bayarea-cc.com, autodiscover.bizmatch.net, ..." + fi fi echo "" @@ -144,4 +179,9 @@ echo "" echo "4. Cert-Pfade kontrollieren:" echo " ls /var/lib/docker/volumes/caddy_data/_data/caddy/certificates/" echo " acme-v02.api.letsencrypt.org-directory/" +echo "" +echo "5. Autodiscover testen:" +for domain in $DOMAINS; do + echo " curl -s https://autoconfig.${domain}/mail/config-v1.1.xml | head -5" +done echo "============================================================" \ No newline at end of file