A Thunderbird MailExtension (Manifest V3) that brings the official Odoo-for-Outlook add-in experience to Thunderbird: next to any open e-mail it shows the Odoo contact profile and lets you — just like the Outlook add-in — create a contact, enrich the company, create a lead, a project task or a helpdesk ticket, and log the e-mail on a record.
No custom Odoo module required. The add-on talks directly to the routes
of the stock mail_plugin module (plus crm_mail_plugin,
project_mail_plugin, helpdesk_mail_plugin) — the same endpoints the
official Outlook plugin uses.
- Thunderbird 128 ESR or newer (MV3
message_display_action) - Odoo with the Mail Plugin integration enabled (Settings › General Settings › Integrations › Mail Plugin ☑) — developed and tested against Odoo 19
- For the CRM / project / helpdesk actions the respective apps must be installed; a missing app simply means the server does not serve that action
- Company enrichment needs IAP credits (same as in Outlook)
Thunderbird does not require add-on signing to install an extension
permanently (unlike Firefox) — xpinstall.signatures.required defaults to
false on Thunderbird release builds, so a plain .xpi installs without any
warning or developer-mode toggle.
- Download the
.xpifrom this repo's Releases, or build it yourself:./build.sh(producesodoo-thunderbird-<version>.xpi) - Thunderbird › Tools › Add-ons and Themes (or
about:addons) › gear icon › Install Add-on From File… → select the.xpi - Open an e-mail → the Odoo button appears in the message header bar
That's it — the add-on stays installed across restarts, no developer mode needed.
- Odoo button → open settings (gear icon)
- Enter your Odoo address (e.g.
https://mycompany.odoo.com) → save & grant the host permission - Open an e-mail → Connect to Odoo → confirm the consent screen in the browser window
Identical to the Outlook plugin — an OAuth-style handshake against
mail_plugin:
launchWebAuthFlowopens…/mail_plugin/auth?scope=outlook&redirect=…; you log into Odoo and approve the access.- Odoo redirects back with a short-lived
auth_code. …/mail_plugin/auth/access_tokenexchanges it for an API-key token (scopeodoo.plugin.outlook).- All data calls carry
Authorization: Bearer <token>.
The scope must be outlook — the server checks for exactly
odoo.plugin.outlook in _auth_method_outlook. When the token expires, the
popup simply shows Connect to Odoo again.
| Action | Route |
|---|---|
| Module probe | POST /mail_plugin/auth/check_version |
| Get token | POST /mail_plugin/auth/access_token |
| Contact for e-mail | POST /mail_plugin/partner/get |
| Search contact | POST /mail_plugin/partner/search |
| Create contact | POST /mail_plugin/partner/create |
| Enrich company | POST /mail_plugin/partner/enrich_and_create_company |
| Create lead | POST /mail_plugin/lead/create |
| Search project | POST /mail_plugin/project/search |
| Create task | POST /mail_plugin/task/create |
| Create ticket | POST /mail_plugin/ticket/create |
| Log e-mail | POST /mail_plugin/log_mail_content |
odoo-thunderbird/
├── manifest.json MV3 MailExtension, message_display_action
├── background.js auth handshake + JSON-RPC client (owns the token)
├── popup/ UI in the message header bar
├── options/ Odoo URL + host permission
├── icons/
└── build.sh zips the above into an installable .xpi
The popup reads the e-mail via the Thunderbird messages API and sends
every Odoo request through runtime.sendMessage to the background
script, which is the only place that knows the token and performs network
calls. That keeps token handling and CORS in one spot.
This add-on only ever talks to the Odoo instance you configure in the
options page. There is no other server involved, no telemetry, no
third-party analytics. The access token is stored locally via
storage.local and never leaves the browser except as the Authorization
header sent to your own Odoo instance.
- The contact lookup is sender-based, like the official Outlook add-in:
it always resolves the message author. For an e-mail you sent yourself
that means it looks up your own address, not the recipient. Direction-aware
lookup (show the counterpart on outgoing mail) would need the
accountsReadpermission and is intentionally left out to keep this build minimal. - Attachments are not yet transferred when logging an e-mail
(
log_mail_contentsupports them — contributions welcome). - "Open in Odoo" uses the Odoo 19 web URLs (
/odoo/contacts/<id>,/odoo/crm/<id>, …); adapt them for older routing schemes. - UI strings are currently German — i18n contributions welcome.