Heirloom mailx

(or how the “/usr/(s)bin/sendmail” issue was solved ;-))

It was random that I have found a page which mentions to send an email via smtp using mailx. I was really surprised because I didn't know that. After some investigation I found that there was a forked and extended version of the traditional mailx - Heirloom mailx, formerly called nail.

Beside other functionality I will have a look at the side of sending mails only. So the traditional mailx works in a way that it checks $PATH for  sendmail  and if it was found it hands over the mail for further processing. The benefit to call  mail  instead of  sendmail  directly was the usage in portable scripts. Before we going on lets have a look at the

sendmail issue

Short: It is not possible to install more than one MTA at the same system at the same time!

Ok, ok - I know. There are workarounds to do so. But I talk about a standard and default installation using the system's package manager. And the package management tool HAVE TO prevent this. Even if there could happen multiple issues with multiple MTA's I want to stay with the  /usr/bin/sendmail  issue here. Beware that this typical location does differ between UNIX'like systems. But usually the location is the same of a dedicated system always.

Every MTA has its own  sendmail  binary to be compatible to the users interface side - more or less. But these binaries are not exchangeable between different MTA's. Thus you have one location for  sendmail , thus you have to have one  sendmail  tool and thus you have to have one MTA installed at a time. Point. That's why package managers works like described above.

Sidestep: In the past there does exist a tool called sendmail-wrapper or alike, but it seems it is not wide spread in use anymore.

As the traditional UNIX  mail  command uses  sendmail  it is required to have a local MTA installed. With Heirloom mailx this is no longer required. Through smtp we can send mails to every remote MTA inside or outside a local network.

Example

The following code snippet shows how it could be used:

SENDMAIL=`which mail 2>/dev/null`
SENDER="admin@`hostname`.example.org"
SERVER="smtp=smtp://smtp.example.org"
SUBJ="Message from `hostname`"               # subject
BODY="`hostname`: I did my job succesful."
 
# log an error and exit if 'mailx' isn't available
[ ! "$SENDMAIL" ] && echo "`date` `basename $0`: couldn't find '(send)mail'" \
    >> /var/log/messages && exit 1
 
# send a mail - this is a bit different against sendmail
# Attention: do NOT quote the options itself, only their values!
"$SENDMAIL" -s "$SUBJ" -r "$SENDER" -S "$SERVER" recipient@example.com << EOF
"$BODY"
EOF

Caveats?

As of its nature mailx doesn't spool a mail. Thus, by connecting via smtp , it have to made sure that the receiving mail server (mta) accepts the mail immediately. So for example if the receiving mta has grey-listing activated, the server running mailx have to be white listed. But is this a caveat?

Conclusion

To me Heirloom mailx is one of best innovations for UNIX'like systems. With its backwards compatibility it is a full replacement for the old, outdated Berkeley mailx. And as more systems an administrator have to maintain as higher is the benefit. I'm really impressed ;-)