case 2 improved

This commit is contained in:
Andreas Knuth 2025-10-18 16:29:29 -05:00
parent 012e464ec1
commit e4ed492e78
1 changed files with 40 additions and 8 deletions

View File

@ -70,7 +70,7 @@ def get_queue_url() -> str:
def mark_as_processed(bucket: str, key: str, invalid_inboxes: list = None):
"""
Markiert E-Mail als erfolgreich zugestellt
Setzt processed=true auch wenn manche Recipients fehlgeschlagen sind
Wird nur aufgerufen wenn mindestens 1 Recipient erfolgreich war
"""
try:
head = s3.head_object(Bucket=bucket, Key=key)
@ -102,6 +102,37 @@ def mark_as_processed(bucket: str, key: str, invalid_inboxes: list = None):
log(f"Failed to mark as processed: {e}", 'WARNING')
def mark_as_all_invalid(bucket: str, key: str, invalid_inboxes: list):
"""
Markiert E-Mail als fehlgeschlagen weil alle Recipients ungültig sind
"""
try:
head = s3.head_object(Bucket=bucket, Key=key)
metadata = head.get('Metadata', {}) or {}
metadata['processed'] = 'true'
metadata['processed_at'] = str(int(time.time()))
metadata['processed_by'] = WORKER_NAME
metadata['status'] = 'failed'
metadata['error'] = 'All recipients are invalid (mailboxes do not exist)'
metadata['invalid_inboxes'] = ','.join(invalid_inboxes)
metadata.pop('processing_started', None)
metadata.pop('queued_at', None)
s3.copy_object(
Bucket=bucket,
Key=key,
CopySource={'Bucket': bucket, 'Key': key},
Metadata=metadata,
MetadataDirective='REPLACE'
)
log(f"✓ Marked s3://{bucket}/{key} as failed (all invalid)", 'SUCCESS')
except Exception as e:
log(f"Failed to mark as all invalid: {e}", 'WARNING')
def mark_as_failed(bucket: str, key: str, error: str, receive_count: int):
"""
Markiert E-Mail als komplett fehlgeschlagen
@ -301,8 +332,8 @@ def process_message(message_body: dict, receive_count: int) -> bool:
# Entscheidungslogik
if len(successful) > 0:
# Mindestens 1 Recipient erfolgreich
# → processed=true setzen, invalid_inboxes tracken
# ✅ Fall 1: Mindestens 1 Recipient erfolgreich
# → status=delivered, invalid_inboxes tracken
invalid_inboxes = failed_permanent if failed_permanent else None
mark_as_processed(bucket, key, invalid_inboxes)
@ -318,19 +349,20 @@ def process_message(message_body: dict, receive_count: int) -> bool:
return True # Message löschen
elif len(failed_permanent) == len(recipients):
# ALLE Recipients sind permanent fehlgeschlagen (alle Inboxen ungültig)
# → processed=true setzen mit allen als invalid_inboxes
# ❌ Fall 2: ALLE Recipients permanent fehlgeschlagen (alle Inboxen ungültig)
# → status=failed, invalid_inboxes = ALLE
mark_as_processed(bucket, key, failed_permanent)
mark_as_all_invalid(bucket, key, failed_permanent)
log(f"{'='*70}")
log(f"✗ All recipients permanently failed (invalid inboxes)", 'ERROR')
log(f"✗ All recipients are invalid inboxes - NO delivery", 'ERROR')
log(f" Invalid: {', '.join(failed_permanent)}", 'ERROR')
log(f"{'='*70}\n")
return True # Message löschen (nicht retryable)
else:
# Nur temporäre Fehler, keine erfolgreichen Deliveries
# ⏳ Fall 3: Nur temporäre Fehler, keine erfolgreichen Deliveries
# → Retry wenn noch Versuche übrig
if receive_count < 3: