email-amazon/basic_setup/manage_mail_user.sh

123 lines
3.9 KiB
Bash
Executable File

#!/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 <email> <password>"
echo " Account löschen: $0 del <email>"
echo " Nur Sync zu AWS: $0 sync <domain>"
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 "============================================================"