User Tools

Site Tools


S-mailx (aka s-nail)

S-mailx is an active fork of Heirloom mailx which ceased development around 2010. S-mailx has preserved most of the latter's feature set and added many of it's own. While there were plans to remove the inheirited POP3 and IMAP functionality these features have been retained due to popular demand, though a future re-write is likely. The project's developer provides a low-volume email list for end-user support; details at the homepage.

Documentation and Features

The s-mailx manpage, s-nail(1)1), is very detailed and the best place to learn about its features but the standouts are:

  • all Heirloom-mailx features: POP3/IMAP/SMTP, folder hooks, macros, threading, etc.
  • Maildir support
  • readline (cmd history)
  • optional coloration
  • enhanced spam filtering
  • detailed error reporting

One thing to be aware of is that even though s-mailx is a fork and largely a super-set of heirloom-mailx there is significant deviation with respect to command names and configuration syntax such that separate configuration files are necessary; attempting to craft a common configuration file for both will likely fail and potentially result in lost messages.


Running S-mailx

S-mailx actually installs as /usr/pkg/bin/s-nail on NetBSD which should avoid name collision with the native NetBSD mail/mailx and heirloom-mailx (/usr/pkg/bin/mailx) clients.


Several S-mailx options are pre-set via /usr/pkg/etc/s-nail.rc, the system-wide S-mailx configuration file; worth checking out to see what the defaults are before making customizations.

The default user configuration file for S-mailx is ~/.mailrc , unfortunately also used by the native NetBSD mail(1) and Heirloom-mailx clients. If you never plan to use the other clients then you can go ahead and put all your settings in ~/.mailrc ; chances are the native NetBSD mail(1) will just ignore any settings it doesn't understand; Heirloom-mailx likely will complain more. A somewhat better option which maintains settings separation is to create a minimal ~/.mailrc and add the following to it:

set mailx-extra-rc="$HOME/.s-nailrc"

This will allow occasional / accidental use of the native mail(1) client and keeps all the “S-mailx-specific” settings in ~/.s-nailrc. Alternately, it's possible to (re)set MAILRC (shell environment variable) on-the-fly via a launch script for settings separation.

A basic SDF specific S-mailx configuration (using both ~/.mailrc and ~/.s-nailrc):

## ~sdfuser/.mailrc
# Set top of mail folder tree to ~/mail:
set folder=mail
# Tell s-nail where to get additional configurations:
set mailx-extra-rc="$HOME/.s-nailrc"

Note that this technique is also used for the Heirloom mailx client via the NAIL_EXTRA_RC variable; having both NAIL_EXTRA_RC and mailx-extra-rc set in ~sdfuser/.mailrc will likely produce ignore-able but fairly annoying errors when S-mailx is run.

