From cfdd8405279294c95c1732e5a4065b458edaeeae Mon Sep 17 00:00:00 2001 From: Andreas Knuth Date: Wed, 10 Dec 2025 15:21:26 -0600 Subject: [PATCH] update --- extract_email_headers.py | 17 ++++ requeue-email.sh | 210 ++++++++++++++++++++++----------------- 2 files changed, 135 insertions(+), 92 deletions(-) create mode 100644 extract_email_headers.py diff --git a/extract_email_headers.py b/extract_email_headers.py new file mode 100644 index 0000000..83a587c --- /dev/null +++ b/extract_email_headers.py @@ -0,0 +1,17 @@ +import sys +import email + +if len(sys.argv) < 2: + print("Usage: python3 extract_email_headers.py ") + sys.exit(1) + +file_path = sys.argv[1] +with open(file_path, '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}') \ No newline at end of file diff --git a/requeue-email.sh b/requeue-email.sh index 8654f64..2ec3f1c 100644 --- a/requeue-email.sh +++ b/requeue-email.sh @@ -1,132 +1,158 @@ #!/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. +# 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 + +# 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 + 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 + +# Konfiguration AWS_REGION="us-east-2" -#Temporäre Datei für E-Mail + +# 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 + +# 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 +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 + +# 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" + 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 + +# Wenn immer noch leer, Error if [ -z "$FROM" ] || [ -z "$RECIPIENTS" ]; then -echo "ERROR: Konnte FROM oder RECIPIENTS nicht extrahieren oder angeben." -exit 1 + echo "ERROR: Konnte FROM oder RECIPIENTS nicht extrahieren oder angeben." + exit 1 fi -#Domain aus erstem Recipient extrahieren + +# 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 aus Domain ableiten QUEUE_NAME="${DOMAIN//./-}-queue" + echo "From: $FROM" echo "Recipients: $RECIPIENTS" echo "Domain: $DOMAIN" echo "Queue: $QUEUE_NAME" echo "" -#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" -#Recipients als Array für JSON + +# 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 + +# 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") +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"