#!/bin/sh
set -eu
+ME="${0##*/}"
+
+about()
+{
+ echo "$ME -- resubmit messages to the mail filter"
+ echo "Copyright © martin f. krafft <madduck@madduck.net>"
+ echo "Released under the terms of the Artistic Licence 2.0"
+}
+
+usage()
+{
+ echo "Usage: $ME [options] <Maildir> [<Maildir> ...]"
+ echo
+ echo "Valid options are:"
+ cat <<-_eof | column -s\& -t
+ -V|--version & show version information.
+ -h|--help & show this output.
+ -l|--list & process the argument list (even if empty), never stdin
+ -r|--deliver-read & mark messages read on delivery
+ _eof
+}
+
+SHORTOPTS=Vhlr
+LONGOPTS=version,help,list,deliver-read
+
+list=0
+mark_read=0
+files=
+
+for opt in $(getopt -n $ME -o $SHORTOPTS -l $LONGOPTS -u -- "$@"); do
+ case "$opt" in
+ -V|--version) about; exit 0;;
+ -h|--help) about; echo; usage; exit 0;;
+ -l|--list) list=1;;
+ -r|--deliver-read) mark_read=1;;
+ --) :;;
+ *)
+ if [ -f "$opt" ] && [ -r "$opt" ]; then
+ files="$files $opt"
+ else
+ echo "E: unknown argument: $opt" >&2
+ exit 1
+ fi
+ ;;
+ esac
+done
+
PROCMAIL=$HOME/.etc/mailfilter/procmail/procmailrc
-FORMAIL="formail -I 'X-Resubmitted: $(date -R)'"
-if [ -z "${1:-}" ]; then
- $FORMAIL | exec $PROCMAIL
+if [ "$mark_read" -eq 1 ]; then
+ PROCMAIL="$PROCMAIL DELIVER_READ=1"
+fi
+
+DATE_R="$(date -R)"
+FILTER="sed -rne ':b;s/^(Received|Date):/&/;tf;p;n;bb' -e ':f;iReceived: by resubmission script; $DATE_R' -e ':e;p;n;be'"
+FILTER="$FILTER | /usr/bin/formail -I'X-Resubmitted: $DATE_R'"
+
+if [ -z "${files:-}" ] && [ $list -eq 0 ]; then
+ eval $FILTER | exec $PROCMAIL
else
- $FORMAIL "$1" | $PROCMAIL && rm -f "$1"
+ for f in $files; do
+ eval $FILTER < "$f" | $PROCMAIL && rm -f "$f"
+ done
fi
exit 0