cropswap-sendmail.sh 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/bin/bash
  2. set -euo pipefail
  3. WD=$(mktemp -d)
  4. cleanup (){
  5. rm -rf "${WD}"
  6. }
  7. trap cleanup EXIT
  8. cd "${WD}"
  9. ITER_SUBS=/opt/cropswap/gdbm-iter-subscriptions.py
  10. MIME_INJECT=/opt/cropswap/mime-inject.py
  11. DELIVERED=false
  12. SENDMAIL="/usr/sbin/sendmail"
  13. if ((DEBUG != 0)); then
  14. SENDMAIL="$DEBUGMAIL"
  15. fi
  16. mk_subject(){
  17. subject="$(cat subject)"
  18. if [ "${subject/\[${SUBJECT}\]/}" == "${subject}" ]; then
  19. subject="[${SUBJECT}] ${subject## }"
  20. fi
  21. echo "${subject}"
  22. }
  23. tee >(reformail -c -x "Subject:" >subject) original | "${MIME_INJECT}" "${MAILGROUP}" | reformime -s1 -e > body
  24. reformail \
  25. -X "Date:" \
  26. -X "MIME-Version:" \
  27. -X "Subject:" \
  28. -X "Content-Type:" \
  29. < original | reformail \
  30. -U "MIME-Version:" \
  31. -U "Content-Type:" | reformail \
  32. -I "Subject: $(mk_subject)" \
  33. -I "List-Id: $MAILGROUP" \
  34. -I "List-Unsubscribe: <mailto:$MAILGROUP?subject=[UNSUBSCRIBE]>" \
  35. -I "List-Subscribe: <mailto:$MAILGROUP?subject=[SUBSCRIBE]>" \
  36. -I "List-Post: <mailto:$MAILGROUP>" \
  37. -I "List-Unsubscribe-Post: List-Unsubscribe=One-Click" \
  38. | cat - body > mail
  39. declare -A SUBSCRIBED
  40. declare -a actions
  41. update(){
  42. alias="${actions[$1-1]}"
  43. email="${2}"
  44. SUBSCRIBED["$email"]="$alias"
  45. }
  46. mapfile -t -c 2 -C update actions <<EOF
  47. $("${ITER_SUBS}" "${MLIST}" "${SLIST}")
  48. EOF
  49. for email in "${!SUBSCRIBED[@]}"; do
  50. if [ "${email,,}" == "${NOFORWARD,,}" ]; then
  51. continue
  52. fi
  53. if [ "$TO" != "" ] && [ "$email" != "$TO" ]; then
  54. continue
  55. fi
  56. echo "Forwarding mail: "
  57. echo "From: ${FROM} <${MAILGROUP}>"
  58. echo "To: ${SUBSCRIBED["$email"]} <${email}>"
  59. "$SENDMAIL" -F "${FROM}" -f "${MAILGROUP}" "${SUBSCRIBED["$email"]} <${email}>" < mail
  60. DELIVERED=true
  61. done
  62. if ! $DELIVERED; then
  63. "$DEBUGMAIL" undelivered
  64. exit "$UNHANDLED"
  65. fi