Releases Modoboa 2.11.0 and 2.11.1
Oct. 9, 2026 — Antoine Nguyen
Security fixes in 2.11.1
- Domain administrators could take over SuperAdmin and Reseller accounts that own a mailbox in their domain. The migrate command removes the access already granted.
- Any authenticated user, including simple users, could create relay domains through the CSV import. The import now checks permissions and limits.
- A reseller could give a domain alias the name of a domain owned by another tenant, and so disrupt or redirect part of that tenant's inbound mail. Domain and domain alias names now share the same namespace.
- Frontend dependencies are forced to patched versions of undici and adm-zip (#4263).
2.11.0 had already tightened other access checks:
- the CSV import of domain administrators checks access to the domain (#4214)
- the CSV import of domain aliases checks access to the target (#4217)
- Amavis self-service authentication honors the self_service parameter (#4215)
- the Amavis recipient filter for simple users is escaped and anchored (#4216)
Before you upgrade
- Postfix (required if you use sending limits): without this change, limits will no longer be enforced. The policy daemon now decrements counters only once a message has been accepted, so Postfix must also query it at the end of the DATA stage.
- Recommended: set the address of the syslog handlers in settings.py, and serve OAuth2 introspection from a dedicated uWSGI instance to avoid webmail lock-ups.
- Domain alias check (2.11.1): a new system check reports inconsistencies left by previous versions. Review domain aliases that use a domain name by hand (modoboa.admin.W001). The other problems are fixed by the repair command:
python manage.py check --database default
python manage.py modo repair --dry-run
python manage.py modo repair
The upgrade guide has every step.
Webmail
- Conversation view: messages can be grouped into threads (IMAP THREAD extension), with a redesigned message display. It is turned on with a new user preference; the flat listing stays the default (#4212)
- Listing: refined toolbar and loading state (#4223)
- Performance: fewer IMAP round trips and redundant requests (#4224), and a faster subscriptions dialog on large folder hierarchies (#4270)
- Messages: no more blank message body in Chromium (#4244), better handling of message formats (#4265), and several fixes in the message composer (#4254, #4266)
- Other fixes: messages without a Date header are displayed (#4219), unfolding a mailbox no longer risks a timeout (#4220), the selection is cleared after deleting messages or moving them to junk (#4221), and subjects made of adjacent encoded words are decoded correctly (#4222)
Calendars
- Shared calendars: calendars shared with you are now displayed (#4242)
- Rights endpoint: a new endpoint for the radicale-modoboa-rights plugin makes shared calendars work even when Radicale runs on another server (#4238). Calendar names are now unique per owner: existing duplicates are renamed ("Name (2)") and keep their data.
- Recurring events: every occurrence is displayed, and you choose whether a change applies to one occurrence or to the whole series. Moving an event to another calendar now works (#4234)
- Display: working hours are highlighted and weekends greyed out (#4235)
- Performance: no more Radicale authentication delay, and calendars load in parallel (#4233)
- Access rule fixes: rules are nested under their calendar (#4225), the rights file is regenerated when rules are removed (#4226), and rule validation is fixed (#4241)
Administration and deployment
- Modoboa Pro is now highlighted in the admin interface (#4253)
- Mailbox renames: a mailbox is never left blocked by a pending rename operation (#4276)
- Sieve: single-condition filters are handled correctly (#4256)
- deploy command: a new --redisurl option for Redis on a unix socket (#4273), and database options such as SSL given in --dburl are kept in settings.py (#4271)
- Other fixes: policy daemon counters and logging (#4211), the interface loads all domains and not only the first page (#4227), and a DKIM key can be regenerated whether it exists or is missing (#4243)
Dependencies, localization and development
- Dependencies: the mysqlclient requirement is raised to <2.3.1 (#4210), caldav goes from 3.3.0 to 3.3.1 (#4213), frontend packages are updated (#4257, #4259, #4267, #4268, #4269, #4272), and the documentation tooling is updated (#4231, #4232)
- Translations: French and Japanese are updated
- Development: Amavis is optional in the development environment (#4228), the Docker setup gets Radicale client credentials (#4247), CI is faster and the test suite runs in parallel (#4255, #4258, #4260, #4261, #4262, #4264)
Thanks
Welcome to our new contributors Jah-yee, ScionOfDesign and raeesahmed77, and thanks to kryskool for the documentation work!
Upgrade
After the version-specific steps above:
pip install -U modoboa
cd <modoboa_instance_dir>
python manage.py migrate
python manage.py collectstatic
python manage.py check --deploy
python manage.py load_initial_data
sudo systemctl restart uwsgi supervisor
Full changelog: 2.10.1...2.11.1