cropswap-sendmail.sh 1.9 KB

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