This is how I got Mastodon to use an external SMTP server to deliver outgoing mail.
I received lots of errors such as ”WARN: Net::SMTPFatalError: 550 Bad HELO – Host impersonating domain name [hingst.net]”, which resulted in zero emails being sent. I solved it by adding my server’s IP to a TXT record for my domain (in the DNS settings at my domain provider), looking something like,
v=spf1 a mx ip4:123.123.123.123 ~all
so that we let that server send mail through our domain name. Then we add this to the .env.production file on the Mastodon server:
SMTP_SERVER=smtp.example.com SMTP_PORT=465 SMTP_LOGIN=mastodon@example.com SMTP_PASSWORD=long_password SMTP_AUTH_METHOD=plain SMTP_SSL=true SMTP_ENABLE_STARTTLS_AUTO=true SMTP_OPENSSL_VERIFY_MODE=none SMTP_FROM_ADDRESS=mastodon@example.com SMTP_DELIVERY_METHOD=smtp SMTP_DOMAIN=localhost
After reloading the Mastodon services it should work.
systemctl restart mastodon-sidekiq
systemctl reload mastodon-web
Done!
This setup worked for me. Might not work for you.
At first I thought SMTP_DOMAIN should be set to the same domain that the Mastodon instance is on (in my case SMTP_DOMAIN=hingst.net), but that did not work. I instead had to set it to localhost, which resulted in all my emails coming through and not ending up in spam 🙂
Edits:
2022-12-20: Clarified the TXT record part