summaryrefslogtreecommitdiff
path: root/sendmailadvanced.in
diff options
context:
space:
mode:
Diffstat (limited to 'sendmailadvanced.in')
-rwxr-xr-xsendmailadvanced.in188
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
+)