I'm looking for a simple sendmail replacement to receive local mail, such as from cron and service failures and forward it to on to a real SMTP server.
I have used msmtpd successfully but thought I'd ask if folks have other solutions they like.
I found a nice Ansible role for nullmailer, but found that it is not packaged for Fedora, but msmtp and ssmtp are. I think I may try ssmtp next. Despite its unmaintained status, somewhow it's packaged and nullmailer isn't.
ssmtp is also my go-to for this. Or dma (DragonFly Mail Agent) - if available - which provides a queue in case the delivery to the smarthost fails. But as it's not running as a daemon (saving resources), so you have to setup a regular cronjob to process the queued messages.
I use ssmtp as well for a simple sendmail replacement. It takes over the sendmail command, doesn't open any ports. You configure it for the domain you want and tell it what server to send everything to and it works.
The one problem with msmtp is that it doesn't rewrite headers, like "From: root / To: root". These are not required for SMTP, but they are required by some mail providers who will reject email that doesn't have an "@" sign in these headers. The author or msmtp has said he does not plan to add this feature.
I worked around the issue with my own sendmail wrapper that rewrites local addresses in From and To headers before passing the message to msmtp. Someone else posted such a script in this bug report:
You can definitely replace senders with correct mail addresses for relaying through SMTP servers that expect them (this is what I do):
# /etc/msmtprc
account default
...
host smtp.gmail.com
auto_from on
auth on
user myaddress
password hunter2
# Replace local recipients with addresses in the aliases file
aliases /etc/aliases
(the only thing I changed from the defaults in the aliases file is adding the last line)
This makes it so all/most system accounts susceptible to send mail are aliased to root, and root in turn is aliased to my email address (which is the one configured in host/user/password in msmtprc)
Edit: I think it's actually the auto_from option which interests you. Check the msmtp manpage
After testing ssmtp, nullmailer, and msmtp for relay-only outgoing mail on Fedora #Linux. Here's my final report:
- ssmtp is packaged for Fedora and I got it working, but the Ansible role I found for it had been abandoned by the author because ssmtp itself is unmaintained.
- nullmailer might have worked, but is not packaged for Fedora.
- msmtp worked. I used this Ansible role, after patching it to work on Fedora: https://github.com/chriswayg/ansible-msmtp-mailer
Tried that. Yes, it has the feature I need. But it has a rather complex feature set and documentation when I just need to to send my mail to an SMTP server. I ran into problems configuring it for this in the past which were difficult to diagnose due to the volume of config options and docs. That’s what led me to explore tools that had only the features I needed and no more, like msmtp or nullmailer.
Deliverability is hard no matter what software you use. You have to spend a while warming your IP addresses. This is one thing I'd call a hassle to self host. I've been using mxroute.com which is diy friendly and cheap.
You want an SMTP relay. You can use a free public SMTP relay, or make one yourself with something like Postfix. If you make one yourself, don’t keep it open, or spammers will abuse it. If you’re sending mail properly, you’ll need to add it to your SPF entry in your DNS. If you’re just sending mail for yourself, you should be able to set up a filter in your email provider so that it doesn’t get rejected.
You also need to know if outbound traffic is blocked on port 25 by your ISP. Most ISPs block it to prevent spam. If yours is blocked, you can request that they unblock it, but they might not do it. If they don’t, you’re kind of SOL. At that point, you need an account somewhere to send mail through. Then you’d be connecting on port 587 to submit mail.
It has been a while since I touched ssmtp, so take what I'm saying with a grain of salt.
Problem with ssmtp and related when I was testing it was its behaviour in error conditions - due to a lack of any kind of spool it doesn't fail very gracefully, and if the sending software doesn't expect it and implement a spool itself (which it typically doesn't have a reason to, as pretty much the only situation where something like sendmail would fail is a situation where it also wouldn't be able to write a spool) this can very easily lead to loss of mails.
I already had a working SMTP client capable of fishing mails out of a Maildir at that point, so I ended up just doing a simple sendmail program throwing whatever it receives into a Maildir, and a cronjob to send this forward. This might be the most minimalistic setup for reliably sending out mail (and I'm using it an all my computers behind Emacs to do so) - but it is badly documented, so if you don't care about reliability postfix might be a better choice, or if you don't just go with ssmtp or similar. Or if you do want to dig into that message me, and I'll help making things more user friendly.