diff --git a/caddy/email-setup/autodiscover.xml b/caddy/email-setup/autodiscover.xml deleted file mode 100644 index b855f09..0000000 --- a/caddy/email-setup/autodiscover.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - email - settings - - IMAP - mail.email-srvr.com - 993 - off - - off - on - on - - - SMTP - mail.email-srvr.com - 465 - off - - off - on - on - - - - \ No newline at end of file diff --git a/caddy/email.mobileconfig.tpl b/caddy/email.mobileconfig.tpl index 55c3d8e..43944eb 100644 --- a/caddy/email.mobileconfig.tpl +++ b/caddy/email.mobileconfig.tpl @@ -1,67 +1,85 @@ +{{/* ─────────────────────────────────────────────────── + Apple MobileConfig Template (Caddy templates) + + Dynamisch: Leitet die Basisdomain aus dem Host-Header ab. + Erwartet Aufruf auf autodiscover./apple?email=user@domain + + Hostname-Logik: + Host = autodiscover.cielectrical.com + splitList "." .Req.Host → [autodiscover, cielectrical, com] + Basisdomain = cielectrical.com (Index 1+) + IMAP = imap.cielectrical.com + SMTP = smtp.cielectrical.com + ─────────────────────────────────────────────────── */}} +{{- $email := .Req.URL.Query.Get "email" -}} +{{- $hostParts := splitList "." .Req.Host -}} +{{- $baseDomain := join "." (slice $hostParts 1) -}} PayloadContent EmailAccountDescription - {{.Req.URL.Query.Get "email"}} + {{ $email }} EmailAccountName - {{.Req.URL.Query.Get "email"}} + {{ $email }} EmailAccountType EmailTypeIMAP EmailAddress - {{.Req.URL.Query.Get "email"}} + {{ $email }} IncomingMailServerAuthentication EmailAuthPassword IncomingMailServerHostName - mail.email-srvr.com + imap.{{ $baseDomain }} IncomingMailServerPortNumber 993 IncomingMailServerUseSSL - + > IncomingMailServerUsername - {{.Req.URL.Query.Get "email"}} + {{ $email }} OutgoingMailServerAuthentication EmailAuthPassword OutgoingMailServerHostName - mail.email-srvr.com + smtp.{{ $baseDomain }} OutgoingMailServerPortNumber 465 OutgoingMailServerUseSSL OutgoingMailServerUsername - {{.Req.URL.Query.Get "email"}} + {{ $email }} + OutgoingPasswordRequired + PayloadDescription - E-Mail Konfiguration für {{.Req.URL.Query.Get "email"}} + E-Mail Konfiguration für {{ $email }} PayloadDisplayName - {{.Req.URL.Query.Get "email"}} + {{ $baseDomain }} E-Mail PayloadIdentifier - com.email-srvr.profile.{{.Req.URL.Query.Get "email"}} + com.{{ $baseDomain }}.email.account PayloadType com.apple.mail.managed PayloadUUID - {{uuidv4}} + {{ uuidv4 }} PayloadVersion 1 PayloadDescription - Automatische E-Mail Einrichtung für {{.Req.URL.Query.Get "email"}} + Automatische E-Mail Einrichtung für {{ $email }} PayloadDisplayName - E-Mail Einstellungen + {{ $baseDomain }} E-Mail Einstellungen PayloadIdentifier - com.email-srvr.profile.root + com.{{ $baseDomain }}.email.profile PayloadOrganization - IT Support + Bay Area Affiliates, Inc. PayloadRemovalDisallowed PayloadType Configuration PayloadUUID - {{uuidv4}} + {{ uuidv4 }} PayloadVersion 1 - \ No newline at end of file + diff --git a/caddy/email_autodiscover b/caddy/email_autodiscover deleted file mode 100644 index 78ccedd..0000000 --- a/caddy/email_autodiscover +++ /dev/null @@ -1,112 +0,0 @@ -# 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. Outlook Autodiscover (XML) - route /autodiscover/autodiscover.xml { - header Content-Type "application/xml" - respond ` - - - - email - settings - - IMAP - imap.{labels.1}.{labels.0} - 993 - on - {header.X-Anchormailbox} - off - on - on - - - POP3 - pop.{labels.1}.{labels.0} - 995 - on - {header.X-Anchormailbox} - off - on - on - - - SMTP - smtp.{labels.1}.{labels.0} - 465 - on - {header.X-Anchormailbox} - off - on - on - - - -` 200 - } - - # 2. Modern Outlook (JSON) - Redirect zum XML Endpoint - route /autodiscover/autodiscover.json { - header Content-Type "application/json" - respond `{ - "Protocol": "AutodiscoverV1", - "Url": "https://autodiscover.{labels.1}.{labels.0}/autodiscover/autodiscover.xml" - }` 200 - } - - # 3. Thunderbird Autoconfig - route /mail/config-v1.1.xml { - header Content-Type "application/xml" - respond ` - - - {labels.1}.{labels.0} Mail - {labels.1}.{labels.0} - - imap.{labels.1}.{labels.0} - 993 - SSL - password-cleartext - %EMAILADDRESS% - - - pop.{labels.1}.{labels.0} - 995 - SSL - password-cleartext - %EMAILADDRESS% - - - smtp.{labels.1}.{labels.0} - 465 - SSL - password-cleartext - %EMAILADDRESS% - - -` 200 - } - - # 4. Apple MobileConfig - route /apple { - templates { - mime "application/x-apple-aspen-config" - } - header Content-Type "application/x-apple-aspen-config; charset=utf-8" - root * /etc/caddy - rewrite * /email.mobileconfig.tpl - file_server - } -} diff --git a/caddy/update-caddy-certs.sh b/caddy/update-caddy-certs.sh index 34a6157..50343c7 100755 --- a/caddy/update-caddy-certs.sh +++ b/caddy/update-caddy-certs.sh @@ -9,6 +9,7 @@ # - Wildcard-Cert Block (*.domain + domain) # - Webmail Block (reverse_proxy zu Roundcube) # - Autodiscover/Autoconfig Block (importiert email_settings Snippet) +# - Email-Setup Block (QR-Code Seite für iPhone) # # Bei neuen Domains: Script erneut laufen lassen + caddy reload. # @@ -64,13 +65,18 @@ OUTPUT="${OUTPUT}# Einbinden im Caddyfile: import mail_certs\n" OUTPUT="${OUTPUT}# Generiert: $(date)\n" OUTPUT="${OUTPUT}\n" -# --- Autodiscover/Autoconfig Snippet einbetten --- +# ===================================================================== +# Autodiscover/Autoconfig Snippet (dynamisch) +# {labels.1}.{labels.0} = Basisdomain aus Hostname +# ===================================================================== OUTPUT="${OUTPUT}# ═══════════════════════════════════════════════\n" OUTPUT="${OUTPUT}# Autodiscover/Autoconfig Snippet (dynamisch)\n" OUTPUT="${OUTPUT}# {labels.1}.{labels.0} = Basisdomain aus Hostname\n" OUTPUT="${OUTPUT}# ═══════════════════════════════════════════════\n" OUTPUT="${OUTPUT}(email_settings) {\n" -OUTPUT="${OUTPUT} # Outlook Autodiscover (XML)\n" + +# --- 1. Outlook Classic Autodiscover (POST + GET XML) --- +OUTPUT="${OUTPUT} # Outlook Autodiscover (XML) - POST und GET\n" OUTPUT="${OUTPUT} route /autodiscover/autodiscover.xml {\n" OUTPUT="${OUTPUT} header Content-Type \"application/xml\"\n" OUTPUT="${OUTPUT} respond \`\n" @@ -83,18 +89,8 @@ OUTPUT="${OUTPUT} \n" OUTPUT="${OUTPUT} IMAP\n" OUTPUT="${OUTPUT} imap.{labels.1}.{labels.0}\n" OUTPUT="${OUTPUT} 993\n" -OUTPUT="${OUTPUT} on\n" -OUTPUT="${OUTPUT} {header.X-Anchormailbox}\n" -OUTPUT="${OUTPUT} off\n" -OUTPUT="${OUTPUT} on\n" -OUTPUT="${OUTPUT} on\n" -OUTPUT="${OUTPUT} \n" -OUTPUT="${OUTPUT} \n" -OUTPUT="${OUTPUT} POP3\n" -OUTPUT="${OUTPUT} pop.{labels.1}.{labels.0}\n" -OUTPUT="${OUTPUT} 995\n" -OUTPUT="${OUTPUT} on\n" -OUTPUT="${OUTPUT} {header.X-Anchormailbox}\n" +OUTPUT="${OUTPUT} off\n" +OUTPUT="${OUTPUT} \n" OUTPUT="${OUTPUT} off\n" OUTPUT="${OUTPUT} on\n" OUTPUT="${OUTPUT} on\n" @@ -103,8 +99,8 @@ OUTPUT="${OUTPUT} \n" OUTPUT="${OUTPUT} SMTP\n" OUTPUT="${OUTPUT} smtp.{labels.1}.{labels.0}\n" OUTPUT="${OUTPUT} 465\n" -OUTPUT="${OUTPUT} on\n" -OUTPUT="${OUTPUT} {header.X-Anchormailbox}\n" +OUTPUT="${OUTPUT} off\n" +OUTPUT="${OUTPUT} \n" OUTPUT="${OUTPUT} off\n" OUTPUT="${OUTPUT} on\n" OUTPUT="${OUTPUT} on\n" @@ -114,15 +110,18 @@ OUTPUT="${OUTPUT} \n" OUTPUT="${OUTPUT}\` 200\n" OUTPUT="${OUTPUT} }\n" OUTPUT="${OUTPUT}\n" -OUTPUT="${OUTPUT} # Modern Outlook (JSON)\n" + +# --- 2. Outlook New / Microsoft 365 (JSON v2) --- +# Outlook New sendet GET auf /autodiscover/autodiscover.json?Protocol=AutodiscoverV1&... +# Antwort muss den XML-Endpoint zurückgeben +OUTPUT="${OUTPUT} # Outlook New/365 (JSON → Redirect zu XML)\n" OUTPUT="${OUTPUT} route /autodiscover/autodiscover.json {\n" OUTPUT="${OUTPUT} header Content-Type \"application/json\"\n" -OUTPUT="${OUTPUT} respond \`{\n" -OUTPUT="${OUTPUT} \"Protocol\": \"AutodiscoverV1\",\n" -OUTPUT="${OUTPUT} \"Url\": \"https://autodiscover.{labels.1}.{labels.0}/autodiscover/autodiscover.xml\"\n" -OUTPUT="${OUTPUT} }\` 200\n" +OUTPUT="${OUTPUT} respond \`{\"Protocol\":\"AutodiscoverV1\",\"Url\":\"https://autodiscover.{labels.1}.{labels.0}/autodiscover/autodiscover.xml\"}\` 200\n" OUTPUT="${OUTPUT} }\n" OUTPUT="${OUTPUT}\n" + +# --- 3. Thunderbird Autoconfig --- OUTPUT="${OUTPUT} # Thunderbird Autoconfig\n" OUTPUT="${OUTPUT} route /mail/config-v1.1.xml {\n" OUTPUT="${OUTPUT} header Content-Type \"application/xml\"\n" @@ -138,13 +137,6 @@ OUTPUT="${OUTPUT} SSL\n" OUTPUT="${OUTPUT} password-cleartext\n" OUTPUT="${OUTPUT} %%EMAILADDRESS%%\n" OUTPUT="${OUTPUT} \n" -OUTPUT="${OUTPUT} \n" -OUTPUT="${OUTPUT} pop.{labels.1}.{labels.0}\n" -OUTPUT="${OUTPUT} 995\n" -OUTPUT="${OUTPUT} SSL\n" -OUTPUT="${OUTPUT} password-cleartext\n" -OUTPUT="${OUTPUT} %%EMAILADDRESS%%\n" -OUTPUT="${OUTPUT} \n" OUTPUT="${OUTPUT} \n" OUTPUT="${OUTPUT} smtp.{labels.1}.{labels.0}\n" OUTPUT="${OUTPUT} 465\n" @@ -156,16 +148,41 @@ OUTPUT="${OUTPUT} \n" OUTPUT="${OUTPUT}\` 200\n" OUTPUT="${OUTPUT} }\n" OUTPUT="${OUTPUT}\n" -OUTPUT="${OUTPUT} # Apple MobileConfig\n" + +# --- 4. Apple MobileConfig (Template) --- +OUTPUT="${OUTPUT} # Apple MobileConfig (dynamisches Template)\n" OUTPUT="${OUTPUT} route /apple {\n" OUTPUT="${OUTPUT} templates {\n" OUTPUT="${OUTPUT} mime \"application/x-apple-aspen-config\"\n" OUTPUT="${OUTPUT} }\n" OUTPUT="${OUTPUT} header Content-Type \"application/x-apple-aspen-config; charset=utf-8\"\n" +OUTPUT="${OUTPUT} header Content-Disposition \"attachment; filename=email.mobileconfig\"\n" OUTPUT="${OUTPUT} root * /etc/caddy\n" OUTPUT="${OUTPUT} rewrite * /email.mobileconfig.tpl\n" OUTPUT="${OUTPUT} file_server\n" OUTPUT="${OUTPUT} }\n" + +# --- 5. Samsung Email (nutzt ebenfalls autoconfig, kein extra Block nötig) --- +# Samsung Email-App versucht: +# 1. https://autoconfig./mail/config-v1.1.xml (= Thunderbird-Format, schon abgedeckt) +# 2. Alternativ: Outlook Autodiscover XML +# → Kein separater Block erforderlich. + +OUTPUT="${OUTPUT}}\n\n" + +# ===================================================================== +# Email-Setup Snippet (QR-Code Seite für iPhone) +# ===================================================================== +OUTPUT="${OUTPUT}# ═══════════════════════════════════════════════\n" +OUTPUT="${OUTPUT}# Email-Setup Snippet (QR-Code Seite)\n" +OUTPUT="${OUTPUT}# ═══════════════════════════════════════════════\n" +OUTPUT="${OUTPUT}(email_setup_page) {\n" +OUTPUT="${OUTPUT} route /email-setup* {\n" +OUTPUT="${OUTPUT} uri strip_prefix /email-setup\n" +OUTPUT="${OUTPUT} root * /var/www/email-setup\n" +OUTPUT="${OUTPUT} try_files {path} /setup.html\n" +OUTPUT="${OUTPUT} file_server\n" +OUTPUT="${OUTPUT} }\n" OUTPUT="${OUTPUT}}\n\n" # Node-Hostname immer als erstes (Default-Cert des DMS) @@ -183,6 +200,7 @@ for domain in $DOMAINS; do echo " → Wildcard Block: *.${domain}" echo " → Webmail Block: webmail.${domain}" echo " → Autodiscover Block: autodiscover.${domain}, autoconfig.${domain}" + echo " → Email-Setup Block: webmail.${domain}/email-setup" # Wildcard-Cert Block (für Cert-Generierung + Fallback) OUTPUT="${OUTPUT}# ═══════════════════════════════════════════════\n" @@ -197,9 +215,10 @@ for domain in $DOMAINS; do OUTPUT="${OUTPUT} respond \"OK\" 200\n" OUTPUT="${OUTPUT}}\n\n" - # Webmail Block (Roundcube) - OUTPUT="${OUTPUT}# Roundcube Webmail für $domain\n" + # Webmail Block (Roundcube + Email-Setup) + OUTPUT="${OUTPUT}# Roundcube Webmail + Email-Setup für $domain\n" OUTPUT="${OUTPUT}webmail.${domain} {\n" + OUTPUT="${OUTPUT} import email_setup_page\n" OUTPUT="${OUTPUT} reverse_proxy roundcube:80\n" OUTPUT="${OUTPUT} encode gzip\n" OUTPUT="${OUTPUT} log {\n" @@ -253,15 +272,17 @@ if [ -f "$CADDYFILE" ]; then 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 +# --- Prüfe ob alte Dateien noch existieren --- +if [ -f "$SCRIPT_DIR/email_autodiscover" ]; then + echo "" + echo "⚠️ AUFRÄUMEN: Datei 'email_autodiscover' kann entfernt werden!" + echo " Das Snippet ist jetzt in mail_certs eingebettet." +fi + +if [ -f "$SCRIPT_DIR/email-setup/autodiscover.xml" ]; then + echo "" + echo "⚠️ AUFRÄUMEN: 'email-setup/autodiscover.xml' kann entfernt werden!" + echo " Statische XML wird nicht mehr benötigt (dynamisch über Caddy)." fi echo "" @@ -277,12 +298,18 @@ echo "" echo "3. Cert-Generierung verfolgen (~30s pro Domain):" echo " docker logs -f $CADDY_CONTAINER 2>&1 | grep -i 'certificate\|acme\|tls\|error'" 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:" +echo "4. Autodiscover testen:" for domain in $DOMAINS; do - echo " curl -s https://autoconfig.${domain}/mail/config-v1.1.xml | head -5" + echo " # Thunderbird:" + echo " curl -s https://autoconfig.${domain}/mail/config-v1.1.xml | head -10" + echo " # Outlook:" + echo " curl -s https://autodiscover.${domain}/autodiscover/autodiscover.xml | head -10" + echo " # Apple (sollte .mobileconfig liefern):" + echo " curl -sI \"https://autodiscover.${domain}/apple?email=test@${domain}\"" + echo "" +done +echo "5. iPhone Email-Setup QR-Code Seite:" +for domain in $DOMAINS; do + echo " https://webmail.${domain}/email-setup" done echo "============================================================" \ No newline at end of file