#!/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: " \ -X "List-Unsubscribe:" \ -I "List-Subscribe: " \ -X "List-Subscribe:" \ -I "List-Post: " \ -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