Skip to main content
iVentureTeam

email

The email widget makes addresses actionable: a mailto: link in lists, an envelope button on forms. What it deliberately does not do, validate addresses beyond the browser's loose check, is just as important to know.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 12, 2026Updated August 12, 20265 min read
Odoo 19 contact form and list showing the email widget: an editable address with envelope icon, and list cells as mailto links.
Studio nameE-mail
Technical nameemail
Field typeschar
Viewsform (form.email variant), list, kanban
Form variantform.email, which keeps the input and adds the envelope link
Moduleweb, present in every Odoo database
Used in core17 occurrences across 11 modules, including hr, calendar, crm, survey, account, event_booth
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0
No-code setupYes, via Odoo Studio (Enterprise)
Alternativesphone, url, CopyClipboardChar

What the Email widget does

The email widget is the char field renderer for addresses. In readonly contexts the entire value becomes an anchor with a mailto: href, so a click lands in the user's mail client with the recipient prefilled. In edit mode on forms, the form.email variant renders an editable input with an envelope icon beside it carrying the same mailto link, editable and actionable at once.

The input is declared type="email", which buys exactly two things from the browser: a keyboard with the at sign on mobile, and the browser's built-in complaint when the text is not shaped like an address. Read the source and you find nothing else: no regex, no server round trip, no normalization. An address the browser accepts, or one written by an import or API call, is stored as-is.

That minimalism is a design choice worth understanding: Odoo treats deliverability as the mail stack's problem and rendering as the widget's problem. The widget's job ends at the mailto link.

What this means for your team

Email addresses are the most clicked values in any CRM. The widget removes the copy-paste hop between seeing an address and writing to it, and on lists it turns entire columns into one-click outreach. Small friction, large volume.

The validation gap is the business-relevant part. The browser check stops typos like a missing at sign, but only in interactive editing; imports, integrations and quick-create paths bypass it entirely. If bounced mail costs you money, campaigns, invoicing reminders, portal invitations, the fix is a server-side constraint or a verification service wired into your entry flows, not trust in the widget.

Note also what clicking does: it opens the user's local mail client, outside Odoo. Teams that should send tracked mail from the record's chatter, where it lands in the customer history, may actually want that habit discouraged in favor of the chatter's Send Message, a training point more than a technical one.

Setting it up in Odoo Studio (no code)

Studio documents this widget for Text fields.

  1. Open the view in Studio and select the field holding the address (a Text field).

  2. In the Properties tab, set Widget to E-mail.

  3. Click Close to leave Studio.

What Studio cannot do here

The widget has one option and Studio's generic properties cover the rest, so Studio coverage is essentially complete. What no view tool provides is real validation or deduplication of addresses; both live on the model or in the mail stack.

Supported options in Odoo 19

Verified against email_field.js in the Odoo 19.0 web module: one supported option, nothing read from extractProps beyond it. The shortest real option table in this widget set.

OptionTypeWhat it does
placeholder_fieldfield nameReads the input's placeholder text from another char field on the record instead of a static placeholder attribute.(since Odoo 19.0)

Working examples

List column of clickable addresses

<field name="email" widget="email"/>

Form field with dynamic placeholder

<field name="email_from" widget="email"
       options="{'placeholder_field': 'partner_email'}"/>

While empty, the input shows the partner's address as gray placeholder text, useful on records that fall back to the partner address when their own is empty.

Server-side validation to close the gap

@api.constrains("email")
def _check_email(self):
    for rec in self:
        if rec.email and "@" not in rec.email:
            raise ValidationError("Invalid email address.")

The widget will never do this for you; a constraint catches every write path, including imports.

What the two templates actually render

The base template has two branches. Readonly renders the anchor: the whole value, ellipsized when the column is narrow, with the mailto href built by simple concatenation. Edit renders the bare input, nothing else, which is what list rows use in editable lists.

The form variant inherits the base and appends the envelope: an anchor rendered only when the field has a value, with a tooltip reading Send Email. Small inconsistency collectors will enjoy this: the form envelope carries target="_blank" while the readonly link does not, harmless for mailto, but a genuine fingerprint of how the two templates evolved separately.

