splitforms.com
← Back to the journal

Why mailto: Doesn't Work as a Form Action (and What to Use Instead)

Using action="mailto:you@example.com" opens the visitor's mail app instead of sending anything. Here's why it quietly kills conversions and what to use…

Start free — 500 submissionsSee pricing →No card, no time limit. Pro is $5 per month.
Short answer
action="mailto:you@example.com" doesn't send your form — it asks the visitor's device to open an email draft and send it themselves. No mail client configured (true for most mobile users) means nothing happens at all. Replace one attribute — point action at a real endpoint — and the same HTML form starts delivering, recording, and spam-filtering every submission.
Try it on your own form

Point any HTML form at one endpoint. 500 free submissions — no card, no time limit — and unlimited forms.

Create free account

What mailto: actually does (and doesn't do)

The mailto: scheme predates forms themselves. When a browser encounters it as a form action, it does not perform an HTTP request. Instead it:

  1. URL-encodes your fields into a message body (as name=value pairs).
  2. Hands that to the operating system's default mail client as a new draft.
  3. Waits. The submission only "sends" if a human then presses Send in Outlook, Apple Mail, or Thunderbird.

Every step leaks users. If no default client is configured — the normal state on phones, Chromebooks, and any browser-only Gmail user — the click does literally nothing. No error, no feedback. To the visitor, your form is broken; to you, the lead never existed.

The hidden costs beyond "it doesn't send"

  • No record. Nothing is stored server-side. If the email never reaches you (spam folder, typo in the address), there is no backup copy anywhere.
  • No validation or spam control. Required fields, format checks, honeypots — none apply inside the visitor's mail app. Bots don't even need to attack you; your address sits in the page source for scrapers.
  • No analytics. You can't measure submission rate, abandonment, or source (UTM parameters die at the mail-client boundary).
  • Address exposure. Your email is in plain HTML for every harvester. Expect the spam curve to start immediately.
  • Lost conversions. An in-page form is one click. mailto: is a context switch into another app plus a manual send, and every visitor who gives up between those steps is a lead that never reaches you.

The one-attribute fix

Keep your exact HTML — fields, styling, validation — and change only where it posts:

<!-- Before: relies on the visitor's mail app -->
<form action="mailto:you@example.com" method="POST" enctype="text/plain">

<!-- After: posts to a real endpoint -->
<form action="https://splitforms.com/api/submit" method="POST">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
  <input name="name" required />
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <button type="submit">Send</button>
</form>

With splitforms, each accepted submission is saved in a searchable dashboard before owner notification email is attempted (so a bad mail day never loses a lead), and filtered by automatic spam scoring plus honeypot — free for 500 submissions total, no credit card. It works on any static host, and the same endpoint accepts AJAX/JSON posts if you later add JavaScript.

Alternatives and trade-offs — serverless functions, PHP mailer scripts, hosted builders — are compared in HTML form to email without PHP and sending form data without a server.

Where mailto: is still fine

As a plain link — "Email us" in a footer, or a support address in docs — mailto: is harmless and expected. Just never make it the submit path of a form whose submissions you care about. If you want a well-formed mailto link with subject and body prefill, use the mailto link generator. For the difference in outcomes, see contact form conversion benchmarks and how the form action attribute works.

Other form problems and fixes

Still stuck? Test your endpoint with our free Form Action Tester or contact splitforms support.

FAQ

What happens when I use action="mailto:" on a form?

Instead of sending the submission to a server, the browser tries to open the visitor's default email application with a pre-filled draft containing the form data. The visitor then has to manually press Send in their mail app. Nothing is transmitted when they close the draft — and on most modern devices there is no configured default mail client at all, so nothing happens.

Why doesn't the mailto: form submit anything on my phone?

mailto: depends on a locally installed, configured email client. Most mobile browsers hand it to the OS mail app — if the user only uses Gmail in a browser tab, or hasn't set up the Mail app, the link does nothing. Desktop browsers increasingly do the same. There is no fallback and no error message; the form simply appears broken.

Is there any case where mailto: is acceptable?

Only as a plain 'Email us' link where the goal is to start a human conversation and losing some users is acceptable — never as the submit path of a lead, order, or support form. For those, you need a POST endpoint that records the submission server-side.

How much does mailto: hurt conversions compared to a real form?

We haven't found a published study that measures it, so we don't quote a multiplier — be wary of figures that come without a source. The mechanism is clear, though: a form is one click in-page, while mailto: needs a configured mail client, a context switch, and a second manual send, and every visitor who drops out at one of those steps is a lead you never see. A form also validates input, filters spam, and stores a copy; mailto: does none of these. To measure it on your own site, compare clicks on the mailto: button with the emails that actually arrive.

What should I use instead of mailto:?

Point the form at a form endpoint: action="https://splitforms.com/api/submit" method="POST" with a hidden access_key field. Accepted submissions are saved in a searchable dashboard before owner notification email is attempted, and spam-filtered — no backend code, no mail client required from your visitors. Free for 500 submissions total.

Can JavaScript make a mailto: form actually send?

No. JavaScript running in a browser cannot send email — there is no mail protocol access from the client for security reasons. Workarounds like EmailJS proxy through a third-party API (which is really a form backend with a different name). The reliable path is always an HTTP POST to a server you control or a hosted endpoint.

Swap the action once and every submission is delivered, stored, and spam-filtered. Get a free access key.

Related: form to email, receive submissions by email, and the HTML form action guide.

Related articles

More practical guidance from guides.

Browse the journal →
Guides

Gravity Forms Not Sending Email? 5 Fixes That Work (2026)

Gravity Forms notifications not arriving? Find the wp_mail cause in 2 minutes and fix it wit…

7 min readRead →
Guides

Form Backend Migration Checklist: Fields, Files and Email

Move an existing form to SplitForms with a practical checklist for field mapping, redirects,…

6 min readRead →
Guides

Best MCP Servers for Building Forms with AI Agents (2026)

Ranked MCP servers that let Claude Code, Cursor, and other agents create forms and read subm…

12 min readRead →

Explore this topic

Start with the overview, then move into focused guides.

OverviewContact Forms for Every FrameworkStart here →GuideContact Form for Next.jsRead →GuideContact Form for ReactRead →GuideContact Form for VueRead →ReferenceContact form guideOpen →

Building forms with ChatGPT, Claude, Cursor, or v0? Connect the native MCP server and give your agent a production form backend.

Explore the MCP server →

Give your form a production backend.

One endpoint adds delivery, spam filtering, storage, and integrations. Start with 500 free submissions — no card, no time limit.

Create free accountRead the docs →
Secure checkoutSSL encryptionPrivacyProtected
VISAAMERICANEXPRESSstripe