You don't have to use Mailgun, but you'll need an email tool to to setup magic login links, abandoned carts emails, etc...
Mailgun silently removed their "pay-as-you-go" flex tier from their pricing page, but it's still there. Start a free trial for the 35$ tier, then cancel it. You'll be downgraded to the "pay as you go" free tier. If you send 1000 emails/mo you"ll pay 1$/mo. Prefer to use Resend? Here's an excellent tutorial made by our top community member, Bill.
Setup
Create a new account on Mailgun
In [Sending] click [Domains] then [Add New Domain]. It's recommended to add a subdomain like mail.yourdomain.com.
If you pick the EU region, add the URL below to the Mailgun client setup in libs/mailgun.js right under username: "api": url: "https://api.eu.mailgun.net/"
Do all the DNS verification steps. If you use a subdomain, make sure it's reflected in your DNS records
Add extra DMARC for better deliverability: TXT | _dmarc.mail.yourdomain.com | v=DMARC1; p=none
Go to [Domain Settings] then [SMTP Credentials] then [Reset Passsword], choose [Automatic] and then [Create Password]
Click [Copy] at the bottom right of the modal. In .env.local, set EMAIL_SERVER to: smtp://postmaster@[mail.yourdomain.com]:[copied_password]@smtp.mailgun.org:587 (without the brackets)
In [Sending API Keys] click [Create sending key] and add it to .env.local as MAILGUN_API_KEY
(skip if do not need to receive emails) In [Receiving] click [Create Route]. Select [Match Recipient] and add the email you want to send from. (i.e. name@mail.yourdomain.com). Make sure to match the email you set up at mailgun.supportEmail in the config.js file. Forward to https://[your-domain].com/api/webhook/mailgun. Click [Create Route]. Then add your receiving email (I use my gmail for instance) in mailgun.forwardREpliesTo in config.js.
Check your records are valid on MxToolbox (enter your subdomain if you used one)
Sending emails
There are 2 ways to send emails:
1/ SMTP: Emails sent for magic login links will be sent using SMTP, for instance.
2/ Mailgun API: To send any other emails, use the sendEmail() function in libs/mailgun.js.
Receiving emails
Mailgun doesn't forward emails automatically, nor store them.
So we created a route that match emails sent to our support email (mailgun.supportEmail in config.js) and forward them to our API (your-domain.com/api/webhook/mailgun) which forwards them to our forwardRepliesTo email in config.js.
It automatically adds the sender in reply-to so you can reply directly from your inbox.