Most email servers require monthly subscriptions ranging from $5 to $12, which can be unnecessary for small-scale projects or prototypes with minimal email needs. For developers and hobbyists seeking a budget-friendly solution, AWS SES and S3 offer a powerful alternative for receiving and storing emails at little to no cost.
Why Use S3 for Email Storage?
Amazon S3 (Simple Storage Service) is renowned for its scalability, reliability, and low cost. By integrating S3 with AWS Simple Email Service (SES), it is possible to configure an email domain to forward incoming messages directly to an S3 bucket. SES manages the email reception process, while S3 serves as the storage solution by saving messages as files. For low-volume use, this approach is highly economical, as SES offers 3,000 inbound emails per month at no cost for the first 12 months, and afterward charges only $0.10 per 1,000 emails.
The flexibility of S3 further enhances its utility by enabling email automation and processing through other AWS services. For example, AWS Lambda can be employed to forward received messages to a personal email address, while CloudWatch alarms can trigger notifications whenever a new message is received.
Requirements:
- An AWS account. (How to create an AWS account)
- A domain, preferably managed by Route53.
- An S3 bucket to save incoming messages.
How to Set It Up:
The process begins by allowing the domain to capture SMTP traffic and routing it to SES. For this, an MX record should be added to the corresponding SES region into Route53. For example, in us-east-1 the following endpoint is used in the MX value field: inbound-smtp.us-east-1.amazonaws.com
. A full list of the regions and endpoints can be found here.
Now let’s proceed to verifying the domain in AWS SES. In this case the full domain is verified so that we can capture traffic for all domain addresses under example.com
domain. This will enable capturing requests from any name such as hello@example.com
or no-reply@example.com
.
In SES, an identity should be created by navigating to SES, identities, selecting domain type and leaving all default configurations. This will output more DNS records to be added the Route53 domain. After that, verification process should take a few minutes.

Once the domain is verified, a role must be created with proper permissions to allow SES to put messages into the bucket and a trust policy to allow SES to assume this role:
Once the domain is verified, an IAM role must be created that allows SES to put incoming emails into the S3 bucket. This involves two steps: defining a permissions policy and setting up a trust policy. Below is the correct permissions policy that grants SES access to the S3 bucket:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3Access",
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::bucket-name/*"
}
]
}
Here, replace bucket-name
with the name of your S3 bucket. Note the /*
at the end of the bucket ARN, which allows SES to create objects in the bucket.
Additionally, a trust policy is required to let SES assume the role. Use the following trust policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ses.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
After verifying the domain and setting up permissions, the final step is to create an SES rule set to route incoming emails to the S3 bucket. In the AWS SES console, navigate to Rule Sets and click Create Rule. Specify the recipients (e.g., *@example.com
to capture all emails sent to your domain). Under Actions, choose Add Action and select S3 as the destination. Then, specify the S3 bucket name where emails will be stored and set an optional object key prefix (e.g., inbox/
). You can also enable encryption or specify a SNS topic for notifications. Once the rule is created, ensure that it is enabled, and SES will start routing emails to your S3 bucket according to the rule.

Using an S3 bucket with AWS SES is a practical way to receive emails for free or at a very low cost. Itโs perfect for small-scale projects, testing, or when you need email functionality without the recurring subscription of traditional email services. With the scalability and integration options provided by AWS, you also gain the flexibility to process and manage emails programmatically. So, whether you’re a developer, entrepreneur, or hobbyist, this solution can save you money while offering a surprising amount of power and customization. Why pay for what you donโt need when AWS can handle it efficiently?