diff --git a/requeue-email.sh b/requeue-email.sh index 5963dbd..8654f64 100644 --- a/requeue-email.sh +++ b/requeue-email.sh @@ -1,115 +1,132 @@ #!/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 - -# Parameter prüfen -if [ $# -lt 3 ]; then - echo "Usage: $0 " - echo "" - echo "Example:" - echo " $0 rgskc3d59dqdm6lq1scenpuvdq7ikhi3cqk382g1 sender@example.com user@bayarea-cc.com" - echo "" - exit 1 +#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 - -S3_KEY=$1 -FROM=$2 -RECIPIENT=$3 - -# Konfiguration +BUCKET=$1 +S3_KEY=$2 +FROM=${3:-} +RECIPIENTS=${4:-} +#Konfiguration AWS_REGION="us-east-2" - -# Domain aus Recipient extrahieren -DOMAIN=$(echo "$RECIPIENT" | cut -d'@' -f2) - -# Bucket-Name aus Domain ableiten -BUCKET="${DOMAIN//./-}-emails" - -# Queue-Name aus Domain ableiten -QUEUE_NAME="${DOMAIN//./-}-queue" - +#Temporäre Datei für E-Mail +TEMP_FILE="/tmp/email-${S3_KEY}.eml" echo "===================================" echo "Requeue E-Mail zu SQS Queue" echo "===================================" -echo "S3 Key: $S3_KEY" -echo "From: $FROM" -echo "Recipient: $RECIPIENT" -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 +#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 "" - -# 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 +#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) - +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 +echo "ERROR: Queue nicht gefunden: $QUEUE_NAME" +exit 1 fi - echo "✓ Queue URL: $QUEUE_URL" - -# Optional: Subject aus E-Mail extrahieren -echo "Versuche Subject zu extrahieren..." -TEMP_FILE="/tmp/email-${S3_KEY}.eml" -aws s3 cp "s3://$BUCKET/$S3_KEY" "$TEMP_FILE" --region "$AWS_REGION" --quiet - -# Subject extrahieren und JSON-escape (Newlines, Tabs, Quotes entfernen) -SUBJECT=$(grep -m1 "^Subject:" "$TEMP_FILE" | sed 's/Subject: //' | tr -d '\n\r\t"' | head -c 200 || echo "(no subject)") -rm -f "$TEMP_FILE" - -echo "Subject: $SUBJECT" -echo "" - -# Message in Queue senden +#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..." -TIMESTAMP=$(date +%s) - -# JSON-escape für alle Felder -FROM_ESCAPED=$(echo "$FROM" | sed 's/"/\\"/g' | tr -d '\n\r\t') -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\"} - }") - +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"