#!/bin/bash # requeue-email.sh - Sendet eine E-Mail aus S3 manuell in die SQS Queue # Simuliert das SNS-ähnliche Format, das der Worker erwartet (aus Lambda). # Extrahiert FROM und RECIPIENTS aus der E-Mail, falls nicht angegeben. set -e # Parameter prüfen if [ $# -lt 2 ]; then echo "Usage: $0 [FROM] [RECIPIENTS]" echo "" echo "RECIPIENTS kann kommagetrennt sein, z.B. user1@domain.com,user2@domain.com" echo "Falls FROM und RECIPIENTS nicht angegeben, werden sie aus der E-Mail extrahiert." echo "Example:" echo " $0 bayarea-cc.com rgskc3d59dqdm6lq1scenpuvdq7ikhi3cqk382g1" echo " oder mit manuellen Werten: $0 bayarea-cc.com rgskc3d59dqdm6lq1scenpuvdq7ikhi3cqk382g1 sender@example.com user@bayarea-cc.com" echo "" exit 1 fi DOMAIN=$1 S3_KEY=$2 FROM=${3:-} RECIPIENTS=${4:-} # Konfiguration AWS_REGION="us-east-2" # Bucket-Name aus Domain ableiten BUCKET="${DOMAIN//./-}-emails" # Temporäre Datei für E-Mail TEMP_FILE="/tmp/email-${S3_KEY}.eml" echo "===================================" echo "Requeue E-Mail zu SQS Queue" echo "===================================" echo "Domain: $DOMAIN" echo "Bucket: $BUCKET" echo "S3 Key: $S3_KEY" # Prüfen ob S3 Object existiert echo "Prüfe S3 Object..." if ! aws s3api head-object \ --bucket "$BUCKET" \ --key "$S3_KEY" \ --region "$AWS_REGION" &>/dev/null; then echo "ERROR: S3 Object nicht gefunden: s3://$BUCKET/$S3_KEY" exit 1 fi echo "✓ S3 Object existiert" # Wenn FROM oder RECIPIENTS nicht angegeben, extrahiere aus E-Mail if [ -z "$FROM" ] || [ -z "$RECIPIENTS" ]; then echo "Extrahiere Headers aus E-Mail..." aws s3 cp "s3://$BUCKET/$S3_KEY" "$TEMP_FILE" --region "$AWS_REGION" --quiet # Aufruf der separaten Python-Datei if ! command -v python3 &> /dev/null; then echo "ERROR: python3 ist nicht installiert." rm -f "$TEMP_FILE" exit 1 fi if [ ! -f "extract_email_headers.py" ]; then echo "ERROR: extract_email_headers.py nicht gefunden (muss im selben Verzeichnis liegen)." rm -f "$TEMP_FILE" exit 1 fi PARSE_OUTPUT=$(python3 extract_email_headers.py "$TEMP_FILE") # Output parsen EXTRACTED_FROM=$(echo "$PARSE_OUTPUT" | grep '^FROM:' | cut -d':' -f2-) EXTRACTED_RECIPIENTS=$(echo "$PARSE_OUTPUT" | grep '^RECIPIENTS:' | cut -d':' -f2-) # Verwende extrahierte Werte, falls nicht angegeben FROM=${FROM:-$EXTRACTED_FROM} RECIPIENTS=${RECIPIENTS:-$EXTRACTED_RECIPIENTS} # Aufräumen rm -f "$TEMP_FILE" fi # Wenn immer noch leer, Error if [ -z "$FROM" ] || [ -z "$RECIPIENTS" ]; then echo "ERROR: Konnte FROM oder RECIPIENTS nicht extrahieren oder angeben." exit 1 fi # Domain aus erstem Recipient extrahieren und validieren FIRST_RECIPIENT=$(echo "$RECIPIENTS" | cut -d',' -f1 | sed 's/.*.*//') # Reinige falls EXTRACTED_DOMAIN=$(echo "$FIRST_RECIPIENT" | cut -d'@' -f2) # Lowercase für case-insensitive Vergleich EXTRACTED_DOMAIN_LOWER=$(echo "$EXTRACTED_DOMAIN" | tr '[:upper:]' '[:lower:]') DOMAIN_LOWER=$(echo "$DOMAIN" | tr '[:upper:]' '[:lower:]') if [ "$EXTRACTED_DOMAIN_LOWER" != "$DOMAIN_LOWER" ]; then echo "ERROR: Extrahierte Domain ($EXTRACTED_DOMAIN) passt nicht zur angegebenen Domain ($DOMAIN)." exit 1 fi # Queue-Name aus Domain ableiten QUEUE_NAME="${DOMAIN//./-}-queue" echo "From: $FROM" echo "Recipients: $RECIPIENTS" echo "Queue: $QUEUE_NAME" echo "" # Queue URL ermitteln echo "Ermittle Queue URL..." QUEUE_URL=$(aws sqs get-queue-url \ --queue-name "$QUEUE_NAME" \ --region "$AWS_REGION" \ --query 'QueueUrl' \ --output text 2>/dev/null) if [ -z "$QUEUE_URL" ]; then echo "ERROR: Queue nicht gefunden: $QUEUE_NAME" exit 1 fi echo "✓ Queue URL: $QUEUE_URL" # Recipients als Array für JSON RECIPIENTS_ARRAY=$(echo "$RECIPIENTS" | tr ',' '\n' | jq -R . | jq -s .) # Fake SES-Event erstellen SES_DATA=$(jq -n \ --arg from "$FROM" \ --arg msgid "$S3_KEY" \ --argjson recipients "$RECIPIENTS_ARRAY" \ '{ mail: { source: $from, messageId: $msgid, destination: $recipients }, receipt: { recipients: $recipients } }') # Fake SNS-Payload (Wrapper) FAKE_SNS_PAYLOAD=$(jq -n \ --argjson message "$SES_DATA" \ --arg msgid "$(uuidgen)" \ --arg timestamp "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \ '{ Type: "Notification", MessageId: $msgid, TopicArn: "arn:aws:sns:ses-shim:global-topic", Subject: "Amazon SES Email Receipt Notification", Message: ($message | tostring), Timestamp: $timestamp }') # Message in Queue senden echo "Sende Message in Queue..." RESPONSE=$(aws sqs send-message \ --queue-url "$QUEUE_URL" \ --region "$AWS_REGION" \ --message-body "$FAKE_SNS_PAYLOAD") MESSAGE_ID=$(echo "$RESPONSE" | jq -r '.MessageId') echo "" echo "===================================" echo "✅ E-Mail erfolgreich in Queue" echo "===================================" echo "SQS Message ID: $MESSAGE_ID" echo "Queue: $QUEUE_NAME" echo "" echo "Der Worker wird die E-Mail in Kürze verarbeiten."