All articles

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:

  1. A server whose FROM filtering matches the sender's address or domain (for example a server with the filter example.com for sales@example.com).
  2. Otherwise, the first server without a FROM filter, and the From address is replaced by the notification address (by default notifications@ your alias domain).
  3. Otherwise, the first server, again with the notification address.
  4. 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_filter system 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 (notifications by default): the sender used when the real author can't be.
  • Catchall (catchall by default): the Reply-To address, so replies go back to the right document.
  • Bounce (bounce by 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 seeUsual causeFix
Connection timed out, or connection refusedPort 25 blocked, or wrong host or portUse 587 (STARTTLS) or 465 (SSL/TLS)
SSL or TLS handshake errorSecurity setting doesn't match the port465 with SSL/TLS, 587 with STARTTLS
535 authentication failedWrong credentials, or the account needs an app password or OAuthCreate an app password, or use Odoo's Gmail or Outlook OAuth module
550 sender not verifiedThe From address isn't allowed on the providerVerify the domain at the provider and set FROM filtering
Emails arrive from notifications@No server allows the author's domainAdd a server or filter for that domain
Sent, but in spamSPF, DKIM or DMARC missing or misalignedFix 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

  1. One working outgoing server, on port 587 or 465, with Test Connection passing.
  2. FROM filtering set to the domain your provider verified.
  3. An alias domain you control, with catchall and bounce mailboxes that exist.
  4. One SPF record, DKIM from your provider, and a DMARC record.
  5. The email queue's scheduled action running, and no emails stuck in Delivery Failed.
  6. A test to a Gmail and an Outlook address, checking the spam folders.

Sources

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.

About the author

Muhammad Salman Ali Khan, Founder, Knova Digital Solutions

Muhammad Salman Ali Khan is the founder of Knova Digital Solutions in Dubai. He builds and runs Odoo hosting and Odoo implementations for companies in the UAE and beyond, and writes these guides from that day-to-day work.

Try the workflow on your own repository

Pick the workers, storage and staging environments you need, and your first branch builds in minutes.

See pricing · Talk to us