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