Odoo emails not sending? How to fix outgoing mail, SPF, DKIM and DMARC
Why Odoo emails don't send or land in spam, and how to fix it: the outgoing mail server, FROM filtering, SPF, DKIM and DMARC, the email queue and common errors.
By Muhammad Salman Ali Khan, Founder, Knova Digital Solutions · Published · 8 min read · Odoo email, Odoo configuration, Odoo hosting
When Odoo emails don't go out, or arrive in spam, the cause is almost always one of four things: no working outgoing mail server, a sender address the server isn't allowed to use (FROM filtering), missing SPF, DKIM or DMARC records for your domain, or emails stuck in Odoo's queue. Check them in that order. This guide explains each one with the menus of Odoo 17 to 19, lists the common error messages, and shows what Knova Cloud sets up for you.
This article is only about outgoing mail: quotations, invoices, notifications and password resets that Odoo sends.
How Odoo decides how to send an email
Every email Odoo sends has a From address, and Odoo picks an outgoing mail server for it in this order, according to its documentation:
- A server whose FROM filtering matches the sender's address or domain (for example a server with the filter
example.comforsales@example.com). - Otherwise, the first server without a FROM filter, and the From address is replaced by the notification address (by default
notifications@your alias domain). - Otherwise, the first server, again with the notification address.
- With no mail server record at all, Odoo uses the server given on the command line or in the configuration file, filtered by the
mail.default.from_filtersystem parameter.
Two consequences explain many "my emails look wrong" tickets. First, if the sender's domain isn't allowed, Odoo doesn't fail: it sends from the notification address and keeps the sender's name. Second, "which server is first" goes by the Priority field (lower wins), then alphabetically by name.
Step 1: check that a mail server works
Turn on developer mode and open Settings → Technical → Outgoing Mail Servers. For each server, use the values from your email provider:
- Port and security. Port 587 with STARTTLS or port 465 with SSL/TLS. Many hosts, Odoo's own cloud among them, block port 25.
- Username and password. Gmail and Microsoft 365 accounts with two-factor sign-in often need OAuth (Odoo has modules for both) or an app password, not the normal password.
- FROM filtering. Set it to the domain or address your provider has verified for you.
Click Test Connection. As Odoo's documentation warns, a successful test only proves Odoo can log in; the provider may still refuse a sender address it hasn't verified.
Step 2: set the sender addresses (alias domain)
In Odoo 17 and later, the addresses Odoo builds come from the company's alias domain (in Settings, or in developer mode under Settings → Technical → Alias Domains):
- Default From (
notificationsby default): the sender used when the real author can't be. - Catchall (
catchallby default): the Reply-To address, so replies go back to the right document. - Bounce (
bounceby default): where delivery errors go. It is also the address the SPF check applies to.
In Odoo 16 and earlier the same settings are system parameters: mail.default.from, mail.catchall.domain, mail.catchall.alias and mail.bounce.alias.
Two rules avoid most surprises. Use a domain you control for the alias domain, and make sure the catchall and bounce addresses exist as mailboxes or forwards at your email provider, so a customer's reply never vanishes. Change these aliases with care: Odoo warns that emails sent to the old addresses can be lost.
Step 3: authenticate your domain with SPF, DKIM and DMARC
Without these records, many providers send your mail to spam or reject it. Google now requires every sender to Gmail to have SPF or DKIM, valid forward and reverse DNS and TLS; senders of more than 5,000 messages a day also need DMARC, and a From domain aligned with SPF or DKIM.
- SPF is one TXT record on your domain listing who may send for it. A domain must have only one SPF record: add the new
include:to the existing record rather than creating a second one. - DKIM signs each message. Your email provider gives you the record, usually a CNAME or TXT under
<selector>._domainkey. - DMARC tells receivers what to do when SPF and DKIM fail. Start by monitoring, then tighten once reports look clean.
A typical set looks like this; the include: value and the DKIM record come from your provider:
example.com. TXT "v=spf1 include:spf.your-provider.example ~all"
k1._domainkey.example.com. CNAME k1.dkim.your-provider.example.
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"If you use Odoo's own mail servers on Odoo Online or Odoo.sh, Odoo's documentation gives its own values: include:_spf.odoo.com for SPF and a CNAME from odoo._domainkey to odoo._domainkey.odoo.com for DKIM. Use those only with Odoo's servers; with any other provider, use that provider's records.
Step 4: look at the email queue and failed messages
A red envelope in the chatter means delivery failed for at least one recipient; click it to see the error. Then, in developer mode, open Settings → Technical → Emails:
- Delivery Failed emails can be retried with Retry; Send Now sends a queued email at once.
- Emails between people (quotations, invoices, orders) are sent immediately and only appear here if they fail.
- Mass mailings and other non-urgent emails wait for the Mail: Email Queue Manager scheduled action. Odoo's documentation says it runs every 60 minutes by default and recommends 15 minutes. If it is disabled, queued mail never leaves.
Common error messages
| What you see | Usual cause | Fix |
|---|---|---|
| Connection timed out, or connection refused | Port 25 blocked, or wrong host or port | Use 587 (STARTTLS) or 465 (SSL/TLS) |
| SSL or TLS handshake error | Security setting doesn't match the port | 465 with SSL/TLS, 587 with STARTTLS |
| 535 authentication failed | Wrong credentials, or the account needs an app password or OAuth | Create an app password, or use Odoo's Gmail or Outlook OAuth module |
| 550 sender not verified | The From address isn't allowed on the provider | Verify the domain at the provider and set FROM filtering |
| Emails arrive from notifications@ | No server allows the author's domain | Add a server or filter for that domain |
| Sent, but in spam | SPF, DKIM or DMARC missing or misaligned | Fix the DNS records, then test with a real inbox |
When delivery fails with no message at all, Odoo's documentation names SPF or DKIM as one of the most common reasons.
How Knova Cloud handles outgoing mail
- Production sends for real through the platform's mail server by default. In the project's Settings → Outgoing mail you see the server in use and the default sender, enter your domain, and click Check DNS: it lists the SPF include, the DKIM records and a starting DMARC record, and checks whether each one is in place. Admins can Send test email.
- Until your domain is allowed on the platform's mail server, emails go out from the default sender with your name kept, which is the FROM filtering behaviour described above.
- Your own mail server works too: add it in Odoo under Outgoing Mail Servers and it is used instead. Outbound port 25 is blocked, so use 587 or 465.
- Development and staging never email real people. Every email they send is caught and shown in the branch's Mails tab (HTML, plain text or raw source), and staging copies are neutralized, so a test invoice never reaches a customer. The staging documentation explains the rest.
- An imported database can have its old mail servers and scheduled actions switched off on import, so it doesn't send as the old system.
- The Monitor tab charts how many emails production sends and how many bounce, day by day.
The mail documentation has the screens. If you're moving from Odoo.sh, our migration guide covers the rest of the move, and the Community hosting page and the plans and prices show what's included. Running Odoo on your own server instead? The Odoo 20 installation guide walks through it, and we can install it for you.
A short checklist
- One working outgoing server, on port 587 or 465, with Test Connection passing.
- FROM filtering set to the domain your provider verified.
- An alias domain you control, with catchall and bounce mailboxes that exist.
- One SPF record, DKIM from your provider, and a DMARC record.
- The email queue's scheduled action running, and no emails stuck in Delivery Failed.
- A test to a Gmail and an Outlook address, checking the spam folders.
Sources
- Odoo 19.0 documentation, Manage outbound messages: server selection, FROM filtering, alias domain, port 25.
- Odoo 19.0 documentation, Configure DNS records to send emails in Odoo: SPF, DKIM, DMARC.
- Odoo 19.0 documentation, Common emailing issues and solutions: delivery failures, the email queue, errors.
- Odoo 16.0 documentation, Email servers (Odoo 16): the system parameters of older versions.
- Google Workspace Admin Help, Email sender guidelines.
Sources checked on 8 October 2026. Odoo and Odoo.sh are trademarks of Odoo S.A. Knova Cloud is an independent service, not affiliated with or endorsed by Odoo S.A.