##### lm_mailman.rc # # Resource file for procmail. # Filters list messages from lists handled by mailman. # WARNING: this also matches mailman's list membership reminders, which contain # passwords. To save all these reminders from all mailman sites in a # separate file, use lm_mailman-member.rc before using lm_mailman.rc. # # Variables, in (set before calling): # LISTNAME List name (between [...] in Subject:); # LISTEMAIL address of list (leave out part after @ and any generic # parts like -return); defaults to LISTNAME. # LISTSERVERDOMAIN Domain of the list server handling this list # (the part after @). # LISTFOLDER Where to store the email if it's from this list. # Does not return when email is saved. If empty, nothing # will be saved and return value is in ISTHISLIST. # LISTFOLDER_UMASK If set, umask to use when saving to LISTFOLDER. # Variables, returned: # ISTHISLIST Set to "1" if email is from this list, unset otherwise. # LISTEMAIL unset # # Run with e.g.: # LISTNAME="mailman-announce" # LISTEMAIL= # LISTSERVERDOMAIN="python.org" # LISTFOLDER=somepath/$LISTNAME-List # INCLUDERC=yourpath/lm_mailman.rc # in your $HOME/.procmailrc. # # The latest version is always available from: # http://volker.dnsalias.net/soft/procmail/ # # Copyright (C) by Volker Kuhlmann # Released under the terms of the GNU General Public License (GPL) Version 2. # See http://www.gnu.org/ for details. # # Volker Kuhlmann # 13 Apr; 10 May; 30 Dec 2002 # 24 Mar; 4 Apr; 6 May; 23 Oct; 4 Nov 2003 # 3 Sep 2004 # 9 Jun; 2 Aug 2005 # 17 Jan 2006 # 13 Mar; 15 Oct 2007 # 09 May 2018 Fix list Sender/List-Id expression. (No change for 10+ years.) # 15 Sep 2018 Improve list detection as more headers disappear. # # mailman: handles all commands in both subject and body # mailman: (un)subscribe address is $LISTEMAIL-request@ # gcc_c40@atlantek.com.au (mailman 1.1) 13Apr02 # lists.sourceforge.net 13Apr02 # no: ddlinux@leb.net (mailman 1.1, has no List-ID:) # sourceforge lists don't have subject keyword 06May03 ## LISTEMAIL defaults to LISTNAME :0 * LISTEMAIL ?? ^^^^ { LISTEMAIL=$LISTNAME } ## Set ISTHISLIST if match occurs ISTHISLIST= # admin + list: :0 # From_ can carry the email address of the poster #* $ ^From $LISTEMAIL-(admin|request|bounces)[^@]*@$LISTSERVERDOMAIN #* $ ^((List-Id|Sender):.*$LISTEMAIL[a-z0-9_\.-]*[\.@]|To:.*[^a-z]$LISTEMAIL@)$LISTSERVERDOMAIN * $ ^(List-Id:.*$LISTEMAIL[a-z0-9_.-]*[.@]|Sender:.*$LISTEMAIL[a-z0-9_.+=-]*[.@]|To:.*[^a-z]$LISTEMAIL@)$LISTSERVERDOMAIN { # admin: # mailman 1.1 has no Sender: :0 * $ ^From:.*$LISTEMAIL-(admin|request|bounces)@$LISTSERVERDOMAIN * $ ^Subject:.*($LISTEMAIL|confirm [a-z0-9][a-z0-9][a-z0-9]) * ^X-Mailman-Version: { ISTHISLIST=1 } # list: # List-headers are getting very thin nowadays. And getting even thinner. :0 #* $ ^From: .*$LISTEMAIL-request@$LISTSERVERDOMAIN (only admin, not list) * 1^0 $ ^From:.*($LISTNAME.*|<$LISTEMAIL)@$LISTSERVERDOMAIN> * 1^0 $ ^(Sender|Errors-to): $LISTEMAIL-(admin|request|bounces)[^@]*@$LISTSERVERDOMAIN * 1^0 $ ^X-BeenThere: $LISTEMAIL@$LISTSERVERDOMAIN * 1^0 $ ^Subject:.*(\[|=5B| )$LISTNAME(]|=5D| |$) * 1^0 $ ^List-Post: * 1^0 $ ^List-Id:[^@<]*<$LISTNAME\.$LISTSERVERDOMAIN> * 1^0 $ ^List-Subscribe:.*$LISTNAME-(admin|request)@ * 1^0 $ ^List-Archive:.*[^a-z]$LISTNAME([^a-z]|$) * -1^0 . { ISTHISLIST=1 } } # membership reminders: :0 * $ ^From (mailman-owner|.*-admin)@$LISTSERVERDOMAIN * $ ^From: mailman-owner@$LISTSERVERDOMAIN * $ ^Subject: $LISTSERVERDOMAIN mailing list memberships reminder #To: $LISTTO * ^X-Mailman-Version: # body: # reminder, sent out # mailing list membership # Password { ISTHISLIST=1 } ## If match occurred and LISTFOLDER is set, save to LISTFOLDER :0 * ISTHISLIST ?? ^^1^^ * ! LISTFOLDER ?? ^^^^ { :0 * ! LISTFOLDER_UMASK ?? ^^^^ { UMASK=$LISTFOLDER_UMASK } :0 : $LISTFOLDER } LISTEMAIL= ##### EOF lm_mailman.rc