Send mail from a shell script on exit/death

The -e setting in bash is fantastic: die on the first command that fails to return 0 (success). We can couple this with the trap command to trap the EXIT signal when the script exits, and automatically send an e-mail when the script exits.

#!/bin/bash

set -e

#export EMAIL_RECIPIENTS="mwood@somesoftware.com someoneelse@somesoftware.com someoneelse2@somesoftware.com"
export EMAIL_RECIPIENTS="mwood@somesoftware.com"
export SEND_EMAIL="true"

# call like this:
# send_email "this is the subject" "this is the message"
send_email() {
    if [ -z "${SEND_EMAIL}" ]; then
        return
    fi

    local subject=$1
    local msg=$2

    if [ -z "$subject" ]; then
        msg="no subject"
    fi

    if [ -z "$msg" ]; then
        msg="no message"
    fi

    cat << EOF | fmt | mail -s "$subject" $EMAIL_RECIPIENTS
The blah script says:
$msg
EOF
}
trap "echo 'I die'; send_email 'this is the subject' 'this is the message'" EXIT HUP INT QUIT TERM

# send_email 'this is the subject' 'this is the message'

ls ./var
ls ./baz  # this dir does not exist, so -e makes us stop, and trap sends an e-mail; nice!
ls ./src