fix: skip self-sent emails to prevent infinite reply loop
linuztx committed
Mar 17, 2026 at 22:43 UTC
9e86275db5f5ec16ca4186a60092125dcdf23098
1 file changed
+18
plugins/_email_integration/helpers/handler.py
+18
@@ -141,6 +141,8 @@ async def _fetch_exchange(
141
142
143
async def _dispatch_all(handler_cfg: dict, messages: list[InboundMessage]):
144
+ own_address = (handler_cfg.get("username") or "").lower()
145
+
146
# Need an agent for dispatcher AI calls — use first available or create temp
147
ctx = AgentContext.first()
148
if not ctx:
@@ -150,6 +152,9 @@ async def _dispatch_all(handler_cfg: dict, messages: list[InboundMessage]):
152
agent = ctx.agent0
153
154
for msg in messages:
155
+ if own_address and _is_own_email(msg.sender, own_address):
156
+ PrintStyle.info(f"Email: skipping self-sent from {msg.sender}")
157
+ continue
158
try:
159
await _dispatch_message(agent, handler_cfg, msg)
160
except Exception as e:
@@ -343,6 +348,19 @@ def _get_history_preview(ctx: AgentContext) -> str:
348
return "(unavailable)"
349
350
351
+# ------------------------------------------------------------------
352
+# Sender helpers
353
+# ------------------------------------------------------------------
354
+
355
+def _is_own_email(sender: str, own_address: str) -> bool:
356
+ sender_lower = sender.lower()
357
+ if "<" in sender_lower:
358
+ start = sender_lower.index("<") + 1
359
+ end = sender_lower.index(">", start)
360
+ return sender_lower[start:end].strip() == own_address
361
+ return sender_lower.strip() == own_address
362
+
363
+
364
# ------------------------------------------------------------------
365
# Message builders
366
# ------------------------------------------------------------------