User Tools

Site Tools


ssh_noninteractive_sendmail

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ssh_noninteractive_sendmail [2022/11/13 23:44] – created jquahssh_noninteractive_sendmail [2022/11/26 22:55] (current) – slight changes to the case pattern matching jquah
Line 1: Line 1:
 +==== 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? ===
 +  - Set up [[ssh public key authentication|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.
 +  - 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.
 +  - Configure your mail user agent (MUA) to call the wrapper script, rather than calling your MTA directly.
 +
 +<code>
 +#!/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
 +</code>
 +
 +=== 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'' option(( see the sshd(8) man-page, [[ https://man.openbsd.org/sshd ]] )), 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.