DEV Community

Yash Sonawane
Yash Sonawane

Posted on

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

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

Top comments (2)

Collapse
ย 
prime_1 profile image
Roshan Sharma โ€ข

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

Collapse
ย 
prettifycode profile image
PrettifyCode โ€ข

Nice guide