Where is the mailx command in Rocky Linux 9? Use s-nail from now on!

Written by - 0 comments

Published on - Listed in Linux Mail


While testing a simple script on a EL9 compatible system, running Rocky Linux 9, I wanted to send a quick e-mail notification at the end of the script.

mailx worked fine - but is gone?

I have been using the mailx command for at least a decade, and never experienced problems with it. But now this command seems to be gone in Rocky Linux 9 (and other Linux distributions based on EL9).

root@rocky9 ~ # dnf search mailx
Last metadata expiration check: 60 days, 6:03:10 ago on Sat 09 Sep 2023 06:00:58 AM UTC.
No matches found.

There's no mailx package in Rocky Linux 9 anymore?

no mailx package in Rocky Linux 9

By searching for mail related packages, the following list is returned:

root@rocky9 ~ # dnf search mail
==================== Name & Summary Matched: mail ====================
ant-javamail.noarch : Optional javamail tasks for ant
asterisk-voicemail.x86_64 : Common Voicemail Modules for Asterisk
asterisk-voicemail-odbc.x86_64 : Store voicemail in a database using ODBC
asterisk-voicemail-plain.x86_64 : Store voicemail on the local filesystem
claws-mail.x86_64 : Email client and news reader based on GTK+
claws-mail-devel.x86_64 : Development package for claws-mail
claws-mail-plugins.x86_64 : Additional plugins for Claws Mail
[...]
s-nail.x86_64 : Environment for sending and receiving mail
smf-spf.x86_64 : Mail filter for Sender Policy Framework verification
spamass-milter.x86_64 : Milter (mail filter) for spamassassin
spamassassin.x86_64 : Spam filter for email which can be invoked from mail delivery agents
spamassassin-iXhash2.noarch : SpamAssassin plugin to lookup e-mail checksums in blacklists
thunderbird.x86_64 : Mozilla Thunderbird mail/newsgroup client

s-nail has replaced mailx

It turns out, that the s-nail package has replaced mailx in EL9. Also the official Rocky Linux 9 documentation mentions the s-nail command to test sending e-mails.

OK then, let's install s-nail.

root@rocky9 ~ # dnf install s-nail
[...]
Installed:
  s-nail-14.9.22-6.el9.x86_64

Complete!

Prior to using s-nail, a local MTA (mail server) needs to be installed. Or you run into an error like this:

root@rocky9 ~ # echo "Hello, this is a test mail" | s-nail -s "Test" destination@example.com
s-nail: Cannot start /usr/sbin/sendmail: executable not found (adjust *mta* variable)
/root/dead.letter 8/165
s-nail: ... message not sent

As local MTA I usually chose Postfix.

root@rocky9 ~ # dnf install postfix
[...]
Installed:
  postfix-2:3.5.9-19.el9.x86_64

Complete!

Postfix also needs to be started, otherwise you get an error like this:

root@rocky9 ~ # echo "Hello, this is a test mail" | s-nail -s "Test" destination@example.com
postdrop: warning: unable to look up public/pickup: No such file or directory

Alright, Postfix start and then try s-nail again:

root@rocky9 ~ # systemctl restart postfix

Sending e-mails with s-nail

With Postfix (or another local MTA) running, let's send some test e-mails.

root@rocky9 ~ # echo "Hello, this is a test mail" | s-nail -s "Test" destination@example.com

No error message this time. What about the mail logs?

root@rocky9 ~ # tail /var/log/maillog
Nov  8 12:08:16 rocky9 postfix/pickup[11032]: B3C3FC1347: uid=0 from=<root>
Nov  8 12:08:16 rocky9 postfix/cleanup[11035]: B3C3FC1347: message-id=<20231108120816.B3C3FC1347@rocky9.localdomain>
Nov  8 12:08:16 rocky9 postfix/qmgr[11033]: B3C3FC1347: from=<root@rocky9.localdomain>, size=346, nrcpt=1 (queue active)
Nov  8 12:08:17 rocky9 postfix/smtp[11037]: B3C3FC1347: to=<destination@example.com>, relay=gmail-smtp-in.l.google.com[108.177.15.26]:25, delay=0.33, delays=0.01/0/0.17/0.15, dsn=5.7.26, status=bounced (host gmail-smtp-in.l.google.com[108.177.15.26] said: 550-5.7.26 This mail has been blocked because the sender is unauthenticated. 550-5.7.26 Gmail requires all senders to authenticate with either SPF or DKIM. 550-5.7.26  550-5.7.26  Authentication results: 550-5.7.26  DKIM = did not pass 550-5.7.26  SPF [rocky9.localdomain] with ip: [xxx.xxx.xxx.xxx] = did not pass 550-5.7.26  550-5.7.26  To mitigate this issue, please visit Gmail's authentication guide 550-5.7.26 for instructions on setting up authentication: 550 5.7.26  https://support.google.com/mail/answer/81126#authentication e3-20020adfe383000000b0031c6d8741b8si3416325wrm.783 - gsmtp (in reply to end of DATA command))
Nov  8 12:08:17 rocky9 postfix/cleanup[11035]: 1059EC1349: message-id=<20231108120817.1059EC1349@rocky9.localdomain>
Nov  8 12:08:17 rocky9 postfix/qmgr[11033]: 1059EC1349: from=<>, size=3595, nrcpt=1 (queue active)
Nov  8 12:08:17 rocky9 postfix/bounce[11039]: B3C3FC1347: sender non-delivery notification: 1059EC1349
Nov  8 12:08:17 rocky9 postfix/qmgr[11033]: B3C3FC1347: removed
Nov  8 12:08:17 rocky9 postfix/local[11040]: 1059EC1349: to=<root@rocky9.localdomain>, relay=local, delay=0, delays=0/0/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
Nov  8 12:08:17 rocky9 postfix/qmgr[11033]: 1059EC1349: removed

The important thing is: The e-mail was sent. Due to Gmail's SPF check of the sender domain (rocky9.localdomain) the mail was not accepted.

But similar to mailx, the from address (sender) can be set in s-nail using the -r parameter:

root@rocky9 ~ # echo "Hello, this is a test mail" | s-nail -s "Test" -r "noreply@senderaddress.example.com" destination@example.com

In this case I used a sender address which matches the SPF record from that sender IP. That worked and the Gmail servers accepted the mail:

Nov  8 12:24:38 rocky9 postfix/smtp[11085]: CD55CC1349: to=<destination@example.com>, relay=gmail-smtp-in.l.google.com[64.233.166.26]:25, delay=0.66, delays=0.02/0.04/0.21/0.39, dsn=2.0.0, status=sent (250 2.0.0 OK  1699446278 f1-20020a5dxxxxxxxxxxxxxxxxxxxxxxxxxb5desi3266616wrw.1082 - gsmtp)

So far it seems that s-nail is a 1:1 replacement of mailx. At least for the most common mail tests.

Sending e-mails without local MTA

I mentioned before that we need Postfix (or an alternative) as a local MTA so s-nail can "hand over" the e-mail to a mail system. But s-nail (and mailx) is capable of speaking to a remote MTA, too! By using the -S parameter, additional mail settings, such as SMTP server or SMTP authentication, can be defined on the fly. They can also be placed into a config file located under ~/.mailrc.

root@rocky9 ~ # echo "Hello, this is a test mail" | s-nail -s "Test" -S mta=smtp://relay.example.com:587 -r "noreply@senderaddress.example.com" destination@example.com

This example is the same s-nail command as used before, but uses a remote SMTP server (relay.example.com) as relay host.


Add a comment

Show form to leave a comment

Comments (newest first)

No comments yet.