feat(mail-service): Port-Konflikt behoben, SMTP-Konfig optimiert und dynamisches Plus-Addressing eingefügt

Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
This commit is contained in:
Stefan Mogeritsch 2026-04-15 13:44:28 +02:00
parent d0b756694b
commit a5f5e7a24b
8 changed files with 101 additions and 15 deletions

View File

@ -159,6 +159,82 @@ PING_DEBUG=true
PING_SERVICE_NAME=ping-service
PING_CONSUL_PREFER_IP=true
# --- MAIL-SERVICE ---
MAIL_PORT=8083:8085
MAIL_DEBUG_PORT=5014:5014
MAIL_SERVER_PORT=8085
MAIL_SPRING_PROFILES_ACTIVE=docker
MAIL_DEBUG=true
MAIL_SERVICE_NAME=mail-service
MAIL_CONSUL_PREFER_IP=true
MAIL_SMTP_HOST=smtp.world4you.com
MAIL_SMTP_PORT=587
MAIL_SMTP_USER=online-nennen@mo-code.at
MAIL_SMTP_PASSWORD=<DEIN_WORLD4YOU_PASSWORT>
MAIL_SMTP_AUTH=true
MAIL_SMTP_STARTTLS=true
# --- MASTERDATA-SERVICE ---
MASTERDATA_PORT=8086:8086
MASTERDATA_DEBUG_PORT=5007:5007
MASTERDATA_SERVER_PORT=8086
MASTERDATA_SPRING_PROFILES_ACTIVE=docker
MASTERDATA_DEBUG=true
MASTERDATA_SERVICE_NAME=masterdata-service
MASTERDATA_CONSUL_PREFER_IP=true
# --- EVENTS-SERVICE ---
EVENTS_PORT=8085:8085
EVENTS_DEBUG_PORT=5008:5008
EVENTS_SERVER_PORT=8085
EVENTS_SPRING_PROFILES_ACTIVE=docker
EVENTS_DEBUG=true
EVENTS_SERVICE_NAME=events-service
EVENTS_CONSUL_PREFER_IP=true
# --- ZNS-IMPORT-SERVICE ---
ZNS_IMPORT_PORT=8095:8095
ZNS_IMPORT_DEBUG_PORT=5009:5009
ZNS_IMPORT_SERVER_PORT=8095
ZNS_IMPORT_SPRING_PROFILES_ACTIVE=docker
ZNS_IMPORT_DEBUG=true
ZNS_IMPORT_SERVICE_NAME=zns-import-service
ZNS_IMPORT_CONSUL_PREFER_IP=true
# --- RESULTS-SERVICE ---
RESULTS_PORT=8088:8088
RESULTS_DEBUG_PORT=5010:5010
RESULTS_SERVER_PORT=8088
RESULTS_SPRING_PROFILES_ACTIVE=docker
RESULTS_DEBUG=true
RESULTS_SERVICE_NAME=results-service
RESULTS_CONSUL_PREFER_IP=true
# --- BILLING-SERVICE ---
BILLING_PORT=8087:8087
BILLING_DEBUG_PORT=5012:5012
BILLING_SERVER_PORT=8087
BILLING_SPRING_PROFILES_ACTIVE=docker
BILLING_DEBUG=true
BILLING_SERVICE_NAME=billing-service
BILLING_CONSUL_PREFER_IP=true
# --- SCHEDULING-SERVICE ---
SCHEDULING_PORT=8084:8084
SCHEDULING_DEBUG_PORT=5013:5013
SCHEDULING_SERVER_PORT=8084
SCHEDULING_SPRING_PROFILES_ACTIVE=docker
SCHEDULING_DEBUG=true
SCHEDULING_SERVICE_NAME=scheduling-service
SCHEDULING_CONSUL_PREFER_IP=true
# --- SERIES-SERVICE ---
SERIES_PORT=8089:8089
SERIES_DEBUG_PORT=5011:5011
SERIES_SERVER_PORT=8089
SERIES_SPRING_PROFILES_ACTIVE=docker
SERIES_DEBUG=true
# --- WEB-APP ---
WEB_APP_PORT=4000:4000
# URL für API-Zugriffe vom Browser (Public URL via Pangolin)

View File

