Table of Contents
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.
Setup
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.
Configuration
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
## ~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.
- ~/.s-nailrc
## ~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 <sdfuser@sdf.org>' set reply-to='SDF User <sdfuser@sdf.org>' # 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 <s-mailx@sdaoden.eu>" # 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 ssl-verify-mx.sdf.org=ignore set MBOX=+Saved set folder=imaps://sdfuser2@mx.sdf.org/ set inbox=imaps://sdfuser2@mx.sdf.org/ set password-sdfuser2@mx.sdf.org="********" set from='SDF User2 <sdfuser2@sdf.org>' 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://gmail.user%40gmail.com@imap.gmail.com/INBOX" set inbox="imaps://gmail.user%40gmail.com@imap.gmail.com/INBOX" set password-gmail.user%40gmail.com@imap.gmail.com='********' set shortcut sent="imaps://gmail.user%40gmail.com@imap.gmail.com/[Gmail]/Sent Mail" set shortcut trash="imaps://gmail.user%40gmail.com@imap.gmail.com/[Gmail]/Trash" set from='Gmail User <gmail.user@gmail.com>' set reply-to='Gmail User <gmail.user@gmail.com>' 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://gmail.user%40gmail.com:*********@smtp.gmail.com }
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.
Example:
# 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 endif
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.user%40gmail.com@imap.gmail.com/[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] > ' else vput vexpr prompt regex "$mailbox-resolved" ([^/]+)$ '[\$account]:\$1 > ' endif } 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.