#!/bin/sh
#
# neomutt/sendmail – sendmail wrapper to enforce some checks on outgoing mails
#
# The script basically just creates a temporary file and then invokes any
# executable scripts in ~/.config/neomutt/sendmail-checks.d in run-parts style.
# They receive the filename of a temporary file holding the message to be sent
# as $1, followed by all recipients as determined by mutt.
#
# Copyright © 2010 martin f. krafft <madduck@madduck.net> Released under the
# terms of the Artistic Licence 2.0
#
set -eux

CHECKSDIR="$HOME/.config/neomutt/sendmail-checks.d"
SENDMAIL="/usr/sbin/sendmail -oem -oi"

TMPFILE=$(mktemp --tmpdir mutt-sendmail.XXXXXXXXXX.msg)
settrap () { trap "$@" 0 1 2 3 4 5 6 7 8 10 11 12 13 14 15; }
cleanup () { rm -f "$TMPFILE"; settrap -; }
settrap cleanup

argtype=s
recipients= sendmail_args=
for i in "$@"; do
  case "$argtype/$i" in
    (s/--) argtype=r;;
    (s/*) sendmail_args="${sendmail_args} $i";;
    (r/*) recipients="${recipients} $i";;
  esac
done

cat > $TMPFILE

remove_headers=
if ! formail -czx "Resent-" < "$TMPFILE" | grep -q .; then
  # only do this for original mails, not bounces
  recipients="$recipients $(formail -czx "X-Bcc" < "$TMPFILE" | tr -d ',')"
  remove_headers="$remove_headers -IX-Bcc"
fi
args=$(for i in $recipients; do echo "--arg=$i"; done)
run-parts --exit-on-error --umask=0077 --arg="$TMPFILE" $args -- "$CHECKSDIR"

recipients=$(echo "$recipients" | xargs)

formail $remove_headers < "$TMPFILE" \
  | eval $SENDMAIL "$sendmail_args" -- "$recipients"

cleanup