@ -6,6 +6,7 @@ import jakarta.validation.Valid
import jakarta.validation.constraints.Email
import jakarta.validation.constraints.NotBlank
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Value
import org.springframework.mail.SimpleMailMessage
import org.springframework.mail.javamail.JavaMailSender
import org.springframework.web.bind.annotation.*
@ -45,6 +46,9 @@ class MailController(
) {
private val logger = LoggerFactory.getLogger(MailController::class.java)
@Value("\${spring.mail.username}")
private lateinit var baseMailAddress: String
@PostMapping("/nennung")
fun receiveNennung(@Valid @RequestBody request: NennungRequest) {
logger.info("Nennung via API erhalten: ${request.vorname} ${request.nachname} für Turnier ${request.turnierNr}")
@ -70,7 +74,16 @@ class MailController(
// Bestätigung an Reiter senden
try {
val message = SimpleMailMessage()
message.from = "online-nennen@mo-code.at"
// Dynamische Absenderadresse mit Plus-Addressing (z.B. online-nennen+26128@mo-code.at)
val dynamicFrom = try {
val (user, domain) = baseMailAddress.split("@")
"$user+${request.turnierNr}@$domain"
} catch (e: Exception) {
baseMailAddress
}
message.from = dynamicFrom
message.setTo(request.email)
message.subject = "Bestätigung: Ihre Online-Nennung für Turnier ${request.turnierNr}"
message.text = """

View File

@ -11,19 +11,12 @@ spring:
ddl-auto: update
show-sql: true
mail:
host: ${SPRING_MAIL_HOST:imap.world4you.com}
port: ${SPRING_MAIL_PORT:993}
host: ${SPRING_MAIL_HOST:smtp.world4you.com}
port: ${SPRING_MAIL_PORT:587}
username: ${SPRING_MAIL_USERNAME:online-nennen@mo-code.at}
password: ${SPRING_MAIL_PASSWORD:}
properties:
mail:
store:
protocol: imaps
imaps:
host: ${SPRING_MAIL_HOST:imap.world4you.com}
port: ${SPRING_MAIL_PORT:993}
ssl:
enable: true
smtp:
auth: ${SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTH:true}
starttls:

View File

@ -559,7 +559,7 @@ services:
container_name: "${PROJECT_NAME:-meldestelle}-mail-service"
restart: unless-stopped
ports:
- "${MAIL_PORT:-8085:8085}"
- "${MAIL_PORT:-8083:8085}"
- "${MAIL_DEBUG_PORT:-5014:5014}"
environment:
SPRING_PROFILES_ACTIVE: "${MAIL_SPRING_PROFILES_ACTIVE:-docker}"
@ -710,7 +710,7 @@ services:
SPRING_PROFILES_ACTIVE: "${SERIES_SPRING_PROFILES_ACTIVE:-docker}"
DEBUG: "${SERIES_DEBUG:-true}"
SERVER_PORT: "${SERIES_SERVER_PORT:-8089}"
SPRING_APPLICATION_NAME: "series-service"
SPRING_APPLICATION_NAME: "${SERIES_SERVICE_NAME:-series-service}"
# --- KEYCLOAK ---
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI: "${KC_ISSUER_URI:-http://keycloak:8080/realms/meldestelle}"

View File

@ -8,10 +8,14 @@
## 👷 Durchgeführte Arbeiten (DevOps & Frontend)
1. **Infrastruktur (Docker):**
1. **Infrastruktur (Docker & Mail):**
- Dockerfile für `mail-service` erstellt.
- `dc-backend.yaml` um den `mail-service` erweitert (inkl. Postgres-Link, Consul-Discovery und SMTP-Konfiguration).
- `application.yaml` im `mail-service` für dynamische Konfiguration via Environment-Variablen fit gemacht.
- Port-Kollision zwischen `events-service` und `mail-service` behoben (`mail-service` Host-Port auf 8083).
- `.env` und `.env.example` (SSoT) umfassend für alle Microservices (Standard-Ports, Debug, SMTP) vervollständigt.
- `application.yaml` im `mail-service` auf SMTP-Versand (World4You Standard) optimiert und IMAP-Reste entfernt.
- **Plus-Addressing:** Backend-Logik im `MailController` implementiert, um Mails dynamisch als
`online-nennen+[TurnierNr]@mo-code.at` zu versenden.
2. **Frontend (Konfigurierbarkeit):**
- Common `PlatformConfig` erweitert um `resolveMailServiceUrl`.
- Implementierung für Wasm, JS und JVM hinzugefügt, um Backend-URLs zur Laufzeit steuern zu können (Wasm: via global

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View File

@ -28,7 +28,7 @@ actual object PlatformConfig {
// 2) Try window location origin (same origin gateway/proxy setup)
val origin = try {
getOrigin()
} catch (e: Throwable) {
} catch (_: Throwable) {
null
}