Your static sitecannot send mail.
Vercel, Netlify, Cloudflare Pages, GitHub Pages — none of them can send email. This is not a bug in your code; it is what the hosting is.
What is usually wrong
There is no process to send from
A statically exported Next.js app, Astro, Nuxt generate, Cloudflare Pages, GitHub Pages — none of them run code per request, so nothing exists to accept the POST and hand a message to a mail server. And you cannot talk SMTP from the browser: if you could, your credentials would be sitting in client-side JavaScript.
Adding a function does not give you a sender
An API route or an edge function accepts the submission, but sending still needs a mail provider account and an API key — and then domain verification, which means publishing DNS records. The function was the easy half.
nodemailer plus a Gmail account mostly does not work now
Using a personal Gmail as SMTP needs an app password, is rate limited, and breaks under any real volume. Since the 2024 sender requirements, mail from a domain without authentication is refused by the receiving side regardless of how you sent it.
Setting From to the person who wrote in
The common implementation — From is the submitter's address — means claiming someone else's domain. It fails SPF and DMARC by construction. From should be you (or the sending platform); the submitter goes in Reply-To.
Two ways out
Wire up a mail provider yourself
Sign up for Resend or SendGrid, write the function, verify your domain, keep the API key in an environment variable. Full control, and you own deliverability forever after: DNS, alignment, bounces, suppression lists.
Send over a domain that is already authenticated
Hand the receiving and the sending to infrastructure that is already authenticated. No DNS work on your side, no API keys to rotate. Reply-To is your own address, so answers land in your normal mailbox. That is what nintact is.
Start freeOne line where the form should appear — the framework does not matter. If you already have markup you like, point its action at the endpoint and keep it. Submissions come back sorted, with a reply already drafted.
<script src="https://nintact.com/embed.js"
data-nintact="YOUR_FORM_ID" async></script>Questions
Can a Vercel serverless function not send email?
The function runs fine. What it lacks is a way out: you still need an SMTP or mail-API account, and you still need to verify your domain with DNS records. Using nintact removes that whole half.
Can I keep the site fully static?
Yes. One script tag renders the form and receives the submission. No build configuration, no server to add, no framework requirement.
Do I have to touch my domain's DNS?
No. Mail leaves over an already-authenticated sending domain, so there is no SPF, DKIM or DMARC to add and nothing to wait on. If you later want mail sent from your own domain, that is available on the business plan.
Is there a free plan?
Yes. Unlimited forms, unlimited receiving, storage and notifications. The metered part is the AI: 30 sorted-and-drafted inquiries a month on free.