Build a Serverless Contact Form with Lambda + API Gateway + SES ๐Ÿ“ฉ

Yash SonawaneYash Sonawane
3 min read

"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:

  1. API Gateway receives the request (HTTP POST)

  2. Lambda processes the form data

  3. 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

  1. Go to SES Console โ†’ Email Addresses

  2. Click Verify a New Email Address

  3. Enter your receiving email (e.g. yourname@gmail.com)

  4. 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

  1. Go to API Gateway Console โ†’ Create API

  2. Choose HTTP API

  3. Add integration: Lambda function โ†’ sendContactForm

  4. Add route:

    • Method: POST

    • Path: /contact

  5. 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.

0
Subscribe to my newsletter

Read articles from Yash Sonawane directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Yash Sonawane
Yash Sonawane

DevOps & Cloud Engineer | AWS, Docker, K8s, CI/CD Writing beginner-friendly blogs to simplify DevOps for everyone.