#!/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-emails rgskc3d59dqdm6lq1scenpuvdq7ikhi3cqk382g1" echo " oder mit manuellen Werten: $0 bayarea-cc-emails rgskc3d59dqdm6lq1scenpuvdq7ikhi3cqk382g1 sender@example.com user@bayarea-cc.com" echo "" exit 1 fi BUCKET=$1 S3_KEY=$2 FROM=${3:-} RECIPIENTS=${4:-} #Konfiguration AWS_REGION="us-east-2" #Temporäre Datei für E-Mail TEMP_FILE="/tmp/email-${S3_KEY}.eml" echo "===================================" echo "Requeue E-Mail zu SQS Queue" echo "===================================" 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 #Embedded Python zum Parsen (robust für folded headers etc.) PARSE_OUTPUT=$(python3 -c " import sys import email with open(sys.argv[1], 'rb') as f: msg = email.message_from_bytes(f.read()) from_addr = msg.get('From', '') to_addrs = msg.get_all('To', []) + msg.get_all('Cc', []) recipients = ','.join([str(addr) for addr in to_addrs]) if to_addrs else '' print(f'FROM:{from_addr}') print(f'RECIPIENTS:{recipients}') " "$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 FIRST_RECIPIENT=$(echo "$RECIPIENTS" | cut -d',' -f1) DOMAIN=$(echo "$FIRST_RECIPIENT" | cut -d'@' -f2) #Queue-Name aus Domain ableiten QUEUE_NAME="${DOMAIN//./-}-queue" echo "From: $FROM" echo "Recipients: $RECIPIENTS" echo "Domain: $DOMAIN" 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."