diff options
Diffstat (limited to 'sendmailadvanced.in')
-rwxr-xr-x | sendmailadvanced.in | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/sendmailadvanced.in b/sendmailadvanced.in new file mode 100755 index 0000000..e5a7f3e --- /dev/null +++ b/sendmailadvanced.in @@ -0,0 +1,188 @@ +#!/bin/bash + +verwendung() { + >&2 echo 'This is sendmailadvanced version #VERSION#' + >&2 echo '' + >&2 echo 'usage: sendmailadvanced [(-h|--hook) hook] [(-i|--inline) file | -t|--no-inline] [-e|--[no-]encrypt] [-s|--[no-]stamp]' + >&2 echo ' -h|--hook: activate hook' + >&2 echo ' -i|--inline: enhance email file in situ' + >&2 echo ' "--inline -" has the same effect as "-t"' + >&2 echo ' conflicts with -t|--no-inline' + >&2 echo ' -t|--no-inline: enhance email from stdin to stdout' + >&2 echo ' conflicts with -i|--inline' + >&2 echo ' -e|--[no-]encrypt: do (not) encrypt' + >&2 echo ' -s|--[no-]stamp: do (not) stamp' + exit 1 +} + +stempeln() { + oldIFS="${IFS}" + + IFS=',' + for adressat in ${adressatenString} + do + if [[ "${adressat}" == *"<"*">"* ]] + then + adressat="${adressat#*<}" + adressat="${adressat%>*}" + fi + adressat="$( + echo "${adressat}" | \ + tr -d "[:space:]" + )" + echo "${adressat}" | grep -q "\S" || continue + hashcash -b ${hashcash_bits} -Xm "${adressat}" + done + + adressatenString="" + + IFS="${oldIFS}" +} + +datei="" +encrypt=true +stamp=true + +dForced=false +eForced=false +sForced=false + +if [ -x #ETCDIR#/sendmailadvanced.conf ] +then + . #ETCDIR#/sendmailadvanced.conf +else + for konfig in $(readlink -f "$0").conf $(find . -name sendmailadvanced.conf 2> /dev/null) + do + [ -x "${konfig}" ] || continue + . "${konfig}" + break + done +fi + +gpg --list-keys "${gpg_recipient}" &> /dev/null || encrypt=false +which hashcash &> /dev/null || stamp=false + +eval set -- "$(getopt -o eh:i:st --long encrypt,no-encrypt,hook:,inline:,no-inline,stamp,no-stamp -n "$(basename "$0")" -- "$@" || echo verwendung)" + +while true +do + case "$1" in + -h|--hook) + shift + hooks[${#hooks[@]}]="$1" + ;; + -i|--inline) + ${dForced} && verwendung + shift + datei="$1" + [ "${datei}" == "-" ] && datei="" + dForced=true + ;; + -t|--no-inline) + ${dForced} && verwendung + datei="" + dForced=true + ;; + -e|--encrypt) + ${eForced} && verwendung + encrypt=true + eForced=true + ;; + --no-encrypt) + ${eForced} && verwendung + encrypt=false + eForced=true + ;; + -s|--stamp) + ${sForced} && verwendung + stamp=true + sForced=true + ;; + --no-stamp) + ${sForced} && verwendung + stamp=false + sForced=true + ;; + --) + shift + break + ;; + *) + >&2 echo "FEHLER: Verstehe Option \"$1\" doch nicht! Ich beende." + verwendung + ;; + esac + shift +done + +[ $# -ne 0 ] && verwendung + +MAILER="cantfind" +for executable in sendmail msmtp +do + for prefix in #BINDIR# /usr/bin /usr/sbin /bin /sbin + do + [ "${MAILER}" == "cantfind" ] && [ -x ${prefix}/${executable} ] && MAILER="${prefix}/${executable}" + done +done + +if [ -z "${datei}" ] && [ "${MAILER}" == "cantfind" ] +then + >&2 echo "ERROR: Can't find suitable mailer." + exit 1 +fi + +( + [ -z "${datei}" ] && cat || cat "${datei}" +) | \ +( + IFS='' + adressatenString="" + adressatenSammeln=false + while read -r zeile + do + echo "${zeile}" | grep -q "\S" || break + s="${zeile}" + if [ "${s:0:3}" == "To:" ] || [ "${s:0:3}" == "Cc:" ] + then + adressatenSammeln=true + s=" ,${s:4}" + fi + if [ ! "${s:0:1}" == " " ] + then + ${adressatenSammeln} && ${stamp} && stempeln + adressatenSammeln=false + fi + ${adressatenSammeln} && adressatenString="${adressatenString}${s}" + echo "${zeile}" + done + + ${stamp} && stempeln + echo "${zeile}" + + ( + for hookParam in "${hooks[@]}" + do + body_header_hook "${hookParam}" + done + cat + for hookParam in "${hooks[@]}" + do + body_footer_hook "${hookParam}" + done + ) | \ + ( + ${encrypt} && gpg -e -a -s -r ${gpg_recipient} || cat + ) +) | \ +( + if [ -z "${datei}" ] + then + ${MAILER} -t + else + tmpFile="$(mktemp)" + cat > "${tmpFile}" + cat "${tmpFile}" > "${datei}" + rm -f "${tmpFile}" + fi +) |