## ~sdfuser/.s-nailrc file - use with /usr/pkg/bin/s-nail
# hold mail in system Inbox (default):
set hold
# see s-nail(1) for details:
set v15-compat=yes
# set EDITOR if different than default:
#set EDITOR=vi
# allow "dot" EOF; reverse 'r'/'R'; print next msg:
set bsdcompat dot flip autoprint
## Mbox settings:
set from='SDF User <>'
set reply-to='SDF User <>'
# redundant is set in ~/.mailrc:
set folder=mail
# '+' prefix => relative to ~/mail/:
set MBOX=+Save
set record=+Sent
shortcut saved +Save
shortcut sent +Sent
## automatic MIME type processing:
# pipe all webified msgs thru lynx(1):
set pipe-text/html='?* lynx -stdin -dump -force_html'
## command aliases:
# use to return from remote accts:
commandalias home 'account null'
# match mail(1) cmd:
commandalias inc 'newmail'
# quiet the 'set' cmd:
commandalias set '\ignerr set'
# thread/unthread cmds:
commandalias thrd 'sort thread'
commandalias uthr 'unsort'
## email address aliases:
alias snail-list  "S-Mailx List <>"
# group aliases - note: cc/bcc mailings need to have
#                       at least one To: entry
#alias hop-list	  hoppy@mud.bog \
#		  mrwarts@mud.bog \
#		  "Kermit <froggy@mud.bog>"
## SMTP stuff:
# wait until MTA finishes when sending mail.
# => allows seeing any errors:
set sendwait
### IMAP accounts section: ###
# Another SDF user account:
account sdfuser2 {
        set hold
        # just because..
        set MBOX=+Saved
        set folder=imaps://
        set inbox=imaps://
        set from='SDF User2 <>'
        set record=+Sent
        shortcut saved +Saved
        shortcut sent +Sent
### note: due to 2022 Gmail policy change this no longer works ###
# Typical Gmail IMAP/SMTP w/ SSL setup (enable IMAP on your acct first);
# note use of "URL percent encoded" chars in some settings, i.e. '%40' = '@' :
account gmail {
        set hold
        set folder="imaps://"
        set inbox="imaps://"
        set shortcut sent="imaps://[Gmail]/Sent Mail"
        set shortcut trash="imaps://[Gmail]/Trash"
        set from='Gmail User <>'
        set reply-to='Gmail User <>'
        set record=+Sent
        shortcut saved +Saved
        shortcut sent +Sent
        ### Gmail SMTP stuff ###
        # => reserved chars in SMTP pwd need to be URL percent encoded <=
        set mta="smtps://*********

S-mailx Usage

Basic usage is essentially identical for all mailx-style clients and so won't be covered here; see the Documentation to get started.

S-mailx has fairly decent interactive help. Get a listing of all commands with list, then use help <command> to see a short synopsis of the command. Type set for list of current settings or showvar <setting/variable> for specific setting. If one or more errors are reported the errors commands will provide the details. S-mailx also has EMACS-style command line editting, i.e. CTRL+P / CTRL+N or ⬆ / ⬇ (Up/Down arrow keys) selects prior commands, CTRL+W deletes a word, etc.

Remote accounts

Remote or alternate SDF accounts are accessed via the account command – can be abbreviated to ac. Run without an arguement acc simply lists any configured accounts. To switch to an account within a S-mailx session use ac <acct_name> ; to start S-mailx on a specific account from the shell use $ s-nail -A <acct_name> [-f <subfolder>]. For example, if we have an alternate SDF account named ““sdfuser2”” which has a sub-folder called “Spam” we'd use

$ s-nail -A sdfuser2 -f +Spam

Note the “+” ; sub-folders under your main mail directory, i.e. ~/mail, are accessed using fi +<subfolder> ; use user-configurable shortcuts to make this more convenience, i.e. setting shortcut sent +Sent allows switching to folder “+Sent” with fi sent.

If multiple folders are configured for an account they can usually be listed using the folders command; to switch folders use fi <folder>. Pretty much all mailx-style clients also support the following shortcuts:

shortcut folder description
% system Inbox
# previous folder
& account MBOX

To return to your default account – the one associated with YOU – within a S-mailx session use account null. It's handy to create a command alias for this; see the ““comandalias home”” entry in the example configuration file.

Colors and other hacks

S-mailx can colorize your session experience depending on your terminal's capabilities. The default SDF TERM value may not be ideal; if you aren't seeing colors try setting TERM to linux.


# colors: prompt & msg info=teal, headers=green, errors=red:
set colour-pager
if terminal && "$features" =% ,+colour,
        colour iso view-msginfo fg=cyan
        colour iso view-header ft=bold,fg=green (from|date|subject) # regex
        colour iso view-header fg=green
        colour iso mle-prompt fg=cyan
        colour iso mle-error fg=red

Note european spelling – use colour. See s-nail(1) for other possibilities.

Hacking the prompt: by default the S-mailx prompt is just a ?. By making use of S-mailx internal variables the prompt can be made more informative. For example, to display the system path to the active folder:

set prompt='[\$mailbox-resolved] > '

For a local folder, say ~sdfuser/mail/Sent this might display as

 [/sdf/mail/maildir/s/sdfuser/Sent] > 

Not bad. However, remote IMAP accounts can look a bit uglier:

 [imaps://[Gmail]/Sent Mail] > 

If you are accessing such accounts you're already aware of their type; no need to display the full path. The following hack checks if variable acount is set (only set for remote accounts) and if so, uses a regex expression to filter the contents of the mailbox-resolved variable to just display the account and folder names:

# customize prompt
define custom-prompt {
  if -z $'\$account'
    set prompt='[\$mailbox-resolved] > '
    vput vexpr prompt regex "$mailbox-resolved" ([^/]+)$ '[\$account]:\$1 > '
set folder-hook=custom-prompt

Now when we switch to our account “gmail” we get something like the following:

[gmail]:INBOX > fi sent
[gmail]:Sent Mail > 

A bit nicer! The s-nail(1) manpage has additional documentation on using vput and vexpr. Much of S-mailx's functionality depends on the version in use AND whether v15-compat is set; S-mailx on another system may not appear to behave the same way.

the s-nail(1) manpage also available in html format on the project's website
s-mailx.txt · Last modified: 2022/06/26 15:15 by zilog