12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #!/bin/bash
- set -euo pipefail
- WD=$(mktemp -d)
- cleanup (){
- rm -rf "${WD}"
- }
- trap cleanup EXIT
- DELIVERED=false
- SENDMAIL="/usr/sbin/sendmail"
- if ((DEBUG != 0)); then
- SENDMAIL="$DEBUGMAIL"
- fi
- cat - > "${WD}/original"
- subject="$(reformail -c -x "Subject:" < "${WD}/original")"
- if [ "${subject/\[${SUBJECT}\]/}" == "${subject}" ]; then
- subject="[${SUBJECT}] ${subject## }"
- fi
- reformail \
- -X "Date:" \
- -X "MIME-Version:" \
- -I "Subject: ${subject}" \
- -X "Subject:" \
- -I "List-Id: $MAILGROUP" \
- -X "List-Id:" \
- -I "List-Unsubscribe: <mailto:$MAILGROUP?subject=[UNSUBSCRIBE]>" \
- -X "List-Unsubscribe:" \
- -I "List-Subscribe: <mailto:$MAILGROUP?subject=[SUBSCRIBE]>" \
- -X "List-Subscribe:" \
- -I "List-Post: <mailto:$MAILGROUP>" \
- -X "List-Post:" \
- -I "List-Unsubscribe-Post: List-Unsubscribe=One-Click" \
- -X "List-Unsubscribe-Post:" \
- < "${WD}/original" > "${WD}/headers"
- reformime -s1 -e < "${WD}/original" | makemime -c "$(reformail -c -x 'Content-Type:' < "${WD}/original")" - > "${WD}/body"
- echo "NOTICE:======== <<<" | makemime -c "text/plain" - > "${WD}/banner"
- makemime -m multipart/mixed "${WD}/banner" > "${WD}/new"
- makemime -j "${WD}/new" "${WD}/body" | cat "${WD}/headers" - > "${WD}/mail.new"
- mv "${WD}"/mail{.new,}
- declare -A SUBSCRIBED
- declare -a actions
- update(){
- alias="${actions[$1-1]}"
- email="${2}"
- SUBSCRIBED["$email"]="$alias"
- }
- exec 4< "${SLIST}.txt"
- flock 4
- mapfile -t -c 2 -C update -u 4 actions
- flock -u 4
- for email in "${!SUBSCRIBED[@]}"; do
- if [ "${email,,}" == "${NOFORWARD,,}" ]; then
- continue
- fi
- if [ "$TO" != "" ] && [ "$email" != "$TO" ]; then
- continue
- fi
- echo "Forwarding mail: "
- echo "From: ${FROM} <${MAILGROUP}>"
- echo "To: ${SUBSCRIBED["$email"]} <${email}>"
- "$SENDMAIL" -F "${FROM}" -f "${MAILGROUP}" "${SUBSCRIBED["$email"]} <${email}>" < "${WD}/mail"
- DELIVERED=true
- done
- if ! $DELIVERED; then
- "$DEBUGMAIL" undelivered
- exit "$UNHANDLED"
- fi
|