NodeJS app to send form submissions by email
GPL-3.0 License
This project is made for those who need to add custom HTML forms a static page or static website.
It is a simple nodejs server which forwards all POST submission by email. Inspired by the excellent formspree with the goal to be simpler to install and cheaper to host. No database, 100% server (nodejs), just sends the submissions by email.
100% free software. No data is kept on the server. No tracking.
Suggestion: you can automate the management of the subissions with tools like Huginn, node-red, IFTTT, Zappier
Links:
Features and road map
Open http://localhost:8080
to see the HTML form which resides in form.html
.
Submit the form and it will send you an email with the content of the form.
Create any html form which POST data to the server, it will keep sending you all the field of the form by email.
Example:
<form method="post" action="http://localhost:8080">
<input type="text" name="name" placeholder="Name" required>
<input type="email" name="email" placeholder="Email" required>
<textarea name="message" placeholder="Message" required></textarea>
<button type="submit">Send</button>
</form>
For this to work, the server must be started with the following environment variables:
TO="[email protected],[email protected]" \
EMAIL_USER="username" \
EMAIL_PASS="*******" \
EMAIL_HOST="mail.gandi.net" \
EMAIL_PORT=587 \
npm start
This is a feature to avoid spam. You can use tokens in place of email addresses to avoid spam. The form will be expected to have a hidden field with the name token
and the value of the token. If the token is found in the object, the email will be sent to the corresponding email address(es).
Start the app with the following environment variable
TO='{"token1":"[email protected]","token2":"[email protected],[email protected]"}' \
# ... other env variables
npm start
Add a hidden field to your form with the name token
and the value of the token you want to use.
<form method="post" action="http://localhost:8080">
<input type="hidden" name="token" value="token1">
<input type="text" name="name" placeholder="Name" required>
<input type="email" name="email" placeholder="Email" required>
<textarea name="message" placeholder="Message" required></textarea>
<button type="submit">Send</button>
</form>
You can provide a link to a thank you page in the form. The server will redirect to this page after the form is submitted.
<form method="post" action="http://localhost:8080">
<input type="text" name="name" placeholder="Name" required>
<input type="email" name="email" placeholder="Email" required>
<textarea name="message" placeholder="Message" required></textarea>
<button type="submit">Send</button>
<input type="hidden" name="thanks" value="http://localhost:8080/thank-you.html">
</form>
For this to work, you need to start the server with the following environment variable:
REDIRECT=true \
REDIRECT_DOMAINS="localhost,your-domain.com" \
# ... other env variables
npm start
You can use the docker image to run the serverless form server.
docker run -e EMAIL_USER="username" \
EMAIL_PASS="********" \
EMAIL_HOST="mail.gandi.net" \
EMAIL_PORT=587 \
TO="[email protected]" \
-p 8080:8080 lexoyo/serverless-form
Deploy in 1 click on heroku
Clone this repository and run the following commands:
$ npm install
$ EMAIL_USER="username" \
EMAIL_PASS="*******" \
EMAIL_HOST="mail.gandi.net" \
EMAIL_PORT=587 \
TO="[email protected]" \
npm start
Here are all the environment variables you can use
Env var | description |
---|---|
MESSAGE | Message to displayed after the form submission. May contain HTML. Default: 'Thank you for your submission.' |
DISCLAIMER | Message added to the email sent to the recipient. May contain HTML. Default: 'A form has been submited on your website. This is an automated email. Please do not reply to this email.' |
TO | Email address(es) to send the form to (your email) |
TO | A json object with tokens as keys and email addresses as values. The form will be expected to have a hidden field with the name token and the value of the token. If the token is found in the object, the email will be sent to the corresponding email address(es). |
FROM | Email address to use as sender address |
REDIRECT | If set to true, the server will redirect to the URL provided in the thanks hidden field of the form |
REDIRECT_DOMAINS | Comma separated list of domains for which the server will redirect to the URL provided in the thanks hidden field of the form |
PORT | Port to listen to for form submissions |
FORM | Path to the HTML file containing the example form, defaults to ./form.html |
EMAIL_HOST | SMTP config: see these options here |
EMAIL_PORT | SMTP config: see these options here |
EMAIL_USER | SMTP config: see these options here |
EMAIL_PASS | SMTP config: see these options here |