diff options
Diffstat (limited to 'digest-mailer.in')
-rw-r--r-- | digest-mailer.in | 92 |
1 files changed, 91 insertions, 1 deletions
diff --git a/digest-mailer.in b/digest-mailer.in index 4e88494..be071fd 100644 --- a/digest-mailer.in +++ b/digest-mailer.in @@ -1,5 +1,7 @@ #!/bin/bash +set +e + verwendung() { >&2 echo 'digest-mailer collects emails into digests before sending them.' >&2 echo '' @@ -32,4 +34,92 @@ then . #ETCDIR#/digest-mailer.conf fi -#TODO +message=$( + cat +) +sender=$( + whoami | \ + sha224sum | \ + awk '{print $1}' +) +receiver=$( + printf '%s\n' "${message}" | \ + sed -n ' + /^$/q + s/^To:\s*// + T + p + ' | \ + sha224sum | \ + awk '{print $1}' +) +time=$( + date +%s +) +hash=$( + printf '%s' "${message}" | \ + sha224sum | \ + awk '{print $1}' +) +if [ -s "#LIBDIR#/digest-mailer/${sender}.${receiver}.last-sent" ]; then + last_sent=$( + cat "#LIBDIR#/digest-mailer/${sender}.${receiver}.last-sent" + ) +else + last_sent='0' +fi + +printf '%s' "${message}" > "#LIBDIR#/digest-mailer/${sender}.${receiver}.${time}.${hash}" + +first_unsent=$( + find '#LIBDIR#/digest-mailer' -regextype grep -maxdepth 1 -mindepth 1 \ + -regex ".*/${sender}\.${receiver}\.[0-9]\+\.[0-9a-f]\+\$" \ + -printf '%f\n' | \ + cut -d. -f3 | \ + sort -nr | \ + tail -n1 +) + +to_send=$( + find '#LIBDIR#/digest-mailer' -regextype grep -maxdepth 1 -mindepth 1 \ + -regex ".*/${sender}\.${receiver}\.[0-9]\+\.[0-9a-f]\+\$" | \ + sort +) +to_send_count=$( + printf '%s\n' "${to_send}" | \ + wc -l +) +if [ $((last_sent + min_delay)) -gt ${time} ]; then + # last email was sent too close + exit +fi +if [ ${to_send_count} -gt 1 ] && \ + [ $(printf 'scale=10; (%s+%s)*%s + (%s+%s)*(1-%s)\n' "${min_delay}" "${last_sent}" "${agressivity}" "${max_delay}" "${first_unsent}" "${agressivity}" | bc) -gt ${time} ] && \ + [ $((first_unsent + max_delay)) -ge ${time} ]; then + exit +fi + +printf '%s' "${time}" > "#LIBDIR#/digest-mailer/${sender}.${receiver}.last-sent" + +if [ ${to_send_count} -eq 1 ]; then + ${mail_cmd} < "${to_send}" + rm "${to_send}" + exit +fi + +{ + sed -n ' + /^$/q + s/^Subject:.*$/Subject: mail-digest/ + ' "$( + printf '%s' "${to_send}" | \ + head -n1 + )" + printf '\n' + printf '%s\n' "${to_send}" | \ + while read -r file; do + cat "${file}" + printf '\n' + rm "${file}" + done +} | ${mail_cmd} |