Setting up an AWS SES API User
September 8, 2026
This might be more for me than for you, dear reader. But let's create a new AWS API user that uses SES to send emails using an identity from IAM instead of SMTP credentials.
There's SMTP and there's API Users. API User is easier and more straightforward, I feel.
- Create the Identity and Tenant in the correct Region. Identities | Amazon Simple Email Service | us-east-2
- You can create the tenant while creating the SES Identity
- Ensure you do all the domain validation to send email
- Create a policy that ensures your new user can only send email from the domain it is supposed to (see below for my policy JSON)
- Go IAM Users to create your user: IAM users | IAM | Global
- Create a user: Create user | IAM | Global
- Select your policy. Change the filter to “Customer Managed”
- Go into user and create access key
- Third Party (need to research temporary IAM roles)
- Write down your access cause you won't ever see it again.
Now you can send email using the API credentials instead of the SMTP credentials.
You can use my Toolshed.Mailman.AwsSes NuGet if you're looking for an easy way to send mail using AWS SES. There's also Toolshed.Mailman if you need to send using SMTP.
This is the JSON for the policy that I use. You need to use your subscription ID (usually in the header in the upper right). The domain will be whatever domain you set up in SES. The tenant you created. If you cannot find the Id (I never can), ask the AWS AI Agent to get it for you. Tweak this as you see fit for your use case.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSESEmailSending",
"Effect": "Allow",
"Action": [
"ses:SendEmail",
"ses:SendRawEmail",
"ses:SendTemplatedEmail",
"ses:SendBulkTemplatedEmail"
],
"Resource": [
"arn:aws:ses:us-east-2:[your subscription ID]:identity/[domain]",
"arn:aws:ses:us-east-2:[your subscription ID]:identity/*@[domain]",
"arn:aws:ses:us-east-2:[your subscription ID]:configuration-set/Default",
"arn:aws:ses:us-east-2:[your subscription ID]:tenant/[tenant name]/tn-[tenant Id]"
]
},
{
"Sid": "AllowSESStatusChecking",
"Effect": "Allow",
"Action": [
"ses:GetSendQuota",
"ses:GetSendStatistics",
"ses:GetAccountSendingEnabled"
],
"Resource": "*"
},
{
"Sid": "RestrictFromAddress",
"Effect": "Allow",
"Action": [
"ses:SendEmail",
"ses:SendRawEmail",
"ses:SendTemplatedEmail"
],
"Resource": "*",
"Condition": {
"StringLike": {
"ses:FromAddress": "*@[domain]"
}
}
}
]
}
More Posts
Setting up an AWS SES API User
This might be more for me than for you, dear reader. But let's create a new AWS API user that uses SES to send emails using an identity from IAM instead of SMTP credentials.
What we need is de-enshittification
5/26/2026
As we're neck-deep into late stage capitalism and the work is on the brink of eating itself into a pile of shit. What can we do to stop it? Easy, de-enshittify.
Web Development Tools
There are a ton of tools that you can use to develop good websites for clients your employer or just yourself. And while AI will one day do all of this for us, for now, take note.
Azure Table Storage - Use V1 To Save Money
Just like in 2018, V1 storage accounts are the more economical way to use the service - for blobs, queues and NoSQL. But the Azure Portal no longer lets you. That's fine, we've got ways!
.NET 10 Watch List
With every version of .NET, a sleuth of features, enhancement, upgrades, quality of life tweaks, etc. are added. Here's the list to keep an eye on.
tl;dr - Where shall I put you?
The internet creation of the TL;DR is an interesting concept that's quite popular and used wrong most of the time. Like so many things, it's probably too late to fix.
Brag Book
The idea of bragging and gloating is often looked at as a bad thing. A recent podcast talks about bragging - to ourselves. And I love it.
Sports Will Never Let Us Be Great
The adoration and fanaticism that we (the Human Race) have with sports (all of them, one of them, some of them - you pick) will undoubtedly curb all possibilities of society truly becoming its greatest version.
Post Your Drafts. Full Send
In a constant struggle to get it just right, where perfection is the enemy of...everything. This is an essay into putting it all out there, whether ready or not.
Azure Table Storage Row Limits
What do you do when you can't store your data in Azure storage tables, but the tech is exactly what you. You move on. Just kidding. Let's talk about it.
C# - Fields and Properties
2/6/2025
So many questions about this with so many answers based on religion. An attempt at an objective review from an atheist.
Leave me alone! Internet
2/5/2025
I am not sure what you call the bots that just scour websites for content, and I assume exploits. It's annoying. And expensive.
Your Corporate Family
Most companies that you'll work for love to say how "we're all family." This is true of small businesses and large corporate enterprises. Here's what I've shared with my kids as they enter the workforce and why.
EF Core Don't Forgets
EF Core is great. And on an everyday basis, it you can zipp by and get shit done. But, then you need some help and what ought to be easy (and maybe is), you have no idea (or forgot) how to do it.
DOTNET 9 Must Use
11/14/2024
Every release so much is released that is so good. This is what I want to remember to use.
Forcing Results / Lying to Yourself
When you force a result you end up lying to yourself and your organization by setting up a false reality that was created because you asked for it.
Over Engineering / Over Architecting
People love to ring the alarm about Pre-Optimization but expect over-architecting. Another example of followers just regurgitating what a popular/well-respected dev says [one day].
Labors of Love
There are some things that I want to do. That I have been wanting to do. Things that I share as open source software. This is about that.
Azure Blob File Explorer
Displaying Azure's Blob Storage in a file explorer or filing cabinet view should be easy. Let's make it so. (1 of x)
The New Blog Engine
Like all good developers, new and old, you must build your own blog engine.
Breakout! CSS Style
You have a container to restrict the width of your page, but you want some inner content to not be constrained! To break free! Easy.
SQL Tip & Tricks
Things I do not want to forget and search here is easier than searching Google with Bing
Sneaky Catch-All
Didn't know that you had a catch-all, did you? How long did it take you to find this insidious little error? 3 days for me. The second time I was looking for it.
Spaces vs. Tabs
While looking at writing about guidelines this age-old argument came up as an item...
ETL - That's Wrong, Don't Delete
You have an ETL process (importing data) that deletes and inserts data. This is what I do to make sure it's not a mistake to keep going.
Slowing Azure Functions Down
For the longest controlling Azure's horsepower was nigh impossible. It was a bit of a nightmare. Today I found out, not anymore.
Dynamic Display
8/30/2019
How to display all the properties, when you don't know them - or don't care
Projects
A list of projects I would like to take on.