# COPYRIGHT file in the root directory of the nmh distribution for
# complete copyright information.
#
-# Emulation of compiled mhmail(1) using nmh send(1) or post(8).
+# Emulation of compiled mhmail(1) using nmh post(8) or send(1).
# Differences from compiled mhmail:
-# * Supports all send(1) (with -profile) or post(8) (without -profile) options.
+# * Supports all post(8) (by default, without -profile) or send(1)
+# (with -profile) options.
# * Optionally (with -profile) obeys the users profile, including
# AliasFile and send entries.
# * Adds -debug option for debugging (sending, not incorporating new mail).
#
# To do:
-# * update mhmail man page
-# * add mhmail test
-# * integrate into autoconf
+# * set prefix properly so that it supports distcheck
# * support undocumented mhmail options?
usage='Usage: mhmail [addrs ... [switches]]
-v(ersion)
-h(elp)
-d(ebug)
- and all send(1)/post(8) switches'
+ and all post(8)/send(1) switches'
#### Use autoconf to fill in bindir.
-nmhbindir=@bindir@
+# This doesn't work with distcheck.
+# prefix=@prefix@
+# exec_prefix=@exec_prefix@
+# nmhbindir=@bindir@
-#### Or if configure hasn't been run yet, figure out nmhbindir at runtime.
+#### Or if configure/make haven't been run yet, figure out nmhbindir at runtime.
case ${nmhbindir} in
@*@) nmhbindir=`dirname $0` ;;
esac
havefrom=0
header=
otherarg=0
- sendpostargs=
+ postsendargs=
switcharg=0
use_send=0
debug=
esac
case ${arg} in
- #### Send and post wouldn't accept -f -or -s because they'd be
+ #### Post and send won't accept -f -or -s because they'd be
#### ambiguous, so no conflicts with them. And they don't have
#### -b or -c. For the new switches that compiled mhmail didn't
#### have: let -p indicate mhmail -profile, not send -port, and
-v|-ve|-ver|-vers|-versi|-versio|-version)
#### Cheat instead of using autoconf and make to fill in the version.
${nmhbindir}/mhpath -v | sed 's/mhpath/mhmail/'; exit ;;
- -*) sendpostargs="${sendpostargs:+${sendpostargs} }${arg}"; switcharg=1 ;;
+ -*) postsendargs="${postsendargs:+${postsendargs} }${arg}"; switcharg=1 ;;
*) if [ ${ccarg} -eq 1 ]; then
cclist="${cclist:+${cclist}, }${arg}"; ccarg=0
elif [ ${bodyarg} -eq 1 ]; then
- body=${arg}; bodyarg=0
+ body="${arg}
+"; bodyarg=0
+ #### Allow -body "" by using just a newline for the body.
+ [ "${body}"x = x ] && body='
+'
elif [ ${otherarg} -eq 1 ]; then
#### Always end ${header} with a newline.
header="${header:+${header} }${arg}
"; otherarg=0
elif [ ${switcharg} -eq 1 ]; then
- sendpostargs="${sendpostargs:+${sendpostargs} }${arg}"
+ postsendargs="${postsendargs:+${postsendargs} }${arg}"
else
#### An address.
tolist="${tolist:+${tolist}, }${arg}"
fi
if [ "${havefrom}" = 0 ]; then
nmhlibdir=`${nmhbindir}/mhparam libdir`
- header="${header:+${header}
-}From: "`${nmhlibdir}/ap -format '%(localmbox)' 0`"
+ header="${header:+${header}}From: "\
+`${nmhlibdir}/ap -format '%(localmbox)' 0`'
+'
+ fi
+
+ #### If no -body, read message from stdin the easy way.
+ if [ "${body}"x = x ]; then
+ #### This will lose any trailing newline(s), so we can't
+ #### send the message when stdin contains only newlines.
+ body=`cat`
+
+ #### Don't allow an empty body (from stdin).
+ if [ "${body}"x = x ]; then
+ printf "empty body, message not sent\n"
+ exit 1
+ fi
+
+ #### Add trailing newline to body if it doesn't have one.
+ [ `printf "${body}" | tail -n 1 | wc -l` -ne 1 ] && body="${body}
"
fi
#### Set up a tmpfil and trap to remove it. send moves the file to a backup.
- tmpdir=${MHTMPDIR:-${TMPDIR:-${TMP:-`${nmhbindir}/mhpath +`}}}
- tmpfil=${tmpdir}/mhmail$$
- tmpfilbackup=${tmpdir}/[,#]mhmail$$
+ tmpdir="${MHTMPDIR:-${TMPDIR:-${TMP:-`${nmhbindir}/mhpath +`}}}"
+ tmpfil="${tmpdir}/mhmail$$"
+ tmpfilbackup="${tmpdir}/[,#]mhmail$$"
trap "rm -f ${tmpfil} ${tmpfilbackup}" EXIT
#### Put message header and body in file to supply as draft to
#### send/post. ${header} always ends with a newline, so this adds
#### the blank that separates the body.
umask 077
- printf "%s\n" "To: ${tolist}
+ printf "%s" "To: ${tolist}
Cc: ${cclist}
${header}
${body}" > ${tmpfil} || exit 1
if [ "${debug}" ]; then
printf "%s:\n" `ls -1 ${tmpfil}`
- cat ${tmpfil}
+ cat "${tmpfil}"
fi
- if [ "$use_send" -eq 1 ]; then
- send_or_post="${nmhbindir}/send"
+ if [ "$use_send" -eq 0 ]; then
+ post_or_send="${nmhlibdir:=`${nmhbindir}/mhparam libdir`}/post"
else
- send_or_post="${nmhlibdir:=`${nmhbindir}/mhparam libdir`}/post"
+ post_or_send="${nmhbindir}/send"
fi
- $debug ${send_or_post} ${tmpfil} ${sendpostargs}
+ if $debug ${post_or_send} ${tmpfil} ${postsendargs}; then
+ :
+ else
+ printf "Letter saved in dead.letter\n"
+ #### exec skips the trap set above.
+ exec mv ${tmpfil} dead.letter
+ fi
fi