AWS documentation - Can you run a big mailing list on Amazon SES?
The quick answer: Yes, you can, just like you can on any email server.
Amazon SES can be used like a pretty standard SMTP mail server. Go find its SMTP address, use a username and password, and you can send email through it. It costs $0.10 per 1,000 emails to send email like this.
So, if you’re sending 500,000 emails a month, you’ll spend $50.
I use Sendy to send thousands of (opt-in!) emails every day. If you host your own server, then Sendy, hosted on a server in AWS, and using Amazon SES to send it, is a fine solution. I could achieve it with Sendy on a server costing $16.63 a month, plus Amazon SES costs. (I like it so much that this is an affiliate link).
But could Amazon SES do the whole thing?
If you’re sending 500,000 emails a month by running normal email software, that’ll mean you also make 500,000 SMTP requests to Amazon SES to send it.
So if you send, as I do, more than 30,000 emails a day, that’s my Sendy server sitting there slowly chunking its way through 30,000 emails - make an SMTP connection, send the email, close the SMTP connection, and repeat, 30,000 times.
It takes my server 57 minutes to send out 32,201 emails. That server needs to be there to handle email bounces, open reports, and tracking (which I happen to do anonymously, but you can do per-person if you want).
But wouldn’t it be nicer if it could send out 30,000 emails by making one request, not 30,000?
It would. So let’s see if we can do it.
It’s almost all there with Amazon SES
Amazon SES offers “lists and subscriptions”, which looks nice. “SES can automatically add unsubscribe links to all outgoing mail” - excellent.
List management offers a contact list function, so I could make a list for “subscribers to my newsletter”. It only works via the AWS command line interface, but that’s all I want to use it through, so that’s potentially OK, I can write code. And it says “You can add up to 1 million contacts to a contact list”. Great.
Subscription management essentially looks for bounces and for unsubscribes. There’s an unsubscribe landing page, it says, though rather ominously “The List-Unsubscribe header and ListManagementOptions footer links are added only if the email is being sent to a single recipient.”
Which… makes me wonder how you can send an email to the full list. You must be able to do that, right?
So… there is a ContactList - “A list that contains contacts that have subscribed to a particular topic or topics” - and a Contact - “the end-user who is receiving the email” - so I can store my subscribers here.
In SendEmail… there is a “Destination” object that contains the recipients, but that isn’t required. And there is a ListManagementOptions object, which is “an object used to specify a list or topic to which an email belongs, which will be used when a contact chooses to unsubscribe.”
But I can’t, seemingly, say “send this email to the contacts subscribed to TopicName”.
Even though Amazon will hold my contact details, put them into lists they can subscribe to (and unsubscribe from), and manage whether the emails bounce… the one thing you can’t do, I think, is say “send this email to this list”.
Let’s dig deeper
Deep in Amazon SES’s documentation, there’s talk of a template. “Email templates enable you to send personalized email to one or more destinations in a single operation,” it says. Aha! Maybe this is it!
There’s also “Send templated email to multiple destination objects”. The inline template code example shows a simple email saying something like Hello {{name}}
, and further down, template data that tells it how to replace those placeholders. Inline templates appear to mean that you don’t need to set separate templates before sending - this is just one file, with the message and who you’re sending it to. Give that file to Amazon SES, and it will go and send it. Seemingly. Excellent!
That uses a command called SendBulkEmail, and that uses BulkEmailEntry as a list of tags, like “name” = “Alice”.
All this sounds great, and exactly the thing. But one of the many pages of documentation puts the end to this, saying:
“You can send email to up to 50 destination objects in each call to the SendBulkEmail operation. The Destination object can contain multiple recipients defined in ToAddresses, CcAddresses, and BccAddresses. The number of destinations you can contact in a single call to the v2 API may be limited by your account’s maximum sending rate.”
So this was really close; but I can only send 50 individually crafted emails this way. So if my mailing list starts “Hello, {{name}}”, then I can only send 50 of them, even though my ContactList can contain up to a million email addresses.
So… it looks like we’ve drawn a blank.
AWS has all the pieces to send a newsletter by sending just one command to its SES product… except it’s not implemented, as far as I can see.
Oh well. Back to Sendy then!