Because the href is plain concatenation, the widget happily links whatever is stored: an address with a display name, two addresses separated by a comma. The mail client receives it verbatim; what happens next depends on the client. One field, one address is the discipline that keeps this widget honest.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. No changes on the development branch beyond the framework port; see below.
Odoo 19.0VerifiedVerified against the shipped source and templates.
Odoo 18.0VerifiedIdentical except placeholder_field, which arrived in 19.0. Verified against the 18.0 source.

Upgrading from Odoo 18? One addition: placeholder_field did not exist in 18.0. Everything else, both templates, both registrations, the type="email" input, is identical.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The changes below are read from the public development branch and are not final until release.

Nothing user-facing changes. The single option, both templates' behavior and both the email and form.email registrations are unchanged; the component is ported to the new Owl props and signal refs. JavaScript patches importing the class need review; XML does not. We re-verify after release.

Common problems and fixes

SymptomCause and fix
Clicking an address does nothingNo mail client is registered for mailto: on the user's machine, common on corporate desktops using only webmail. Register the webmail as the mailto handler (browsers support this), or copy the address instead.
Invalid addresses keep appearing in the databaseThe browser's type=email check only guards interactive edits; imports and API writes bypass it, and the widget adds no validation. Add a Python constraint or an email verification step to your entry flows.
The envelope icon is missing on the formThe field is empty, the icon renders only when a value exists, or the view uses the base widget in an embedded list. Save a value; on forms make sure the field is rendered by the form (the form.email variant is picked automatically).
Mail opens with a strange recipientThe stored value contains extra text (display name, second address); the href links it verbatim. Clean the value to a single bare address; one field, one address.
Emails sent this way do not appear in the chattermailto opens the user's local client, entirely outside Odoo. Send from the record's chatter instead when history matters; the widget link is for quick personal mail.

Email widget vs the alternatives

WidgetBest forKey difference
emailEmail addresses your team writes tomailto link plus form envelope; validation intentionally left to browser and server
phonePhone numbers with click to calltel link, whitespace-stripped href, SMS action
urlWeb linksNew-tab anchor with scheme prefixing and custom link text
CopyClipboardCharValues users copy rather than send toCopy button, no linking

Same family, different protocols: phone for tel links, url for the web. If your users copy addresses into other systems more than they mail them, CopyClipboardChar is the better verb.

Frequently asked questions

How do I make email addresses clickable in Odoo?+
Set widget="email" on the char field, or pick the E-mail widget in Studio. Readonly values become mailto links; forms get an envelope icon beside the editable input.
Does Odoo validate email addresses?+
Not in this widget. The input's type="email" makes the browser flag malformed text during interactive edits, but imports and API writes store anything. Add a Python constraint for real enforcement.
Can I make the click open Gmail or Outlook web instead of a desktop app?+
Yes, but in the browser, not in Odoo: register your webmail as the browser's mailto handler and every mailto link, including Odoo's, opens there.
Why use the widget instead of sending from the chatter?+
Different jobs. The widget link opens your own mail client for quick personal messages; the chatter sends through Odoo's mail stack and logs the exchange on the record. For anything customers reply to, the chatter usually wins.
Can one field hold several addresses?+
The widget will link whatever is stored, commas and all, and mail clients differ in how they parse it. Keep one address per field; model multiple recipients as separate fields or partner records.
What does placeholder_field do?+
It reads the gray placeholder text from another char field on the record, added in 19.0. Useful when the effective address falls back to a related record's address that the user should see while the field is empty.

Do your emails reach the inbox?

A clickable address is step one. Deliverability is the rest: SPF and DKIM on your sending domain, bounce handling, mail templates that render everywhere, and clean address data to begin with. We set up and repair the full Odoo mail stack for companies that live in their inbox.

Book a free consultation

How this page was produced

This page was verified by reading email_field.js and its QWeb templates in the Odoo 19.0 web module, confirming the absence of validation logic, the option list, and both registrations, with the same file compared on the 18.0 branch and the development branch. Studio steps follow Odoo's Studio documentation for Text field widgets. Spotted an error or a version difference? Tell us and we will correct the page.