Build a Serverless Contact Form with Lambda + API Gateway + SES 📩
Yash Sonawane

Yash Sonawane @yash_sonawane25

About: Passionate about DevOps and cloud technologies. Sharing insights, tutorials, and experiences to simplify complex concepts for everyone. 🚀

Joined:
Nov 26, 2024

Build a Serverless Contact Form with Lambda + API Gateway + SES 📩

Publish Date: Aug 21
7 2

"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' }),
  };
};
Enter fullscreen mode Exit fullscreen mode

✅ 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
    1. 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));
Enter fullscreen mode Exit fullscreen mode

⚠️ 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.

Comments 2 total

  • Roshan Sharma
    Roshan SharmaAug 21, 2025

    Nice guide
    Serverless contact form with Lambda and SES is clean, might be worth adding validation or spam protection for production use.

  • PrettifyCode
    PrettifyCodeAug 25, 2025

    Nice guide

Add comment