The mysend Shell Script

[return-to Explanation of mysend] [table of contents] [index]
#! /bin/sh
# $Id: mysend,v 1.3 1994/09/06 12:14:16 jerry book3 $
### mysend -- sendproc that adds signature (or anything) to mail
### Usage (in MH profile):     sendproc: /xxx/yyy/mysend
##
##  INSTALL THIS SCRIPT AS YOUR sendproc, whatnow WILL RUN
##  IT AFTER YOU TYPE send OR push AT THE What now? PROMPT.
##  THE SCRIPT PARSES ALL THE ARGUMENTS YOU TYPE AT THE
##  What now? PROMPT (IF ANY) AND LOOKS FOR -signature OR
##  -nosignature (OR THE ABBREVIATIONS -sig AND -nosig).
##  ALSO, -face ADDS A X-Face: COMPONENT FROM THE ~/.face FILE;
##  -noface STOPS THE FACE IF IT'S BEEN SET AS THE DEFAULT.
##
##  IF THE SCRIPT FINDS THOSE FLAGS, IT SETS A FLAG VARIABLE;
##  THE REST OF THE ARGUMENTS, INCLUDING THE DRAFT PATHNAME
##  (ADDED BY whatnow) ARE PASSED TO THE *REAL* MH send COMMAND.
##
##  NOTE: whatnow RUNS THIS SCRIPT; IT DOES NOT PASS THIS SCRIPT
##  ANY send: ARGUMENTS FROM YOUR MH PROFILE.  (YOU CAN GET mysend:
##  ARGUMENTS FROM THE MH PROFILE BY USING THE mhparam SCRIPT.)
##
##  BEFORE IT ADDS YOUR SIGNATURE TO THE DRAFT, mysend CHECKS
##  CHECKS THE $mhdist ENVIRONMENT VARIABLE TO BE SURE YOU AREN'T
##  USING dist (YOU CAN'T ADD ANY TEXT TO THE BODY OF A dist'ED
##  MESSAGE).  THEN IT CHECKS TO SEE WHETHER YOU WANT A SIGNATURE
##  (YOU CAN HARD-CODE THE DEFAULT ON THE dosig= LINE OF THE SCRIPT,
##  BY THE WAY).  IF YOU DO, IT APPENDS YOUR $HOME/.signature FILE
##  TO THE DRAFT WITH A LINE OF TWO DASHES (--) BEFORE.
##
##  FINALLY, THE SCRIPT execS THE REAL MH send COMMAND.
##
##  NOTE TO HACKERS: TABSTOPS ARE SET AT 4 IN THIS CODE
##
##  NOTE: THERE SEEMS TO BE A BUG IN MH 6.7.2 (AT LEAST) THAT WON'T
##  PASS THE -dist SWITCH TO THE post COMMAND IF AN EXTERNAL
##  sendproc (LIKE THIS!) IS USED.  THE RESULT IS ERRORS LIKE
##  THESE IF YOU USE THIS sendproc DURING THE dist COMMAND:
##      What now? send
##      post: illegal header line -- Resent-To:
##      ...
##  THE mydist SHELL SCRIPT WORKS AROUND THIS PROBLEM.
##  IT'S A FRONT-END dist SHELL SCRIPT THAT MAKES A
##  TEMPORARY COPY OF YOUR MH PROFILE WITHOUT ITS
##  sendproc: ENTRY.  UGLY... BUT WORTH IT IF YOU USE dist.
##
##  NOTE: IF YOU RENAME THIS, DON'T CALL send; whatnow WON'T USE IT.

mh=/usr/local/mh            # WHERE MH COMMANDS LIKE send LIVE
doface=n                    # DEFAULT: NO FACE
dosig=n                     # DEFAULT: NO SIGNATURE
face=$HOME/.face            # FACE FILE, INCLUDING X-Face:
signature=$HOME/.signature  # SIGNATURE FILE TO READ

# PARSE COMMAND LINE, GRAB OUR OPTIONS.
# FIRST ARGS ARE OPTIONS; LAST IS DRAFT FILENAME:
while :
do
    case "$1" in
    "")         break ;;            # ALL DONE
    -sig*)      dosig=y ;;
    -nosig*)    dosig=n ;;
    -face)      doface=y ;;
    -noface)    doface=n ;;
    *)          args="$args $1" ;;  # FOR send
    esac
    draft="$1"  # EVENTUALLY THIS GETS DRAFT PATHNAME
    shift
done

# NO EDITS IF $mhdist ENVARIABLE IS 1 (DRAFT IS A dist HEADER):
case "$mhdist" in
1)  ;;
*)  # BEFORE DOING EDITS, EXIT IF DRAFT ISN'T READY:
    if [ ! -w "$draft" -o ! -r "$draft" ]; then
        echo "$0 quitting: unwritable or unreadable '$draft'" 1>&2
        exit 1
    fi
    # SET UP FOR ANY sed EDITS BY BUILDING $sedcmd EDITING COMMAND:
    case "$doface" in
    y)  if [ -r "$face" ]; then
            # WE CAN'T KNOW IF ANY HEADER COMPONENTS ARE MULTI-LINE
            # OR IF MESSAGE HAS To:, cc: ETC.  SO ADD FACE TO TOP:
            sedcmd="${sedcmd} -e '1r $face'"
        else
            echo "$0 quitting: unreadable '$face'" 1>&2
            exit 1
        fi
        ;;
    esac
    # DO ANY sed EDITS.  (USE sed BECAUSE ed BOMBS ON HUGE FILES.)
    # CAN TEST ALL sed-EDITING VARIABLES AT ONCE (case "$var1$var2")
    case "$doface" in
    *y*)    temp=/tmp/MYSEND$$
            # sed COMMAND MAY HAVE QUOTES IN IT, SO USE eval:
            eval /bin/sed $sedcmd $draft > $temp || exit 1
            /bin/cp $temp $draft || exit 1
            /bin/rm -f $temp
            ;;
    esac
    # ADD SIGNATURE FILE:
    case "$dosig" in
    y)  if [ -r "$signature" ]; then
            # SOME echoS CHOKE ON DASHES, SO DO IT THIS WAY:
            /bin/cat - "$signature" << \ENDPRESIG >> $draft || exit 1
--
ENDPRESIG
        else
            echo "$0 quitting: unreadable '$signature'" 1>&2
            exit 1
        fi
        ;;
    esac
    ;;
esac
if $mh/send $args
then exit 0
else
    # send returned non-zero.  If "push" command was used,
    # try to ring bell (by making a control-G) and print warning
    # (there's no second chance; "whatnow" always exits after "push").
    case "$args" in
    *-push*)
        /bin/cat << END 1>&2
*******************************************************
`echo x | /bin/tr x '\07'`$0 WARNING:
    $mh/send $args
returned a non-zero status.  Check for an unsent draft.
*******************************************************
END
        ;;
    esac
    # If "push" not used, this will make "whatnow" prompt again:
    exit 1
fi

[Table of Contents] [Index] [Return to Explanation of mysend] [The mydist Shell Script]


Last change $Date: 1996/06/06 15:13:49 $

This file is from the third edition of the book MH & xmh: Email for Users & Programmers, ISBN 1-56592-093-7, by Jerry Peek. Copyright © 1991, 1992, 1995 by O'Reilly & Associates, Inc. This file is freely-available; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. For more information, see the file copying.htm.

Suggestions are welcome: Jerry Peek <jpeek@jpeek.com>