diff --git a/worker.py b/worker.py index a99cf53..d9db188 100755 --- a/worker.py +++ b/worker.py @@ -414,6 +414,29 @@ def send_email(from_addr: str, recipient: str, raw_message: bytes) -> tuple: log(f" ✗ {recipient}: Connection error - {e}", 'ERROR') return False, str(e), False +def extract_body(parsed): + """Extrahiert den Body als String, handhabt multipart und priorisiert text/plain oder text/html.""" + body = '' + if parsed.is_multipart(): + for part in parsed.walk(): + if part.get_content_type() == 'text/plain': + try: + body += part.get_payload(decode=True).decode('utf-8', errors='ignore') + '\n' + except Exception as e: + log(f"⚠ Error decoding text/plain part: {e}", 'WARNING') + elif part.get_content_type() == 'text/html' and not body: # Fallback zu HTML, wenn kein Plain + try: + body += part.get_payload(decode=True).decode('utf-8', errors='ignore') + '\n' + except Exception as e: + log(f"⚠ Error decoding text/html part: {e}", 'WARNING') + else: + try: + body = parsed.get_payload(decode=True).decode('utf-8', errors='ignore') + except Exception as e: + log(f"⚠ Error decoding non-multipart body: {e}", 'WARNING') + body = str(parsed.get_payload()) # Fallback zu raw String + + return body.strip() if body else '(No body content)' # ========================================== # HAUPTFUNKTION: PROCESS MESSAGE @@ -517,11 +540,7 @@ def process_message(message_body: dict, receive_count: int) -> bool: from_addr_final = from_addr # Neu: Original-Body extrahieren (für OOO und Forward) - try: - original_body = str(parsed.get_payload(decode=True)) - except Exception as e: - log(f"⚠ Error extracting original body: {e}. Using empty body.", 'WARNING') - original_body = "" + original_body = extract_body(parsed) # 5. OOO & FORWARD LOGIC (neu, vor SMTP-Versand) if rules_table and not is_ses_bounce_or_autoreply(parsed): # Vermeide Loops bei Bounces/Auto-Replies