Building Scalable Email Automation with AWS Lambda, SES, and S3

A Comprehensive Guide to Mass Emailing Using Serverless Architecture

Building Scalable Email Automation with AWS Lambda, SES, and S3

Welcome, fellow cloud maestros! In this blog post, we'll dive into the exciting world of mass emailing using AWS Lambda, Simple Email Service (SES), and Simple Storage Service (S3). By the end of this project, you'll have a hands-on understanding of serverless functions, cloud storage, and email automation, showcasing your ability to create cost-effective and scalable solutions.


Email marketing is a powerful tool for businesses to engage with their audience. However, sending personalized emails to a large audience can be a daunting task. That's where AWS Lambda, SES, and S3 come into play. In this project, I'll walk you through the process of setting up a serverless function that automates the mass emailing process, making it not only efficient but also scalable.

1. Setting Up S3 for CSV File Uploads

Create a designated S3 bucket where you'll upload a CSV file containing email addresses and message content.

2. Creating and Verifying SES Identities

Before diving into the email-sending process, create SES identities for both sender and receiver email addresses. This involves verifying domain ownership and email address verification within the SES console. These identities are essential for maintaining a high deliverability rate and ensuring that your emails reach the intended recipients. is the sender's email address, and all other email addresses are considered receiver email addresses.

When setting up SES identities, you would verify the email address for as the sender, and for other email addresses, you would ensure their verification within the SES console to maintain a high deliverability rate. This distinction is essential for configuring SES to handle both the sender and receiver roles effectively in your mass email automation project.

3. Setting Up AWS Lambda with SES

Create an AWS Lambda function and configure it to access SES. Ensure that your Lambda function has the necessary permissions to send emails through SES. This step is crucial for establishing a secure and reliable connection between your Lambda function and the email service.

3.1 Create a role for Lambda

To empower your Lambda function, create an IAM (Identity and Access Management) role that grants the required permissions.

Attach Policies: In the "Attach permissions policies" section, search for and attach the following policies:

  • AmazonS3ReadOnlyAccess

  • AmazonSESFullAccess

  • CloudWatchLogsFullAccess

These policies grant the Lambda function read access to S3, full access to SES, and full access to CloudWatch Logs for monitoring purposes.

3.2 Create a Lambda Function

With the IAM role in place, it's time to create the Lambda function. This function will be responsible for handling the logic of your mass email campaign.

4. Setting S3 Event Triggers

To make the process seamless, configure an S3 event trigger that monitors the designated bucket for new CSV file uploads. Whenever a new file is detected, this trigger will automatically invoke your Lambda function, initiating the email-sending process.

5. Logic for Lambda Function

Develop a robust logic within your Lambda function to import the CSV file, extract recipient information, and send personalized messages using AWS SES. This step involves parsing the CSV file, extracting relevant data, and dynamically generating personalized emails for each recipient.

After writing the code, click Deploy

import json
import boto3
import urllib.parse
import csv
from io import StringIO

ses = boto3.client('ses', region_name='ap-south-1')
s3 = boto3.client('s3')

def lambda_handler(event, context):

    s3_bucket_name = event['Records'][0]['s3']['bucket']['name']
    s3_file_key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')


    ses_sender_email = ''

    response = s3.get_object(Bucket=s3_bucket_name, Key=s3_file_key)
    csv_data = response['Body'].read().decode('utf-8')
    reader = csv.DictReader(csv_data.splitlines())
    for row in reader:
            recipient_email = row['Email']
            personalized_message = row['Message']

            # print(recipient_email)
            # print(personalized_message)

            send_email(ses, ses_sender_email, recipient_email, personalized_message)

def send_email(ses, sender_email, recipient_email, message):
        Source = sender_email,
        Destination = {
            'ToAddresses': [recipient_email]
        Message = {
            'Subject': {
                'Data': 'Testing SES',
                'Charset': 'UTF-8'
            'Body': {
                    'Data': message,
                    'Charset': 'UTF-8'

    return {
        'statusCode': 200,
        'body': json.dumps('Successfully sent email from Lambda using Amazon SES')

6. Upload CSV File

It's time to populate it with your CSV files. Ensure that each file contains crucial information, including recipient email addresses and personalized message content. This step forms the foundation for your mass emailing campaign.

one piece.csv

Once the CSV file is successfully uploaded into the designated S3 bucket, the magic begins. The configured S3 event trigger promptly notifies the SESLambdaFunction Lambda function of the new file's presence. This trigger initiates the Lambda function, which, in turn, reads the CSV file, extracts recipient information, and dynamically generates personalized emails. Now, watch as your meticulously crafted emails are sent to the specified email addresses within the CSV file, demonstrating the power of serverless architecture in automating mass email campaigns efficiently.


By completing these steps, you've showcased your ability to integrate serverless functions, cloud storage, and email automation – a valuable addition to your skill set and a testament to your capability in the evolving landscape of cloud technology. Whether you're a seasoned developer or a newcomer, this project paves the way for a successful and impactful career in the tech industry.