Skip to content

Instantly share code, notes, and snippets.

@MaximilianKohler
Last active March 18, 2024 18:26
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save MaximilianKohler/84d2175472612a34bcc1c2ebf99b91d4 to your computer and use it in GitHub Desktop.
Save MaximilianKohler/84d2175472612a34bcc1c2ebf99b91d4 to your computer and use it in GitHub Desktop.
How to send bulk/mass email with Amazon SES. 10,000-100,000 one-time emails, or thousands per day. Set up your own web server for newsletters. Mailchimp alternative

How to send bulk/mass email

The short answer is that you need to set up your own web server (Hetzner, AWS, DigitalOcean, etc.), install an email software on it (Listmonk, Mailwizz, Mautic), and use an SMTP like Amazon SES. It's not that hard. If you're on Windows, Putty and FileZilla will be your main programs to access your server. When using CSV files for your contacts, you want to use UTF-8 format.

There are some detailed guides below for Sendy and Listmonk. But even if you have/want to hire someone to set it up for you, they should be able to do so for under $60 (check Fiverr). So it's still the most affordable option.

When I searched for this I had a very hard time finding a right answer because all the results were SEO blogs advertising their newsletter services (Mailchimp, Convertkit, etc.), which is not the same thing.

My use case is that I have a Google form collecting tens of thousands of applications. And I need to reply to those people en masse (a few thousand per day). None of the newsletter services are designed for this, and they're all very expensive.

Even if your use case is a regular newsletter, setting up your own server is way cheaper. My Hetzner server costs me $5/mo and SES costs $10 for 100,000 emails.

My goal was to find the most cost-effective, user-friendly, bulk/mass email sender with good deliverability and open rates. One-time, 100,000+ emails per month, 3-4k/day.

Feel free to share your input in the comments.

Table of Contents

How-to easily create a TOC.

Intro

I started off with no technical knowledge/proficiency. I was using Convertkit, which is nice, but not made for this. It's limited to 1k contacts (free, and paid plans are a bit expensive), so I was deleting & uploading 1k contacts every day, which had a variety of problems.

I was getting 50-60% open rates. They dropped to 40 when I messed up my SPF record, and they went up to 70+ when I was sending people enough "good news".

Mailerlite, Getresponse, and SendPulse all count deleted subs towards your total. So you can't delete yesterday's contacts and email new contacts each day. They all have similar (50-60%) open rates as Convertkit.

Getresponse https://www.getresponse.com/ counts removed/deleted contacts to the total on the free plan (500 subs). I checked with them and they confirmed that deleted subs won't count for paid plans. So I could pay $30/mo for 2.5k subs/emails/day.

Sendpulse: Support answered in Russian.

Sender.net: Very low open rates.

Gsuite/Google Workspace:

A Gsuite/Google Workspace account will give you 2k emails per day. You can use Mergo with it, but Mergo has various problems and is not ideal for this, and I needed to go past the 2k limit. Mergo was getting ~70% open rates.

I had issues with the similar options like YAMM and Mailmeteor, so I wasn't able to test them. But them and Gmass don't seem worth the cost.

A free version of Mergo using a script? https://developers.google.com/apps-script/samples/automations/mail-merge

More for gmail? https://vocus.io/blog/best-mail-merge-gmail/

Specifically designed for single-sending in bulk:

I found https://mail250.com and purchased a plan with them, but their deliverability is horrible (10% compared to my 50-60% with convertkit).

https://www.pepipost.com/ is another one I found but their registrations were down. It now redirects to Netcore https://netcorecloud.com/email/email-api.

After more research I found:

List of API/transactional, marketing, and more: https://web.archive.org/web/20230807082117/https://old.reddit.com/r/webdev/comments/3f5zna/how_can_i_bulk_email_100k_website_users_who_opted/ctm35kv/ - most of these are either very expensive for sending to 100k+ contacts, or they don't provide a UI.

The best email marketing services and tools help marketers save time and improve their results: https://github.com/cemhurturk/the-best-email-marketing-services-and-tools-for-marketers

A thread on /r/webdev recommends:

MailChimp
Campaign Monitor
Mailgun - uses Mailjet.
SendGrid
Postmark

