case 2 improved
This commit is contained in:
parent
012e464ec1
commit
e4ed492e78
48
worker.py
48
worker.py
|
|
@ -70,7 +70,7 @@ def get_queue_url() -> str:
|
||||||
def mark_as_processed(bucket: str, key: str, invalid_inboxes: list = None):
|
def mark_as_processed(bucket: str, key: str, invalid_inboxes: list = None):
|
||||||
"""
|
"""
|
||||||
Markiert E-Mail als erfolgreich zugestellt
|
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:
|
try:
|
||||||
head = s3.head_object(Bucket=bucket, Key=key)
|
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')
|
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):
|
def mark_as_failed(bucket: str, key: str, error: str, receive_count: int):
|
||||||
"""
|
"""
|
||||||
Markiert E-Mail als komplett fehlgeschlagen
|
Markiert E-Mail als komplett fehlgeschlagen
|
||||||
|
|
@ -301,8 +332,8 @@ def process_message(message_body: dict, receive_count: int) -> bool:
|
||||||
|
|
||||||
# Entscheidungslogik
|
# Entscheidungslogik
|
||||||
if len(successful) > 0:
|
if len(successful) > 0:
|
||||||
# Mindestens 1 Recipient erfolgreich
|
# ✅ Fall 1: Mindestens 1 Recipient erfolgreich
|
||||||
# → processed=true setzen, invalid_inboxes tracken
|
# → status=delivered, invalid_inboxes tracken
|
||||||
|
|
||||||
invalid_inboxes = failed_permanent if failed_permanent else None
|
invalid_inboxes = failed_permanent if failed_permanent else None
|
||||||
mark_as_processed(bucket, key, invalid_inboxes)
|
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
|
return True # Message löschen
|
||||||
|
|
||||||
elif len(failed_permanent) == len(recipients):
|
elif len(failed_permanent) == len(recipients):
|
||||||
# ALLE Recipients sind permanent fehlgeschlagen (alle Inboxen ungültig)
|
# ❌ Fall 2: ALLE Recipients permanent fehlgeschlagen (alle Inboxen ungültig)
|
||||||
# → processed=true setzen mit allen als invalid_inboxes
|
# → 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"{'='*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")
|
log(f"{'='*70}\n")
|
||||||
|
|
||||||
return True # Message löschen (nicht retryable)
|
return True # Message löschen (nicht retryable)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# Nur temporäre Fehler, keine erfolgreichen Deliveries
|
# ⏳ Fall 3: Nur temporäre Fehler, keine erfolgreichen Deliveries
|
||||||
# → Retry wenn noch Versuche übrig
|
# → Retry wenn noch Versuche übrig
|
||||||
|
|
||||||
if receive_count < 3:
|
if receive_count < 3:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue