This content originally appeared on DEV Community and was authored by Yash Sonawane
“Want to send emails from your website without running a server? Youβre 15 minutes away from magic.”
Serverless architecture is a game-changer β especially for simple, powerful features like contact forms. No more PHP mailers or backend servers. Just a few AWS services and you’re good to go!
In this guide, weβll create a fully functional serverless contact form using AWS Lambda, API Gateway, and SES (Simple Email Service).
Letβs dive in and get your inbox buzzing.
What We’ll Build
A user submits a contact form on your static website. Hereβs what happens:
- API Gateway receives the request (HTTP POST)
- Lambda processes the form data
- SES sends the email to your inbox
Like a digital postman that never sleeps.
Prerequisites
- AWS account with SES verified email
- Basic knowledge of JavaScript and AWS Console
- A static site (e.g., React, HTML, etc.) hosted on S3 or anywhere else
Step 1: Verify Email in AWS SES
- Go to SES Console β Email Addresses
- Click Verify a New Email Address
- Enter your receiving email (e.g.
yourname@gmail.com
) - Click verification link in the email
Done! SES can now send emails to (and from) that address.
Step 2: Create Lambda Function
Go to Lambda Console β Create function β Author from scratch
- Name:
sendContactForm
- Runtime: Node.js 18.x
Paste this sample code:
const AWS = require('aws-sdk');
const SES = new AWS.SES();
exports.handler = async (event) => {
const { name, email, message } = JSON.parse(event.body);
const params = {
Destination: {
ToAddresses: ['yourname@gmail.com'],
},
Message: {
Body: {
Text: { Data: `Name: ${name}\nEmail: ${email}\nMessage: ${message}` },
},
Subject: { Data: 'New Contact Form Submission' },
},
Source: 'yourname@gmail.com',
};
await SES.sendEmail(params).promise();
return {
statusCode: 200,
body: JSON.stringify({ message: 'Email sent successfully' }),
};
};
Don’t forget to update the
ToAddresses
and Source
to your verified SES email.
Step 3: Connect Lambda to API Gateway
- Go to API Gateway Console β Create API
- Choose HTTP API
- Add integration: Lambda function β
sendContactForm
- Add route:
- Method: POST
- Path:
/contact
- Deploy and copy the Invoke URL
Step 4: Connect Frontend to API
Example fetch call from your React or HTML form:
fetch('https://your-api-id.execute-api.region.amazonaws.com/contact', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
name: 'John Doe',
email: 'john@example.com',
message: 'Hey there, this is awesome!'
})
})
.then(res => res.json())
.then(data => console.log(data));
For public APIs, consider adding a CAPTCHA or throttling to prevent abuse.
Extras (Optional but Cool)
- Add CORS support in API Gateway settings
- Enable logging in CloudWatch for debugging
- Use environment variables to store email addresses
- Validate input fields on frontend AND backend
You’re Live!
You now have a production-grade, serverless contact form that:
- Costs next to nothing
- Scales automatically
- Sends messages in seconds
And all this without managing a server.
What Will You Use It For?
- Your personal portfolio?
- A client landing page?
- A side project MVP?
Drop your use cases or questions in the comments!
Smash that if this helped you go serverless, and share it with someone who needs it.
This content originally appeared on DEV Community and was authored by Yash Sonawane