Prechádzať zdrojové kódy

support sending to specific member

Pi 1 rok pred
rodič
commit
1bcc8380c9
2 zmenil súbory, kde vykonal 66 pridanie a 16 odobranie
  1. 16 11
      cropswap-sendmail.sh
  2. 50 5
      maildroprc

+ 16 - 11
cropswap-sendmail.sh

@@ -1,19 +1,23 @@
 #!/bin/bash
 set -euo pipefail
-MAIL="$(cat - | formail -kb \
+WD=$(mktemp -d)
+cleanup (){
+	rm -rf "${WD}"
+}
+trap cleanup EXIT
+
+cat - | formail -kb \
 	-X "MIME-Version:" \
 	-X "Content-Type:" \
 	-X "Subject:" \
 	-X "Date:" \
-)"
-subject="$(formail -cx "Subject:" <<<"${MAIL}")"
+> "${WD}/mail"
+subject="$(formail -cx "Subject:" < "${WD}/mail")"
 if [ "${subject/\[${SUBJECT}\]/}" == "${subject}" ]; then
 	subject="[${SUBJECT}] ${subject## }"
 fi
-MAIL="$(cat - | formail \
-	-I "Subject: ${subject}" \
-        | tail -n+2 \
-)"
+formail -I "Subject: ${subject}" < "${WD}/mail" | tail -n+2 > "${WD}/mail.new"
+mv "${WD}"/mail{.new,}
 
 declare -A SUBSCRIBED
 declare -a actions
@@ -44,11 +48,12 @@ flock -u 4
 
 for email in "${!SUBSCRIBED[@]}"; do
 	if [ -z "${SUBSCRIBED["$email"]}" ] || [ "${email,,}" == "${NOFORWARD,,}" ]; then
-		 continue
+		continue
+	fi
+	if [ "$TO" != "" ] && [ "$email" != "$TO" ]; then
+		continue
 	fi
 	echo "Forwarding mail to: ${SUBSCRIBED["$email"]} <${email}>"
-	/usr/sbin/sendmail -F "${FROM}" -f "${MAILGROUP}" "${SUBSCRIBED["$email"]} <${email}>" <<EOF
-${MAIL}
-EOF
+	/usr/sbin/sendmail -F "${FROM}" -f "${MAILGROUP}" "${SUBSCRIBED["$email"]} <${email}>" < "${WD}/mail"
 done
 #TODO: report errors properly

+ 50 - 5
maildroprc

@@ -30,6 +30,7 @@ CONTINUE=0
 TOPOSTMASTER=0
 TOORGANIZER=0
 TOMEMBER=0
+TO=""
 
 UNHANDLED=5
 BADREQUEST=4
@@ -58,12 +59,21 @@ foreach /^(To|Cc):.*/
       TOORGANIZER=1
       CONTINUE=1
    }
-   foreach $ADDR =~ /^$MEMBERGROUPREGEX$/
+   foreach (tolower $ADDR) =~ /^$MEMBERGROUPREGEX$/
    {
       TOMEMBER=1
       CONTINUE=1
    }
+   foreach /^(To|Cc):\s+(.*)\s+.*\<$ORGANIZERGROUPREGEX\>$/
+   {
+      TO=$MATCH2
+   }
+   foreach /^(To|Cc):\s+(.*)\s+\<$MEMBERGROUPREGEX$\>/
+   {
+      TO=$MATCH2
+   }
 }
+
 if (!$CONTINUE)
 {
    EXITCODE=$UNHANDLED
@@ -140,12 +150,21 @@ if ($TOPOSTMASTER)
    exit
 }
 
-
 gdbmopen($MLIST, "R")
 ALIAS=gdbmfetch(tolower($FROM))
 if ($ALIAS eq "")
 {
     gdbmclose
+    if ($TOORGANIZER)
+    {
+       #
+       # TODO: test this works at all
+       FROM=$FROM
+       REPLYTO=$FROM
+       SLIST="$LISTDIR/alist"
+       to "!"
+    }
+    cc "|$DEBUGMAIL"
     EXITCODE=$UNREGISTERED
     exit
 }
@@ -190,9 +209,35 @@ if (!$FORWARD)
 }
 
 #
-# SUBSCRIBED USERS ONLY
+# SUBSCRIBED USERS
 #
 NOFORWARD=$FROM
-FROM=$ALIAS
-to "!"
+if ($TOMEMBER)
+{
+   FROM=$ALIAS
+   gdbmopen($MLIST, "R")
+   TO=gdbmfetch($TO)
+   gdbmclose
+   to "!${TO}"
+}
+
+MLIST="$LISTDIR/alist"
+gdbmopen($MLIST, "R")
+ORGANIZER=gdbmfetch(tolower($FROM))
+gdbmclose
+
+if ($ORGANIZER eq "")
+{
+   SLIST="$LISTDIR/alist"
+   to "!"
+}
 
+#
+# ORGANIZERS ONLY
+#
+FROM=$ORGANIZER
+MLIST="$LISTDIR/mlist"
+gdbmopen($MLIST, "R")
+TO=gdbmfetch($TO)
+gdbmclose
+to "!${TO}"