Este artículo actualmente está disponible solo en inglés. La traducción estará disponible próximamente.
You set up an Odoo mail alias like [email protected] to create helpdesk tickets, or [email protected] to create leads. You email the alias. Nothing happens — no ticket, no lead, no chatter, no error. The mail just disappears. This is one of the most operationally embarrassing Odoo bugs because customers think they reached you, but your system never sees their message. Applies to Odoo 17.0/18.0/19.0.
Quick Fix
Verify the chain at three layers:
# 1. DNS — does mail to the alias hit your server?
dig MX yourdomain.com
# 2. Catchall — does the SMTP server forward catchall to fetchmail or your Odoo?
sudo grep -i "catchall\|virtual" /etc/postfix/main.cf
# 3. Odoo — is fetchmail enabled and the alias mapped?
In Odoo: Settings → Technical → Email → Aliases. Each alias should map to a model + record creation rule. Settings → Technical → Email → Incoming Mail Servers — at least one server must be active.
Why This Happens
Inbound mail to Odoo travels:
- Sender's mail client → recipient's MX record (DNS).
- MX server → mailbox or forwarding rule.
- Odoo's
fetchmailconnects to the mailbox via IMAP/POP3 (or postfix forwards directly to Odoo's catchall). - Odoo parses the email, looks up the alias by recipient address.
- Alias rules dictate: create ticket, create lead, append to thread, or reject.
The five common breaks:
- No
fetchmailconfigured. Odoo can be the destination of an alias but never connects to fetch the mail. Inbound queue is empty because nothing is reading the mailbox. - MX record points elsewhere. Mail to
[email protected]hits your Google Workspace, not Odoo. You need to forward in Workspace. - Catchall mismatch. Odoo expects catchall on
yourdomain.combut DNS sends tomail.yourdomain.com. Misalignment causes silent loss. - Alias name typo. The alias record has
supportbut mail comes addressed to[email protected]— Odoo's matching is case-insensitive but newlines or extra chars trip it. - Alias model permissions. The alias is set to create
helpdesk.ticketbut the alias's user does not have create rights, so Odoo refuses silently.
Step-by-Step Diagnosis
1. Test MX delivery first.
echo "Test" | mail -s "Test Alias" [email protected]
# wait 30 seconds, then check Odoo
If Odoo never sees the message, the DNS/SMTP layer is the problem. Check your provider's mailbox to confirm the message arrived there.
2. Check fetchmail status.
servers = self.env['fetchmail.server'].search([])
for s in servers:
print(s.name, s.state, s.last_fetch_date)
state should be done. last_fetch_date should be recent (last 5 minutes). If never fetched or errored, fix configuration.
3. Manually trigger fetchmail.
self.env['fetchmail.server'].fetch_mail()
Watch the log for fetchmail-specific entries. Errors here are your IMAP/POP3 problem.
4. Check the alias records.
SELECT id, alias_name, alias_model_id, alias_contact, alias_force_thread_id
FROM mail_alias
WHERE alias_name = 'support';
alias_model_id should point at a real model (helpdesk.ticket, crm.lead, etc.). alias_contact='everyone' allows anyone to email.
5. Check mail.message for arrived but unprocessed messages.
SELECT id, subject, email_from, message_type, model, res_id
FROM mail_message
WHERE email_from LIKE '%[email protected]%'
ORDER BY id DESC LIMIT 10;
If the message arrived but model and res_id are empty, alias matching failed.
Permanent Fix
For fetchmail issues, configure the incoming mail server:
# Settings → Technical → Email → Incoming Mail Servers → New
# Name: Support Mailbox
# Server Type: IMAP Server
# Server Name: imap.yourprovider.com
# Port: 993
# SSL/TLS: enabled
# Username: [email protected]
# Password: <app-specific password>
# Actions to perform on incoming mails:
# Server Action: (leave empty for alias-driven routing)
# Create a new record: (only if you want a default record)
# Save then click "Test & Confirm" → green check
For an active fetchmail, set state='done' and ensure _cron_fetch_mail runs every 5 minutes (the default).
For MX/forwarding mismatches, configure forwarding at your mail provider:
- Google Workspace: Admin Console → Apps → Gmail → Routing → Recipient Address Map. Map
[email protected]to forward to your Odoo's catchall mailbox. - Microsoft 365: Exchange Admin → Mail Flow → Rules. Forward by alias.
- Custom Postfix:
/etc/postfix/virtualmap.
After forwarding is set up, test by sending and watching the Odoo fetchmail log.
For alias name issues, normalize and re-test:
alias = self.env['mail.alias'].search([('alias_name', '=', 'support')])
print(alias.alias_full_name) # [email protected]
alias_full_name is the address external senders should use. If it does not match what your DNS forwards, fix the catchall domain in Settings → General Settings → Email → Alias Domain.
For alias permissions, set alias_contact correctly:
alias.write({
'alias_contact': 'everyone', # or 'partners', 'followers'
'alias_user_id': admin_user.id, # the user under whom records get created
})
alias_user_id must have create rights on the target model. If unset, Odoo uses the alias's alias_user_id from the parent (channel/team).
How to Prevent It
- Test inbound monthly. A scheduled test that emails
[email protected]and asserts a ticket appears within 5 minutes. Catches MX/fetchmail regressions early. - Monitor
last_fetch_date. Alert if any fetchmail server has not fetched in 30 minutes. Indicates IMAP credential expiry or server downtime. - Use OAuth2 for inbound. Odoo 18.0+ supports OAuth2 for IMAP. App passwords break when rotated; OAuth2 is more durable.
- Catchall, not per-alias mailboxes. A single catchall mailbox forwarded to Odoo is simpler than one mailbox per alias. Less to break.
- Document alias-to-model mappings. A simple table that lists every active alias and its target model and creation rules. Audit quarterly.
- Bounce-back on mismatched aliases. Configure
alias_contact='followers'on internal aliases so that strangers get a polite bounce instead of silent drops. Confused senders learn the right address.
Related Errors
- Mail stuck in outgoing queue — outbound counterpart.
- Failed email no error log — silent failure on outbound.
- Mass mailing batch timeout — sibling mass-mail bug.
- Cron job stuck running — fetchmail is a cron, can stick.
Frequently Asked Questions
Can I run multiple incoming mail servers in Odoo?
Yes. Each fetchmail.server is independent. You can have one for support, one for sales, one for billing, each polling a different mailbox. Aliases route by recipient address, so a single mailbox can serve multiple aliases (catchall pattern) or each alias can have its own mailbox.
Why does my alias create the ticket but no chatter?
Almost always a permissions issue. The user under whom the alias creates records does not have access to write mail.message on the target model. Check alias_user_id and grant the necessary access.
How do I set up a reply-to-thread alias?
Set alias_force_thread_id on the alias to point at a specific record, OR set the alias_model on a model that supports mail.thread (so replies append to existing threads via the In-Reply-To header). Most Odoo models with chatter support this automatically.
Can fetchmail use OAuth2 for Gmail?
Yes, Odoo 18.0+ supports OAuth2 for incoming. Configure the OAuth2 app in Google Cloud, register the credentials in Odoo, then use the OAuth2 connection type when creating the fetchmail server. App-specific passwords are no longer required and the connection is more reliable.
Need help with a tricky Odoo error? ECOSIRE's Odoo experts have shipped 215+ modules — get expert help.
Escrito por
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
ECOSIRE
Transforme su negocio con Odoo ERP
Implementación, personalización y soporte experto de Odoo para optimizar sus operaciones.
Artículos relacionados
Cómo agregar un botón personalizado a una vista de formulario de Odoo (2026)
Agregue botones de acción personalizados a las vistas de formulario de Odoo 19: método de acción de Python, herencia de vistas, visibilidad condicional, cuadros de diálogo de confirmación. Probado en producción.
Cómo agregar un campo personalizado en Odoo sin Studio (2026)
Agregue campos personalizados a través de un módulo personalizado en Odoo 19: herencia de modelo, extensión de vista, campos calculados, decisiones de tienda/no tienda. Código primero, controlado por versiones.
Cómo agregar un informe personalizado en Odoo usando un diseño externo
Cree un informe PDF con su marca en Odoo 19 usando web.external_layout: plantilla QWeb, formato de papel, enlace de acción. Con logotipo impreso + anulaciones de pie de página.