From d90d6eb6ffc1002528ff9a145eaa41e164d0fcc4 Mon Sep 17 00:00:00 2001 From: John McQuah Date: Sun, 27 Nov 2022 07:42:28 -0500 Subject: [PATCH] sendmail-wrapper: initial draft --- crux-wiki/sendmail-wrapper | 73 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 crux-wiki/sendmail-wrapper diff --git a/crux-wiki/sendmail-wrapper b/crux-wiki/sendmail-wrapper new file mode 100644 index 0000000..3b089e8 --- /dev/null +++ b/crux-wiki/sendmail-wrapper @@ -0,0 +1,73 @@ +==== 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 pubnix email address appears in the "From:" header. + +=== Why? === +You want to send email from your pubnix 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 an + upgraded 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. + + +#!/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@pubnix-0.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 pubnix 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 pubnix login shell considers part of +$PATH, and you can then perform all kinds of tasks (like updating your +website) without leaving your mail client.