Mailchimp: https://mailchimp.com/pricing/marketing/ - quite limited/expensive in both sub count and emails/mo.

Campaign monitor: https://www.campaignmonitor.com/pricing/ - $100/mo for 5k subs.

Drip: https://www.drip.com/pricing - $50/mo for 3k contacts. Not sure if they'll let you delete and re-add.

Mailjet: https://www.mailjet.com/pricing/ - $100/mo for 100k emails.

Sendinblue: $65 for 100k emails.

Postmark: https://postmarkapp.com/pricing - looks technical. $100 for 125k.

SendGrid: $200/mo for emailing 80k contacts using their marketing campaigns. API/SMTP is cheaper.

Elastic Email: https://elasticemail.com/email-marketing-pricing - $265/mo for 100k.

PHPList: Seems to be an expensive hosted option https://www.phplist.com/pricing - $180 for 100k emails.

MimePost: 100k emails/mo for free https://mimepost.com/pricing. I have no idea what this is. It looks to be aimed at developers setting up their own server.

Programs:

There are programs like SendBlaster and TurboMailer that you can run from your PC. These are very useless. You need a web server that the people you're emailing can interact with in order to process unsubscribes, "view in browser", use analytics (open tracking), etc.

Amazon SES:

$15 for 150k emails. By far the cheapest option. The free tier https://aws.amazon.com/free/ recently changed. No interface. But cheap and should have good deliverability.

Forums: https://repost.aws/

Bounce and spam testing: https://sendy.co/forum/discussion/15946/marked-as-spam-problem -- https://docs.aws.amazon.com/ses/latest/dg/send-an-email-from-console.html

success@simulator.amazonses.com
bounce@simulator.amazonses.com
complaint@simulator.amazonses.com
suppressionlist@simulator.amazonses.com

Can view all bounced/suppressed in the "suppression list". It doesn't add soft bounces.

Export the suppression list:

Command line (CLI): https://docs.aws.amazon.com/ses/latest/dg/sending-email-suppression-list.html#sending-email-suppression-list-view-entries - outputs in javascript.

Save output to clipboard:
aws sesv2 list-suppressed-destinations|clip - requires sudo apt install geomview (200MB)
or file:
aws sesv2 list-suppressed-destinations > blocklist.txt - then have to download the file with FileZilla (can view with ls), or output into pastebin:
cat blocklist.txt | curl -F 'clbin=<-' https://clbin.com
Then:
Convert javascript array to CSV: https://www.convertsimple.com/convert-javascript-array-to-csv/ - delete the outmost curly brackets.

AWS Command Line Interface (AWS CLI) https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html

Set up access: https://stackoverflow.com/questions/29166957/error-you-must-specify-a-region-when-running-any-aws-cli-command/29167233#29167233

sudo apt  install awscli
aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: us-west-1
Default output format [None]:

Setup custom subdomain: https://docs.aws.amazon.com/ses/latest/dg/configure-custom-open-click-domains.html

Options to send through SES:

They require you to host the program on your/a website. There are a few more I came across but didn't list here.

Listmonk: https://listmonk.app/ Free, open source, simple, unpolished.

Mautic: https://www.mautic.org/ Free, opensource marketing automation platform. A more advanced and complicated version of Listmonk. Similar to MimePost?

Sendy: https://sendy.co/ - one-time $70 fee. Has some things better than Listmonk, and others worse.

MailWizz: https://www.mailwizz.com/pricing/ - $80 one-time fee. A better version of Sendy. Setup tutorials https://www.youtube.com/watch?v=tT5wU7ij3io - https://www.youtube.com/watch?v=MxeosKU2jnU

Nuevomailer: https://www.nuevomailer.com/ $130 one-time fee.

Mailster: https://mailster.co/ - $90 one time fee. A Wordpress-only plugin?

weMail: https://getwemail.io/email-marketing/cheap-bulk-email-sender/ - wordpress plugin. $10/mo using AWS.

Comparison of some of the main UI options:

PHPList

PHPList vs Listmonk: https://news.ycombinator.com/item?id=20421243

If you are an Open Source project and need expert marketing software, they offer a FREE phpList Hosted Plus Account. https://www.phplist.com/freeforopensource

