123 lines
3.9 KiB
Bash
Executable File
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 "============================================================" |