-b(ody) text
-c(c) addrs ...
-f(rom) addr
+ -hea(der-field) name:field [-hea(der-field) name:field] ...
-su(bject) text
-r(esent)
-pr(ofile)
-se(nd)
-nose(nd)
-v(ersion)
- -h(elp)
+ -hel(p)
and all post(8)/send(1) switches
EOF
# Verified same behavior as compiled mhmail.
cat > "$expected" <<EOF
EHLO nosuchhost.example.com
-MAIL FROM:<recipient@example.com>
+MAIL FROM:<orig_recipient@example.com>
RCPT TO:<recipient@example.com>
DATA
Resent-To: recipient@example.com
-Resent-From: recipient@example.com
+Resent-From: orig_recipient@example.com
To: recipient@example.com
From: sender@localhost
Date:
QUIT
EOF
-test_mhmail "$expected" '-from recipient@example.com -resent' \
+test_mhmail "$expected" '-from orig_recipient@example.com -resent' \
-b 'To: recipient@example.com
From: sender@localhost
Date: Sat Jun 16 18:35:15 -0500
# Not supported by compiled mhmail.
cat > "$expected" <<EOF
EHLO nosuchhost.example.com
-MAIL FROM:<recipient@example.com>
+MAIL FROM:<orig_recipient@example.com>
RCPT TO:<recipient@example.com>
DATA
To: recipient@example.com
From: sender@localhost
Date:
Resent-To: recipient@example.com
-Resent-From: recipient@example.com
+Resent-From: orig_recipient@example.com
Resent-Date:
please resend this message, #2
EOF
test_mhmail "$expected" \
- '-from recipient@example.com -resent -profile -nomsgid' \
+ '-from orig_recipient@example.com -resent -profile -nomsgid' \
'|' 'To: recipient@example.com
From: sender@localhost
Date: Sat Jun 16 18:35:15 -0500
# Not supported by compiled mhmail.
cat > "$expected" <<EOF
EHLO nosuchhost.example.com
-MAIL FROM:<recipient@example.com>
+MAIL FROM:<orig_recipient@example.com>
RCPT TO:<recipient@example.com>
DATA
To: recipient@example.com
From: sender@localhost
Date:
Resent-To: recipient@example.com
-Resent-From: recipient@example.com
+Resent-From: orig_recipient@example.com
Resent-Date:
please resend this message, #3
EOF
test_mhmail "$expected" \
- '-from recipient@example.com -resent -profile -nomsgid' \
+ '-from orig_recipient@example.com -resent -profile -nomsgid' \
-b 'To: recipient@example.com
From: sender@localhost
Date: Sat Jun 16 18:35:15 -0500
[ ${failed:-0} -eq 0 ] || exit ${failed:-0}
+# check -header-field.
+# Not supported by compiled mhmail.
+cat > "$expected" <<EOF
+EHLO nosuchhost.example.com
+MAIL FROM:<sender@example.com>
+RCPT TO:<recipient@example.com>
+DATA
+To: recipient@example.com
+From: sender@example.com
+User-Agent: nmh
+Date:
+
+with added header field
+.
+QUIT
+EOF
+
+test_mhmail "$expected" \
+ '-from sender@example.com -header-field User-Agent:nmh' \
+ -b 'with added header field'
+
+[ ${failed:-0} -eq 0 ] || exit ${failed:-0}
+
+
+# check multiple -header-fields.
+# Not supported by compiled mhmail.
+cat > "$expected" <<EOF
+EHLO nosuchhost.example.com
+MAIL FROM:<sender@example.com>
+RCPT TO:<recipient@example.com>
+DATA
+To: recipient@example.com
+From: sender@example.com
+MIME-Version: 1.0
+Content-Type: text/plain;charset=utf-8
+Content-Transfer-Encoding: 8bit
+Date:
+
+with added header fields
+.
+QUIT
+EOF
+
+test_mhmail "$expected" \
+ "-from sender@example.com -header-field MIME-Version:1.0 \
+-header-field Content-Type:text/plain;charset=utf-8 \
+-header-field Content-Transfer-Encoding:8bit" \
+ -b 'with added header fields'
+
+[ ${failed:-0} -eq 0 ] || exit ${failed:-0}
+
+
exit ${failed:-0}
# (with -profile) options.
# * Optionally (with -profile) obeys the users profile, including
# AliasFile and send entries.
-# * Adds -nosend option, which displays the draft but does not send it.
+# * Adds -send/-nosend and -header-field options.
# * Drops support for undocumented -queue option.
#
# To do:
-# * add -header-field name:body switch
# * add -attach file ... switch
usage='Usage: mhmail [addrs ... [switches]]
-b(ody) text
-c(c) addrs ...
-f(rom) addr
+ -hea(der-field) name:field [-hea(der-field) name:field] ...
-su(bject) text
-r(esent)
-pr(ofile)
-se(nd)
-nose(nd)
-v(ersion)
- -h(elp)
+ -hel(p)
and all post(8)/send(1) switches'
bindir=`dirname $0`
ccarg=0
from=
fromarg=0
+ headerfieldlist=
+ headerfieldarg=0
subject=
subjectarg=0
resent=0
sendsw=1
for arg in "$@"; do
case "${arg}" in
- -*) switcharg=0
+ -*) switcharg=0; headerfieldarg=0 ;;
esac
case "${arg}" in
-b|-bo|-bod|-body) bodyarg=1 ;;
-c|-cc) ccarg=1 ;;
-f|-fr|-fro|-from) fromarg=1 ;;
- -h|-he|-hel|-help) printf "%s\n" "${usage}"; exit ;;
+ -hea|-head|-heade|-header|-header-|-header-f|-header-fi|-header-fie|-header-fiel|-header-field) headerfieldarg=1 ;;
+ -hel|-help) printf "%s\n" "${usage}"; exit ;;
-nose|-nosen|-nosend) sendsw=0 ;;
-p|-pr|-pro|-prof|-profi|-profil|-profile) use_send=1 ;;
-resend) printf "mhmail: did you mean -resent instead of -resend?\n" 1>&2
-*) postsendargs="${postsendargs:+${postsendargs} }${arg}"; switcharg=1 ;;
*) if [ ${bodyarg} -eq 1 ]; then
body="${arg}
-"; bodyarg=0
+"
+ bodyarg=0
#### Allow -body "" by using just a newline for the body.
[ "${body}"x = x ] && body='
'
elif [ ${fromarg} -eq 1 ]; then
- from="${arg}"; fromarg=0
+ from="${arg}"
+ fromarg=0
elif [ ${subjectarg} -eq 1 ]; then
- subject="${arg}"; subjectarg=0
+ subject="${arg}"
+ subjectarg=0
+ elif [ ${headerfieldarg} -eq 1 ]; then
+ #### It's not strictly necessary to have one space after
+ #### the : that separates the header field name from the
+ #### body, but do it to avoid surprising someone.
+ add=`printf "${arg}" | sed -e 's/:/: /' -e 's/: /: /'`
+ headerfieldlist="${headerfieldlist:+${headerfieldlist}}${add}
+"
+ headerfieldarg=0
elif [ ${switcharg} -eq 1 ]; then
postsendargs="${postsendargs:+${postsendargs} }${arg}"
elif [ ${ccarg} -eq 1 ]; then
else
#### An address.
tolist="${tolist:+${tolist}, }${arg}"
- fi
+ fi ;;
esac
done
[ "${from}"x = x ] || header="${header}${prefix}From: ${from}
";
+ if [ "${headerfieldlist}" ]; then
+ header="${header}${headerfieldlist}";
+ fi
+
#### Set up a file to supply as a draft to send/post. And set a
#### trap to remove it. send moves the file to a backup, so it will
#### remove that, too.