This commit is contained in:
Andreas Knuth 2025-12-10 15:12:43 -06:00
parent bfebbcd53e
commit a5fe94df66
1 changed files with 113 additions and 96 deletions

View File

@ -1,115 +1,132 @@
#!/bin/bash #!/bin/bash
# requeue-email.sh - Sendet eine E-Mail aus S3 manuell in die SQS Queue #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 set -e
#Parameter prüfen
# Parameter prüfen if [ $# -lt 2 ]; then
if [ $# -lt 3 ]; then echo "Usage: $0 <BUCKET> <S3_KEY> [FROM] [RECIPIENTS]"
echo "Usage: $0 <S3_KEY> <FROM> <RECIPIENT>" echo ""
echo "" echo "RECIPIENTS kann kommagetrennt sein, z.B. user1@domain.com,user2@domain.com"
echo "Example:" echo "Falls FROM und RECIPIENTS nicht angegeben, werden sie aus der E-Mail extrahiert."
echo " $0 rgskc3d59dqdm6lq1scenpuvdq7ikhi3cqk382g1 sender@example.com user@bayarea-cc.com" echo "Example:"
echo "" echo " $0 bayarea-cc-emails rgskc3d59dqdm6lq1scenpuvdq7ikhi3cqk382g1"
exit 1 echo " oder mit manuellen Werten: $0 bayarea-cc-emails rgskc3d59dqdm6lq1scenpuvdq7ikhi3cqk382g1 sender@example.com user@bayarea-cc.com"
echo ""
exit 1
fi fi
BUCKET=$1
S3_KEY=$1 S3_KEY=$2
FROM=$2 FROM=${3:-}
RECIPIENT=$3 RECIPIENTS=${4:-}
#Konfiguration
# Konfiguration
AWS_REGION="us-east-2" AWS_REGION="us-east-2"
#Temporäre Datei für E-Mail
# Domain aus Recipient extrahieren TEMP_FILE="/tmp/email-${S3_KEY}.eml"
DOMAIN=$(echo "$RECIPIENT" | cut -d'@' -f2)
# Bucket-Name aus Domain ableiten
BUCKET="${DOMAIN//./-}-emails"
# Queue-Name aus Domain ableiten
QUEUE_NAME="${DOMAIN//./-}-queue"
echo "===================================" echo "==================================="
echo "Requeue E-Mail zu SQS Queue" echo "Requeue E-Mail zu SQS Queue"
echo "===================================" echo "==================================="
echo "S3 Key: $S3_KEY"
echo "From: $FROM"
echo "Recipient: $RECIPIENT"
echo "Domain: $DOMAIN"
echo "Bucket: $BUCKET" 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: $QUEUE_NAME"
echo "" echo ""
#Queue URL ermitteln
# 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"
# Queue URL ermitteln
echo "Ermittle Queue URL..." echo "Ermittle Queue URL..."
QUEUE_URL=$(aws sqs get-queue-url \ QUEUE_URL=$(aws sqs get-queue-url
--queue-name "$QUEUE_NAME" \ --queue-name "$QUEUE_NAME"
--region "$AWS_REGION" \ --region "$AWS_REGION"
--query 'QueueUrl' \ --query 'QueueUrl'
--output text 2>/dev/null) --output text 2>/dev/null)
if [ -z "$QUEUE_URL" ]; then if [ -z "$QUEUE_URL" ]; then
echo "ERROR: Queue nicht gefunden: $QUEUE_NAME" echo "ERROR: Queue nicht gefunden: $QUEUE_NAME"
exit 1 exit 1
fi fi
echo "✓ Queue URL: $QUEUE_URL" echo "✓ Queue URL: $QUEUE_URL"
#Recipients als Array für JSON
# Optional: Subject aus E-Mail extrahieren RECIPIENTS_ARRAY=$(echo "$RECIPIENTS" | tr ',' '\n' | jq -R . | jq -s .)
echo "Versuche Subject zu extrahieren..." #Fake SES-Event erstellen
TEMP_FILE="/tmp/email-${S3_KEY}.eml" SES_DATA=$(jq -n
aws s3 cp "s3://$BUCKET/$S3_KEY" "$TEMP_FILE" --region "$AWS_REGION" --quiet --arg from "$FROM"
--arg msgid "$S3_KEY"
# Subject extrahieren und JSON-escape (Newlines, Tabs, Quotes entfernen) --argjson recipients "$RECIPIENTS_ARRAY"
SUBJECT=$(grep -m1 "^Subject:" "$TEMP_FILE" | sed 's/Subject: //' | tr -d '\n\r\t"' | head -c 200 || echo "(no subject)") '{
rm -f "$TEMP_FILE" mail: {
source: $from,
echo "Subject: $SUBJECT" messageId: $msgid,
echo "" destination: $recipients
},
# Message in Queue senden 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..." echo "Sende Message in Queue..."
TIMESTAMP=$(date +%s) RESPONSE=$(aws sqs send-message
--queue-url "$QUEUE_URL"
# JSON-escape für alle Felder --region "$AWS_REGION"
FROM_ESCAPED=$(echo "$FROM" | sed 's/"/\\"/g' | tr -d '\n\r\t') --message-body "$FAKE_SNS_PAYLOAD")
RECIPIENT_ESCAPED=$(echo "$RECIPIENT" | sed 's/"/\\"/g' | tr -d '\n\r\t')
SUBJECT_ESCAPED=$(echo "$SUBJECT" | sed 's/"/\\"/g' | tr -d '\n\r\t')
RESPONSE=$(aws sqs send-message \
--queue-url "$QUEUE_URL" \
--region "$AWS_REGION" \
--message-body "{
\"bucket\": \"$BUCKET\",
\"key\": \"$S3_KEY\",
\"from\": \"$FROM_ESCAPED\",
\"recipient\": \"$RECIPIENT_ESCAPED\",
\"domain\": \"$DOMAIN\",
\"subject\": \"$SUBJECT_ESCAPED\",
\"message_id\": \"$S3_KEY\",
\"timestamp\": $TIMESTAMP
}" \
--message-attributes "{
\"domain\": {\"StringValue\": \"$DOMAIN\", \"DataType\": \"String\"},
\"bucket\": {\"StringValue\": \"$BUCKET\", \"DataType\": \"String\"},
\"recipient\": {\"StringValue\": \"$RECIPIENT_ESCAPED\", \"DataType\": \"String\"},
\"message_id\": {\"StringValue\": \"$S3_KEY\", \"DataType\": \"String\"}
}")
MESSAGE_ID=$(echo "$RESPONSE" | jq -r '.MessageId') MESSAGE_ID=$(echo "$RESPONSE" | jq -r '.MessageId')
echo "" echo ""
echo "===================================" echo "==================================="
echo "✅ E-Mail erfolgreich in Queue" echo "✅ E-Mail erfolgreich in Queue"