bemade-addons/mail_loop_prevention
2025-10-07 10:06:10 -04:00
..
models new module mail_loop_prevention 2025-10-07 10:06:10 -04:00
static/description new module mail_loop_prevention 2025-10-07 10:06:10 -04:00
tests new module mail_loop_prevention 2025-10-07 10:06:10 -04:00
views new module mail_loop_prevention 2025-10-07 10:06:10 -04:00
__init__.py new module mail_loop_prevention 2025-10-07 10:06:10 -04:00
__manifest__.py new module mail_loop_prevention 2025-10-07 10:06:10 -04:00
README.md new module mail_loop_prevention 2025-10-07 10:06:10 -04:00

Mail Loop Prevention

Overview

This module prevents communication loops that can occur when two mail servers auto-reply to each other indefinitely. This commonly happens with:

  • Delivery receipt acknowledgements
  • Out-of-office auto-replies
  • Automated notification systems
  • Email bounce handlers

How It Works

The module overrides mail.thread._message_create() to detect potential loops by:

  1. Content Hashing: Creates a hash of message body and subject (unescapes HTML and normalizes whitespace)
  2. Time Window Check: Looks for identical messages within a configurable time window (default: 48 hours)
  3. Threshold Detection: Blocks messages if the number of identical messages exceeds a threshold (default: 3)
  4. Smart Filtering: Only checks automated messages (notification, auto_comment, email types), never blocks user comments

Configuration

The module uses system parameters that can be configured via Settings > Technical > Parameters > System Parameters:

Parameter Default Valid Range Description
mail_loop_prevention.enabled True True/False Enable/disable loop prevention
mail_loop_prevention.time_window_hours 48 1 to 720 Time window in hours to check for duplicates (max 30 days)
mail_loop_prevention.max_identical_messages 3 2 to 100 Maximum identical messages allowed before blocking

Configuration Validation

The module validates all configuration parameters when they are set:

  • enabled: Accepts True/False, 1/0, yes/no, on/off (case-insensitive)
  • time_window_hours: Must be an integer between 1 and 720 (30 days)
  • max_identical_messages: Must be an integer between 2 and 100

Invalid values will raise a ValidationError and prevent the parameter from being saved.

Example Scenario

Without this module:

Server A → Auto-reply to Server B
Server B → Auto-reply to Server A
Server A → Auto-reply to Server B
Server B → Auto-reply to Server A
... (infinite loop)

With this module:

Server A → Auto-reply to Server B (1st message - allowed)
Server B → Auto-reply to Server A (1st message - allowed)
Server A → Auto-reply to Server B (2nd message - allowed)
Server B → Auto-reply to Server A (2nd message - allowed)
Server A → Auto-reply to Server B (3rd message - allowed)
Server B → Auto-reply to Server A (3rd message - allowed)
Server A → Auto-reply to Server B (4th message - BLOCKED)

Technical Details

Message Types Checked

The module only checks these message types for loops:

  • notification - System notifications
  • auto_comment - Automated comments
  • email - Email messages

Regular comment type messages (user posts) are never blocked.

Duplicate Detection

Messages are considered identical if they have the same:

  • Body content (after unescaping HTML entities and normalizing whitespace)
  • Subject line

Real-world loops send exactly the same message repeatedly, so direct content comparison is sufficient.

Performance Considerations

  • Only checks messages within the configured time window
  • Uses SHA-256 hashing for efficient comparison
  • Minimal database queries (uses existing message_ids relation)

Testing

Run the test suite:

odoo-bin -c odoo.conf -d test_db -i mail_loop_prevention --test-enable --stop-after-init

Troubleshooting

Legitimate messages being blocked

If legitimate automated messages are being blocked:

  1. Check the logs for "Loop prevention: Blocking duplicate message" warnings
  2. Increase mail_loop_prevention.max_identical_messages threshold
  3. Reduce mail_loop_prevention.time_window_hours if the messages are spread over time
  4. Temporarily disable with mail_loop_prevention.enabled = False to diagnose

Loops still occurring

If loops are still happening:

  1. Verify the module is installed and enabled
  2. Check that mail_loop_prevention.enabled = True
  3. Reduce the max_identical_messages threshold
  4. Check if the messages have varying content (different subjects/bodies)

License

AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)