So after testing it for a day, I found a problem.  Specifically, if you're
using annotations on replies my simple script broke.  The reason is that the
arguments ended up being:

        [...] draft filename -idanno N

Where "N" was the file descriptor to write the annotation to; my previous
iteration assumed the last argument to post was the filename.

I ended up having to do this code (complete script appended at the end):

find_draftmessage() {
        skip_next=0

        for arg; do
                case "$arg" in
                -al* | -filt* | -wi* | -client | -idanno | -server | \
                -partno | -saslmaxssf | -saslmech | -user | -por* | \
                -file* | -mhl* | -mt* | -cr* | -lib* | -oauth)
                        skip_next=1
                        ;;
                -*)     skip_next=0;
                        ;;
                *)
                        if [ "$skip_next" -eq 0 ]; then
                                draftmessage="$arg"
                                return 0
                        fi
                        skip_next=0
                        ;;
                esac
        done

        echo "Cannot find draft message name in argument list"
        exit 1
}

I am just wondering out loud if there is a better way than putting knowledge
in the script of whether a particular switch takes an argument.  It just
seems brittle to me.  Ideas?  Other approaches?

--Ken
#!/bin/sh
#
# localpostproc - decide where to send email based on the draft message
#

#
# Find out which message is the draft message; yes, this sucks
#

find_draftmessage() {
	skip_next=0

	for arg; do
		case "$arg" in
		-al* | -filt* | -wi* | -client | -idanno | -server | \
		-partno | -saslmaxssf | -saslmech | -user | -por* | \
		-file* | -mhl* | -mt* | -cr* | -lib* | -oauth)
			skip_next=1
			;;
		-*)	skip_next=0;
			;;
		*)
			if [ "$skip_next" -eq 0 ]; then
				draftmessage="$arg"
				return 0
			fi
			skip_next=0
			;;
		esac
	done

	echo "Cannot find draft message name in argument list"
	exit 1
}

realpost="$(mhparam libdir)/post"

if [ $# -eq 0 ]; then
	echo "Usage: [post switches] filename"
	exit 1
fi

find_draftmessage "$@"

fromhost=$(scan -format '%(host{from})' -file "$draftmessage")

if [ $? -ne 0 ]; then
	echo "Unable to run scan on draft file $draftmessage, aborting"
	exit 1
fi

if [ -z "$fromhost" ]; then
	echo "Could not determine hostname of From: address"
	exit 1;
fi

case "$fromhost" in
	*.some.other.host)
	postflags="-server some.other.server -sasl -port submission"
	;;

	pobox.com)
	postflags="-server smtp.pobox.com -sasl -tls -port submission"
	;;

	*)
	echo "Don't know how to send email from $fromhost"
	exit 1
	;;
esac

exec "$realpost" $postflags "$@"
_______________________________________________
Nmh-workers mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/nmh-workers

Reply via email to