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 # ------------------------------------------------------------------