本文目前仅提供英文版本。翻译即将推出。
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.
作者
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.
相关文章
如何将自定义按钮添加到 Odoo 表单视图 (2026)
将自定义操作按钮添加到 Odoo 19 表单视图:Python 操作方法、视图继承、条件可见性、确认对话框。经过生产测试。
如何在没有 Studio 的情况下在 Odoo 中添加自定义字段 (2026)
通过 Odoo 19 中的自定义模块添加自定义字段:模型继承、视图扩展、计算字段、存储/非存储决策。代码优先,版本控制。
如何使用外部布局在 Odoo 中添加自定义报告
使用 web.external_layout 在 Odoo 19 中构建品牌 PDF 报告:QWeb 模板、paperformat、操作绑定。带有印刷徽标+页脚覆盖。