How to send an HTML form to your email
August 31, 2026
HTML can draw a form, but it can't send email. There is no
action="email:[email protected]", and the closest thing that
does exist, a mailto: action, pops open whatever mail app
the visitor's machine defaults to, which for most people is nothing
they've ever configured. The form needs a server to POST to. It just
doesn't have to be your server.
The whole thing, in one snippet
Create a free NormForms form and you get an endpoint URL. Point any HTML form at it:
<form action="https://normforms.com/f/YOUR_TOKEN" method="POST"> <label for="nf-name">Name</label> <input id="nf-name" type="text" name="name" autocomplete="name" required> <label for="nf-email">Email</label> <input id="nf-email" type="email" name="email" autocomplete="email" required> <label for="nf-message">Message</label> <textarea id="nf-message" name="message" required></textarea> <input type="text" name="_gotcha" style="display:none" tabindex="-1" autocomplete="off"> <button type="submit">Send</button> </form>
Every field name you invent arrives in the email. Add
<input name="budget"> to the HTML and "budget" shows
up in your inbox; there's no dashboard configuration step. The
_gotcha field is a honeypot for bots: keep it hidden and
empty.
The alternatives, and why they're worse
- mailto: links. They depend on the visitor having a configured desktop mail client. On a work laptop or any phone browser, that's a coin flip that mostly lands on "nothing happens" and the message is lost.
- Sending from JavaScript. Browser JavaScript can't speak SMTP, so every "send email from JS" tutorial is really a third-party API with your credentials exposed client-side, plus rate-limit and spam problems you now own.
- Your own PHP/serverless mailer. Works until it lands in spam folders, because a random server posing as a mail sender is exactly what spam filters exist to catch. Deliverability is a full-time job; don't take it on for a contact form.
Test it before you ship
Submit the form from localhost and it's automatically test mode: the email arrives with a [Test] prefix and doesn't count against your quota. Once deployed, set your site's domain in the form's settings and submissions from any other origin are silently dropped. Spam that gets caught never counts against your monthly limit either.