Published: Sep 9, 2025 by Isaac Johnson
It is indeed a sad day for me. Sendgrid, which was an amazing email tool that always had a free tier since it pretty much started in 2009 lasted until 2019 when Twilio bought them.
It seemed like it would be left alone but now this week they finally sunset the free tier I had used for ages to handle build notifications and alerts; basically anything low volume and light duty.
They announced in May they would do away with the free plan and now it has come to pass.
In this post we will look at AWS’s Simple Email Service (SES) as a viable alternative, testing both CLI and SMTP uses. We will revisit Resend and talk about next steps.
Let’s get into AWS first…
AWS SES
My “other” solution has always been AWS Simple Email Service (SES) which has generous free tier.
The first thing we need to sort out is our destination server. We can look up the SMTP Endpoints
I’ll now hop in to the AWS Console and go to the Simple Email Service page (SES). We can see we have some spending limits which I would want (since I’m not a spammer)
If this is your first time through, you will likely need to create identities to send from (or as). This is how AWS makes sure you are not spoofing someone else
Our next step is to head to the “SMTP settings” where we will see our actual endpoint and from there can manage credentials
I have an IAM user already setup here we can use. (You can follow my original guide here to do that) What is important to apply are the predefined SES Sending Access permission policy
You’ll also need a credential (you can only have two which is why mine is greyed out)
AWS CLI
Let’s test our credentials, first with the AWS CLI. I’ll need a destination JSON and message JSON to use
builder@DESKTOP-QADGF36:~/Workspaces/sgtoses$ cat ./destination.json
{
"ToAddresses": ["isaac.johnson@gmail.com"],
"CcAddresses": [],
"BccAddresses": []
}
builder@DESKTOP-QADGF36:~/Workspaces/sgtoses$ cat ./message.json
{
"Subject": {
"Data": "My test email sent using SES",
"Charset": "UTF-8"
},
"Body": {
"Text": {
"Data": "You are getting this from AWS CLI ses",
"Charset": "UTF-8"
},
"Html": {
"Data": "<H1>You are getting this from AWS CLI ses</H1><p>confirm</p>",
"Charset": "UTF-8"
}
}
}
I want to make sure I am definitely using the Access Key and Secret (and not just with whatever I last logged into AWS locally) so I’ll pass those in to the command:
$ AWS_ACCESS_KEY_ID=AKIAXXXXXXXXXXXXXXXQ AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXX aws ses send-email --from isaac@freshbrewed.science --destination file://destination.json --message file://message.json
{
"MessageId": "010001992e2d1b4a-64684ac7-a0dc-4943-88f2-8ed3dac65986-000000"
}
I can confirm reciept
SMTP
I now need a service that used Sendgrid to try swapping out. One of those is Beszel for monitoring
We can see my active Beszel uses Sendgrid presently
I was a bit thrown by the username/password so I created a fresh credential to verify that indeed the username is the Access Key and the password is the Access Secret
I’ll update those settings
then send a test message
which worked fine (when I used the newer credential)
Paying for Sendgrid
Here is where I think Sendgrid is being a bit unfair.
They went from a free tier that many small developers and teams used to a minimum spend of US$20/mo - for emails.
Resend
It is worth bringing up Resend which does not provide SMTP support, but does have programmatic support for sending emails.
We covered it back in 2023.
We can create (or use existing) API keys
Which I can then use as a Bearer token in an a curl call
$ curl -X POST 'https://api.resend.com/emails' \
> -H 'Authorization: Bearer re_xxxxxxxxxxxxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d $'{
"from": "onboarding@resend.dev",
"to": "isaac.johnson@gmail.com",
"subject": "Hello World",
"html": "Trying Resend again"
}'
{"id":"b17c22d5-2dcd-40ff-a803-3b892dec6707"}
Which sent just fine
Resend, I can confirm, still has a reasonable free tier
And similar paid options to Sendgrid
Summary
There are actually quite a few options out there. Others we could explore include Mailgun and Brevo (I would have included Postmark, but they did away with their free tier as well).
There is an obvious solution as well - just use your actual email account. For Google’s GMail, you just need to create an app password which can then be used to send via smtp.gmail.com on 587
I did this last year with Zulip.
In the end, I’ll miss Sendgrid - it was a great service. And perhaps if you are already in the full Twilio ecosystem, paying for it makes sense. But for me, I’ll just move my workloads to SES, Resend and Gmail SMTP.