User Tools

Site Tools


ssh_noninteractive_sendmail

SSH session that runs sendmail instead of an interactive shell

What?

A wrapper for your local mail transfer agent (MTA) that initiates an SSH session when your SDF email address appears in the “From:” header.

Why?

You want to send email from your SDF address without running the risk that the receiving server will reject it due to a mismatch between the “From” header and your ISP's IP block, but …

  • the low volume of your outgoing mail cannot justify the cost of a VPM/VHOST/MetaARPA membership, or
  • your Internet connection has too high a latency to be running a full-screen editor within an SSH session.

Where?

a *BSD, Linux, or WSL environment with a client that generates MIME-formatted mail (as expected by sendmail-compatible MTAs such as msmtp)

How?

  1. Set up SSH public key authentication, if you have not already done so. This step can be omitted if you prefer to type your password for each outgoing mail.
  2. Save the wrapper script below somewhere in your $PATH. Change the value of $MTA to the mail transport agent that you would otherwise be using for outgoing mail, the value of $PATH if any of the commands live in non-standard locations, and of course all the hard-coded email addresses in the script.
  3. Configure your mail user agent (MUA) to call the wrapper script, rather than calling your MTA directly.
#!/usr/bin/env bash
#
# msmtp.wrap - bypass local in favor of remote sendmail,
#              if certain headers are found

PATH=/bin:/usr/bin:/usr/local/bin
Account0=me@sdf.org
Account1=me@other-pubnix.net
MTA=msmtp
draft="$(mktemp -t sendmail.XXXXXX)"
cat /dev/stdin > "$draft"
sender="$(grep '^From:' "$draft" | head -n 1 | cut -d: -f2)"

case "$sender" in
    *$Account0*)
        sendmail="ssh $Account0 sendmail -t" ;;
    *$Account1*)
        sendmail="ssh $Account1 sendmail -t" ;;
    *)
        sendmail="$MTA $*" ;;
esac

< "$draft" $sendmail; status=$?
rm -f "$draft"; exit $status

What Next?

The possibilities for customization of this wrapper are only limited by your imagination. You can parse the outgoing messages to look for particular recipients, subject lines, etc., and define a custom $sendmail command to handle each case. On the SDF side, the arguments following ssh $Account0 will be passed to your usual login shell after the -c option1), so you will enjoy all the environment variables defined in $HOME/.bash_login if you use bash as your login shell. Save your custom scripts in a directory that your SDF login shell considers part of $PATH, and you can then perform all kinds of tasks (like updating your website) without leaving your mail client.

1)
see the sshd(8) man-page, https://man.openbsd.org/sshd
ssh_noninteractive_sendmail.txt · Last modified: 2022/11/26 22:55 by jquah