email-amazon/basic_setup/email-rule.sh

431 lines
12 KiB
Bash
Executable File

#!/bin/bash
# AWS Region
REGION="us-east-2"
TABLE_NAME="email-rules"
# Farben für Output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Logging-Funktionen
info() { echo -e "${GREEN}${NC} $1"; }
warn() { echo -e "${YELLOW}${NC} $1"; }
error() { echo -e "${RED}${NC} $1"; exit 1; }
# Hilfe-Funktion
show_help() {
cat << EOF
Usage: $0 <command> [options]
Commands:
set-ooo <email> <message> [--html]
Setzt Out-of-Office Nachricht
--html: Nachricht ist HTML-formatiert (default: text)
set-forward <email> <address1>[,address2,...]
Setzt Forward-Adressen (überschreibt bestehende)
add-forward <email> <address1>[,address2,...]
Fügt Forward-Adressen hinzu (behält bestehende)
remove-ooo <email>
Entfernt Out-of-Office Regel
remove-forward <email>
Entfernt alle Forward-Adressen
remove-all <email>
Löscht komplette Regel (OOO + Forwards)
show <email>
Zeigt aktuelle Regel
list
Listet alle Regeln auf
Examples:
$0 set-ooo john@example.com "I'm on vacation until Monday"
$0 set-ooo john@example.com "<p>Out of office</p>" --html
$0 set-forward john@example.com alice@example.com,bob@example.com
$0 add-forward john@example.com charlie@example.com
$0 show john@example.com
$0 remove-all john@example.com
EOF
}
# Prüft ob Regel existiert
rule_exists() {
local email=$1
aws dynamodb get-item \
--table-name "$TABLE_NAME" \
--key '{"email_address": {"S": "'"$email"'"}}' \
--region "$REGION" \
--output json 2>/dev/null | jq -e '.Item' > /dev/null
}
# Holt aktuelle Regel
get_rule() {
local email=$1
aws dynamodb get-item \
--table-name "$TABLE_NAME" \
--key '{"email_address": {"S": "'"$email"'"}}' \
--region "$REGION" \
--output json 2>/dev/null | jq -r '.Item // {}'
}
# Validiert E-Mail-Adresse (basic)
validate_email() {
local email=$1
if [[ ! "$email" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
error "Ungültige E-Mail-Adresse: $email"
fi
}
# ==============================================
# COMMAND: set-ooo
# ==============================================
cmd_set_ooo() {
local email=$1
local message=$2
local content_type="text"
if [ "$3" = "--html" ]; then
content_type="html"
fi
if [ -z "$email" ] || [ -z "$message" ]; then
error "Usage: $0 set-ooo <email> <message> [--html]"
fi
validate_email "$email"
# Hole bestehende Forwards (falls vorhanden)
local existing_rule=$(get_rule "$email")
local forwards_json='{"L": []}'
if [ "$existing_rule" != "{}" ]; then
forwards_json=$(echo "$existing_rule" | jq -r '.forwards // {"L": []}')
warn "Regel existiert bereits, behalte bestehende Forwards bei"
fi
# Setze Regel
aws dynamodb put-item \
--table-name "$TABLE_NAME" \
--item '{
"email_address": {"S": "'"$email"'"},
"ooo_active": {"BOOL": true},
"ooo_message": {"S": "'"${message//\"/\\\"}"'"},
"ooo_content_type": {"S": "'"$content_type"'"},
"forwards": '"$forwards_json"',
"last_updated": {"S": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"}
}' \
--region "$REGION" >/dev/null
info "Out-of-Office aktiviert für $email ($content_type)"
}
# ==============================================
# COMMAND: set-forward
# ==============================================
cmd_set_forward() {
local email=$1
local forward_addresses=$2
if [ -z "$email" ] || [ -z "$forward_addresses" ]; then
error "Usage: $0 set-forward <email> <address1>[,address2,...]"
fi
validate_email "$email"
# Validiere alle Forward-Adressen
IFS=',' read -ra ADDRS <<< "$forward_addresses"
for addr in "${ADDRS[@]}"; do
validate_email "$(echo "$addr" | xargs)" # xargs trimmt whitespace
done
# Konvertiere zu JSON-Array
local forwards_list=$(echo "$forward_addresses" | jq -R 'split(",") | map(gsub("^\\s+|\\s+$";"")) | map({"S": .})')
# Hole bestehende OOO-Einstellungen (falls vorhanden)
local existing_rule=$(get_rule "$email")
local ooo_active="false"
local ooo_message=""
local ooo_content_type="text"
if [ "$existing_rule" != "{}" ]; then
ooo_active=$(echo "$existing_rule" | jq -r '.ooo_active.BOOL // false')
ooo_message=$(echo "$existing_rule" | jq -r '.ooo_message.S // ""')
ooo_content_type=$(echo "$existing_rule" | jq -r '.ooo_content_type.S // "text"')
warn "Regel existiert bereits, behalte bestehende OOO-Einstellungen bei"
fi
# Setze Regel
aws dynamodb put-item \
--table-name "$TABLE_NAME" \
--item '{
"email_address": {"S": "'"$email"'"},
"ooo_active": {"BOOL": '"$ooo_active"'},
"ooo_message": {"S": "'"${ooo_message//\"/\\\"}"'"},
"ooo_content_type": {"S": "'"$ooo_content_type"'"},
"forwards": {"L": '"$forwards_list"'},
"last_updated": {"S": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"}
}' \
--region "$REGION" >/dev/null
info "Forwards gesetzt für $email: ${ADDRS[*]}"
}
# ==============================================
# COMMAND: add-forward
# ==============================================
cmd_add_forward() {
local email=$1
local new_addresses=$2
if [ -z "$email" ] || [ -z "$new_addresses" ]; then
error "Usage: $0 add-forward <email> <address1>[,address2,...]"
fi
validate_email "$email"
if ! rule_exists "$email"; then
error "Keine Regel für $email gefunden. Nutze 'set-forward' stattdessen."
fi
# Hole bestehende Forwards
local existing_rule=$(get_rule "$email")
local existing_forwards=$(echo "$existing_rule" | jq -r '.forwards.L // [] | map(.S) | join(",")')
# Kombiniere und dedupliziere
local combined="$existing_forwards,$new_addresses"
IFS=',' read -ra ALL_ADDRS <<< "$combined"
# Dedupliziere und validiere
declare -A seen
local unique_addrs=()
for addr in "${ALL_ADDRS[@]}"; do
addr=$(echo "$addr" | xargs) # Trim whitespace
if [ -n "$addr" ] && [ -z "${seen[$addr]}" ]; then
validate_email "$addr"
seen[$addr]=1
unique_addrs+=("$addr")
fi
done
# Konvertiere zu Komma-separiertem String
local final_list=$(IFS=','; echo "${unique_addrs[*]}")
# Nutze set-forward mit kombinierter Liste
cmd_set_forward "$email" "$final_list"
info "Forwards hinzugefügt (insgesamt ${#unique_addrs[@]} Adressen)"
}
# ==============================================
# COMMAND: remove-ooo
# ==============================================
cmd_remove_ooo() {
local email=$1
if [ -z "$email" ]; then
error "Usage: $0 remove-ooo <email>"
fi
validate_email "$email"
if ! rule_exists "$email"; then
warn "Keine Regel für $email gefunden"
return 0
fi
# Update: OOO deaktivieren, Message-Felder entfernen
aws dynamodb update-item \
--table-name "$TABLE_NAME" \
--key '{"email_address": {"S": "'"$email"'"}}' \
--update-expression "SET ooo_active = :false, last_updated = :timestamp REMOVE ooo_message, ooo_content_type" \
--expression-attribute-values '{
":false": {"BOOL": false},
":timestamp": {"S": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"}
}' \
--region "$REGION" >/dev/null
info "Out-of-Office entfernt für $email"
}
# ==============================================
# COMMAND: remove-forward
# ==============================================
cmd_remove_forward() {
local email=$1
if [ -z "$email" ]; then
error "Usage: $0 remove-forward <email>"
fi
validate_email "$email"
if ! rule_exists "$email"; then
warn "Keine Regel für $email gefunden"
return 0
fi
# Update: Forwards leeren
aws dynamodb update-item \
--table-name "$TABLE_NAME" \
--key '{"email_address": {"S": "'"$email"'"}}' \
--update-expression "SET forwards = :empty, last_updated = :timestamp" \
--expression-attribute-values '{
":empty": {"L": []},
":timestamp": {"S": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"}
}' \
--region "$REGION" >/dev/null
info "Forwards entfernt für $email"
}
# ==============================================
# COMMAND: remove-all
# ==============================================
cmd_remove_all() {
local email=$1
if [ -z "$email" ]; then
error "Usage: $0 remove-all <email>"
fi
validate_email "$email"
if ! rule_exists "$email"; then
warn "Keine Regel für $email gefunden"
return 0
fi
aws dynamodb delete-item \
--table-name "$TABLE_NAME" \
--key '{"email_address": {"S": "'"$email"'"}}' \
--region "$REGION" >/dev/null
info "Regel komplett gelöscht für $email"
}
# ==============================================
# COMMAND: show
# ==============================================
cmd_show() {
local email=$1
if [ -z "$email" ]; then
error "Usage: $0 show <email>"
fi
validate_email "$email"
if ! rule_exists "$email"; then
warn "Keine Regel für $email gefunden"
return 0
fi
local rule=$(get_rule "$email")
echo ""
echo "Regel für: $email"
echo "─────────────────────────────────────────"
# OOO Status
local ooo_active=$(echo "$rule" | jq -r '.ooo_active.BOOL // false')
if [ "$ooo_active" = "true" ]; then
local ooo_msg=$(echo "$rule" | jq -r '.ooo_message.S // ""')
local ooo_type=$(echo "$rule" | jq -r '.ooo_content_type.S // "text"')
echo "Out-of-Office: ${GREEN}AKTIV${NC} ($ooo_type)"
echo "Nachricht: $ooo_msg"
else
echo "Out-of-Office: ${RED}INAKTIV${NC}"
fi
# Forwards
local forwards=$(echo "$rule" | jq -r '.forwards.L // [] | map(.S) | join(", ")')
if [ -n "$forwards" ]; then
echo "Forwards: $forwards"
else
echo "Forwards: ${RED}KEINE${NC}"
fi
# Letztes Update
local updated=$(echo "$rule" | jq -r '.last_updated.S // "unbekannt"')
echo "Letzte Änderung: $updated"
echo ""
}
# ==============================================
# COMMAND: list
# ==============================================
cmd_list() {
echo ""
echo "Alle E-Mail-Regeln:"
echo "═════════════════════════════════════════════════════════════════"
local items=$(aws dynamodb scan \
--table-name "$TABLE_NAME" \
--region "$REGION" \
--output json | jq -r '.Items')
local count=$(echo "$items" | jq 'length')
if [ "$count" -eq 0 ]; then
warn "Keine Regeln gefunden"
echo ""
return 0
fi
echo "$items" | jq -r '.[] |
"\(.email_address.S)\n" +
" OOO: \(if .ooo_active.BOOL then "✓ AKTIV (\(.ooo_content_type.S // "text"))" else "✗ INAKTIV" end)\n" +
" Forwards: \(if (.forwards.L | length) > 0 then (.forwards.L | map(.S) | join(", ")) else "KEINE" end)\n" +
" Updated: \(.last_updated.S // "unbekannt")\n"'
echo "─────────────────────────────────────────────────────────────────"
echo "Gesamt: $count Regel(n)"
echo ""
}
# ==============================================
# MAIN
# ==============================================
COMMAND=$1
shift
case "$COMMAND" in
set-ooo)
cmd_set_ooo "$@"
;;
set-forward)
cmd_set_forward "$@"
;;
add-forward)
cmd_add_forward "$@"
;;
remove-ooo)
cmd_remove_ooo "$@"
;;
remove-forward)
cmd_remove_forward "$@"
;;
remove-all)
cmd_remove_all "$@"
;;
show)
cmd_show "$@"
;;
list)
cmd_list
;;
help|--help|-h|"")
show_help
;;
*)
error "Unbekannter Befehl: $COMMAND\n\nNutze '$0 help' für Hilfe"
;;
esac