Listmonk

Free and open source, but the most unpolished. You may spend lots of time trying to get certain things to work and fail in the end.

As far as I can tell, it's a "simpler and possibly slightly more user-friendly" version of Mautic.

Some things are better than Sendy, others worse. Overall I prefer Listmonk, especially since it's free and open source. It looks simple and clean. Very low hardware requirements, but that is due to sacrificing features.

Detailed Listmonk setup guide.

Importing: You can't import email duplicates (with different name) to the same list. If you import a list of 10 people with 1 duplicate, it will say "finished 10/10" and no errors.

Limitations:

As of Mid 2023.

Sendy

Has some helpful guides and you can easily find people to hire to set it up since it seems well known.

It's decent, but still slightly unpolished. At only $10 less than MailWizz, I think it's worth it to just pay $10 more for MailWizz.

Forum posts usually don't get approved, so it's not possible to get community help most of the time. But support responds via email.

Limitations:

As of Nov 2022.

  • My main issue is that the open rates are not accurate. They go to 60-70% a few minutes after sending a campaign, and end around 70-80%. Whereas my real open rates with other providers would start around 10% and go up to 60-70%.

  • I found a bug with people getting unsubscribed erroneously and automatically. Support said the solution is enabling ‘Double opt-out’, which you have to change per-list.

  • There's no option to export all lists/subscribers; nor view/export all bounced, unsubbed, complained, etc.. You have to do it per-list.

MailWizz

Demo: https://www.mailwizz.com/demo/

https://www.mailwizz.com/pricing/ - $80 one time fee.

Setup is somewhat complicated and technical https://www.youtube.com/watch?v=tT5wU7ij3io - https://www.youtube.com/watch?v=MxeosKU2jnU

Seems to be the most polished option.

Limitations:

As of Nov 2022.

It sounded like they may have fixed it by blocking known bots, but in 2023 I still saw a review saying open rates were inaccurate, so for me it's still not worth it over Listmonk.

Mautic:

A more complicated and advanced version of Listmonk?

"We had originally tested Mailchimp and Sendy, but they are best used as bulk email marketing tools. Where Mautic really shines is as a full-service contact resource center, so you can do full contact list management, as-complicated-as-you want drip campaigns, all still while being significantly less expensive than a tool like Mailchimp." https://www.trustradius.com/compare-products/mautic-open-source-vs-sendblaster

Web servers:

There are a ton of options. Hetzner seems to have a good reputation and possibly the best bang for your buck. https://gist.github.com/MaximilianKohler/3bdedd0185283ac30c1f1422f9626947#setting-up-a-server

I initially went with Amazon EC2 because the guide I found used them, and because their free tier gave you 62k emails per month if you sent them from EC2, but that's changing now, so you can use any server.

SPF, DKIM, DMARK:

You're going to need to understand the basics of these.

SPF:

It’s only possible to have one SPF record on your DNS zone. If you have more than one, they need to be merged.
Merge records: https://www.mailerlite.com/help/how-to-verify-and-authenticate-your-domain#new/align-domain
v=spf1 a mx include:_spf.mlsend.com include:spf.protection.outlook.com -all

DKIM:

DKIM with mailchimp: https://www.youtube.com/watch?v=HhUTUAfgb6w - Email Domain Authentication https://mailchimp.com/help/set-up-email-domain-authentication/

DKIM with convertkit: https://help.convertkit.com/en/articles/2502558-using-a-verified-domain-for-email-sending

DMARC:

Misc:

Free @yourdomain email using Cloudflare, an SMTP (Sendinblue/Brevo or Mailjet), and Gmail: https://www.youtube.com/watch?v=nNGcvz1Sc_8

Check deliverability: https://www.mail-tester.com/

Email validation:

Be weary about sketchy sites. They may be selling your email lists.

Reputation:

Email reputation is important if you want to avoid landing in peopls's spam. This is a major reason to use Amazon SES. But Amazon may kick you off if you allow your reputation to degrade.

ConvertKit provides the IP addresses, sending domains, and link tracking domains for your messages. Each of these items carries a reputation https://convertkit.com/sender-reputation

@amirhmoradi
Copy link

Great content, thanks for sharing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment