#!/bin/bash verwendung() { >&2 echo 'sendmailadvanced encrypts emails and generates stamps either in situ or in a pipe. For that it uses hashcash and gnupg.' >&2 echo '' >&2 echo 'Usage: sendmailadvanced [OPTIONS]' >&2 echo ' -h,--hook=hook activate hook' >&2 echo ' -i,--inline=file 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' >&2 echo \ '#HELPTEXT# #' 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 [ -r #ETCDIR#/sendmailadvanced.conf ] then . #ETCDIR#/sendmailadvanced.conf else for konfig in $(readlink -f "$0").conf $(find . -name sendmailadvanced.conf 2> /dev/null) do [ -r "${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:,help,inline:,no-inline,stamp,no-stamp,version -n "$(basename "$0")" -- "$@" || echo verwendung)" while true do case "$1" in -h|--hook) shift hooks[${#hooks[@]}]="$1" ;; --help) verwendung 0 ;; --version) echo '#VERSION#' exit 0 ;; -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 )