#!/bin/bash # manage_mail_user.sh # Verwaltet E-Mail-User im DMS und synchronisiert die Liste mit AWS SES # # Usage: # ./manage_mail_user.sh add user@domain.com "Password123" # ./manage_mail_user.sh del user@domain.com # ./manage_mail_user.sh sync domain.com set -e COMMAND=$1 EMAIL=$2 PASSWORD=$3 # Container Name deines DMS DMS_CONTAINER="mailserver-new" AWS_REGION="us-east-2" # Hilfsfunktion: Usage usage() { echo "Verwendung:" echo " Account anlegen: $0 add " echo " Account löschen: $0 del " echo " Nur Sync zu AWS: $0 sync " exit 1 } # Parameter prüfen if [ -z "$COMMAND" ]; then usage; fi # Domain extrahieren (falls Email gegeben) if [ "$COMMAND" != "sync" ]; then if [ -z "$EMAIL" ]; then usage; fi DOMAIN=$(echo "$EMAIL" | cut -d'@' -f2) else # Beim Sync ist der 2. Parameter die Domain DOMAIN=$2 if [ -z "$DOMAIN" ]; then usage; fi fi # Regel-Namen konstruieren (Dein Namensschema: store-domain-com-to-s3) RULE_SET_NAME="bizmatch-ruleset" # Dein globaler Ruleset Name RULE_NAME="store-${DOMAIN//./-}-to-s3" echo "============================================================" echo "Managing User for Domain: $DOMAIN" echo "Action: $COMMAND" echo "SES Rule: $RULE_NAME" echo "============================================================" # 1. Aktion im Docker Mailserver ausführen if [ "$COMMAND" == "add" ]; then if [ -z "$PASSWORD" ]; then echo "Error: Passwort fehlt für 'add'." exit 1 fi echo "-> [DMS] Erstelle Postfach $EMAIL..." docker exec "$DMS_CONTAINER" setup email add "$EMAIL" "$PASSWORD" elif [ "$COMMAND" == "del" ]; then echo "-> [DMS] Lösche Postfach $EMAIL..." docker exec "$DMS_CONTAINER" setup email del "$EMAIL" elif [ "$COMMAND" == "sync" ]; then echo "-> [Sync] Starte manuelle Synchronisation..." else usage fi # 2. Liste aller User dieser Domain aus DMS holen ("Source of Truth") echo "-> Lese aktuelle User-Liste aus DMS..." # 'setup email list' format: "* user@domain.com (0/0)" -> awk holt die Email RECIPIENTS_LIST=$(docker exec "$DMS_CONTAINER" setup email list | grep "@$DOMAIN" | awk '{print $2}' | sort) # Prüfen ob User vorhanden sind if [ -z "$RECIPIENTS_LIST" ]; then echo "WARNUNG: Keine User für $DOMAIN im DMS gefunden!" echo "SES Rule wird NICHT aktualisiert, um Stillstand zu vermeiden." exit 1 fi # Zählen (Limit Check) COUNT=$(echo "$RECIPIENTS_LIST" | wc -l) echo "-> Gefundene User: $COUNT" if [ "$COUNT" -gt 100 ]; then echo "CRITICAL ERROR: AWS SES erlaubt maximal 100 Empfänger pro Regel!" echo "Gefunden: $COUNT. Abbruch." exit 1 fi # JSON Array für AWS CLI bauen # Wir bauen: "user1@domain.com", "user2@domain.com", ... JSON_RECIPIENTS=$(echo "$RECIPIENTS_LIST" | jq -R . | jq -s .) echo "-> Neue Empfänger-Liste für SES:" echo "$JSON_RECIPIENTS" # 3. AWS SES Rule updaten echo "-> [AWS] Hole aktuelle Regel-Definition..." CURRENT_RULE=$(aws ses describe-receipt-rule \ --rule-set-name "$RULE_SET_NAME" \ --rule-name "$RULE_NAME" \ --region "$AWS_REGION" \ --output json) # Wir müssen das JSON patchen. Wir ersetzen den "Recipients" Block. # jq Trick: .Rule.Recipients = $new_list | .Rule NEW_RULE_JSON=$(echo "$CURRENT_RULE" | jq --argjson recipients "$JSON_RECIPIENTS" '.Rule | .Recipients = $recipients') # WICHTIG: TlsPolicy ist im Output oft lowercase, update erwartet CamelCase oder es ist tricky. # Wir bauen das Update Command sicherheitshalber explizit. echo "-> [AWS] Sende Update an SES..." # KORREKTUR: --rule-name entfernt, da der Name im JSON ($NEW_RULE_JSON) enthalten ist aws ses update-receipt-rule \ --rule-set-name "$RULE_SET_NAME" \ --rule "$NEW_RULE_JSON" \ --region "$AWS_REGION" echo "============================================================" echo "✅ Success! User angelegt/gelöscht und SES Rule aktualisiert." echo "============================================================"