From 3bd1ed14cfcefb76c9b33d58a18913e4ec445fe0 Mon Sep 17 00:00:00 2001 From: Andreas Knuth Date: Tue, 10 Feb 2026 11:57:10 -0600 Subject: [PATCH] =?UTF-8?q?Forward-Rule=20mit=20smtp=5Foverride=20?= =?UTF-8?q?=E2=86=92=20Mail=20geht=20nur=20zum=20alten=20Provider,=20keine?= =?UTF-8?q?=20DMS-Delivery=20Forward-Rule=20ohne=20smtp=5Foverride=20?= =?UTF-8?q?=E2=86=92=20normaler=20Forward=20+=20DMS-Delivery=20(bestehende?= =?UTF-8?q?s=20Verhalten)=20Keine=20Rule=20=E2=86=92=20nur=20DMS-Delivery?= =?UTF-8?q?=20(bestehendes=20Verhalten)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../email_processing/rules_processor.py | 17 ++++---- email-worker/worker.py | 41 ++++++++++--------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/email-worker/email_processing/rules_processor.py b/email-worker/email_processing/rules_processor.py index 50a9ae7..f3bfd31 100644 --- a/email-worker/email_processing/rules_processor.py +++ b/email-worker/email_processing/rules_processor.py @@ -44,7 +44,7 @@ class RulesProcessor: rule = self.dynamodb.get_email_rules(recipient) if not rule: - return + return False # NEU: Return-Wert original_from = parsed.get('From', '') sender_name, sender_addr = parseaddr(original_from) @@ -69,17 +69,16 @@ class RulesProcessor: # Forward handling # ============================================ forwards = rule.get('forwards', []) + has_legacy_forward = False # NEU + if forwards: + if rule.get('forward_smtp_override'): + has_legacy_forward = True # NEU self._handle_forwards( - recipient, - parsed, - original_from, - forwards, - domain, - worker_name, - metrics_callback, - rule=rule + recipient, parsed, original_from, forwards, + domain, worker_name, metrics_callback, rule=rule ) + return has_legacy_forward # NEU: statt kein Return def _handle_ooo( self, diff --git a/email-worker/worker.py b/email-worker/worker.py index 6f20280..79e9282 100644 --- a/email-worker/worker.py +++ b/email-worker/worker.py @@ -184,6 +184,7 @@ class MessageProcessor: continue # Process rules (OOO, Forwarding) - not for bounces or already forwarded + skip_local_delivery = False # NEU if not is_bounce and not skip_rules: def metrics_callback(action_type: str, dom: str): """Callback for metrics from rules processor""" @@ -193,7 +194,7 @@ class MessageProcessor: elif action_type == 'forward': self.metrics.increment_forward(dom) - self.rules_processor.process_rules_for_recipient( + skip_local_delivery = self.rules_processor.process_rules_for_recipient( recipient, parsed, domain, @@ -202,25 +203,27 @@ class MessageProcessor: ) # SMTP Delivery - success, error, is_perm = self.delivery.send_to_recipient( - from_addr_final, - recipient, - raw_bytes, - worker_name - ) - - if success: - successful.append(recipient) - if self.metrics: - self.metrics.increment_processed(domain, 'success') - elif is_perm: - failed_permanent.append(recipient) - if self.metrics: - self.metrics.increment_processed(domain, 'permanent_failure') + if skip_local_delivery: # NEU + log(f" ⏭ Skipping local delivery for {recipient} (legacy forward active)", + 'INFO', worker_name) + successful.append(recipient) # Zählt als "handled" else: - failed_temporary.append(recipient) - if self.metrics: - self.metrics.increment_processed(domain, 'temporary_failure') + success, error, is_perm = self.delivery.send_to_recipient( + from_addr_final, recipient, raw_bytes, worker_name + ) + + if success: + successful.append(recipient) + if self.metrics: + self.metrics.increment_processed(domain, 'success') + elif is_perm: + failed_permanent.append(recipient) + if self.metrics: + self.metrics.increment_processed(domain, 'permanent_failure') + else: + failed_temporary.append(recipient) + if self.metrics: + self.metrics.increment_processed(domain, 'temporary_failure') # 8. RESULT & CLEANUP total_handled = len(successful) + len(failed_permanent) + len(blocked_recipients)