[Mailman-Users] any way to batch unsubscribe notifications?

Matt Morgan minxmertzmomo at gmail.com
Fri Mar 7 03:27:31 CET 2008


On Fri, Feb 29, 2008 at 10:09 PM, Mark Sapiro <mark at msapiro.net> wrote:
> Matt Morgan wrote:
>  >
>  >The only problem is that a lot of their addresses are collected
>  >manually, so there can be a lot of failures. Mailman sends these one
>  >at a time, i.e. one unsubscribed address per notification message, and
>  >not really all at once (although I'm sure that depends on how quickly
>  >the bounce message comes back, too). Is it possible to get mailman to
>  >batch the unsubscribed addresses once per day, and send them all out
>  >in a single daily report? Or is there some other way to do this that
>  >would work better than what I've come up with?
>
>
>  You could turn the notices to the admin off and run a daily cron to
>  generate a summary from Mailman's subscribe log. All the bounce
>  deletes should have entries similar to
>
>  Feb 20 10:00:24 2008 (10510) listname: deleted user at example.com;
>  disabled address
>
>  You can also work off the bounce log which will have entries like
>
>  Feb 20 10:00:24 2008 (10510) listname: user at example.com disabling due
>  to bounce score 1.0 >= 1.0
>  Feb 20 10:00:24 2008 (10510) listname: user at example.com deleted after
>  exhausting notices

Thanks, Mark! Great tip. Here's what I came up with. I'm sure this can
be improved upon, but maybe it'll help someone else.

----------
bademails script
----------

#!/bin/sh
#
# This is a crummy little script to be run by cron that will collect
# deleted emails from any number of days before and send them to
# some address.

usageQuit()
{
  cat << "EOF" >&2
bademails processes mailman's subscribe logs for recently deleted members
Usage: bademails recipient [-d days]
  recipient is the email address to send the report to
  days is an integer value for the number of days of messages to parse
     (default is 1, i.e., yesterday)
EOF
  exit 1
}

days=1
file=/tmp/badaddresses

case $# in
	0 ) usageQuit	;;
	1 ) usageQuit	;;
	2 ) email=$1; days=$2;	;;
	? ) usageQuit	;;
esac

daysleft=$days
while [ $daysleft -gt 0 ] ; do
	logfile="/var/log/mailman/subscribe.$daysleft.gz"
	if [ -f $logfile ] ; then
		zcat $logfile|grep deleted|cut -d' ' -f8|sed -e 's/;//' >> $file
	fi
	daysleft=$(( $daysleft -1 ))
done

if [ -f $file ] ; then
	sort -f -u $file | mail -s"$days days of bad addresses" $email
	rm $file
fi

exit 0

---------

Thanks,
Matt


More information about the Mailman-Users mailing list