jaromail

a commandline tool to easily and privately handle your e-mail
git clone git://parazyd.org/jaromail.git
Log | Files | Refs | Submodules | README

commit 8cb97b9c9c23364563aaaeaea78665a16b4b4cae
parent 7180ae8a1b0c70b0c585cb6c5edc61afb3a000e7
Author: Jaromil <jaromil@dyne.org>
Date:   Wed,  7 May 2014 11:10:13 +0200

Completed removal of procmail

Further development on the integrated filtering engine now
also supporting aliases and producing a sane sieve filter.

Diffstat:
Mbuild/install-gnu.sh | 3+--
Mdoc/Accounts/imap.default.txt | 7++-----
Mdoc/Accounts/smtp.default.txt | 2+-
Adoc/Aliases.txt | 7+++++++
Mdoc/Filters.txt | 4++--
Adoc/Identity.txt | 34++++++++++++++++++++++++++++++++++
Msrc/jaro | 15++++++++++++---
Dsrc/procmail/COPYING | 71-----------------------------------------------------------------------
Dsrc/procmail/ackmail.rc | 298-------------------------------------------------------------------------------
Dsrc/procmail/comm-reply-file.rc | 66------------------------------------------------------------------
Dsrc/procmail/commands.rc | 366-------------------------------------------------------------------------------
Dsrc/procmail/correct-addr.rc | 411-------------------------------------------------------------------------------
Dsrc/procmail/date.rc | 485-------------------------------------------------------------------------------
Dsrc/procmail/dupcheck.rc | 222-------------------------------------------------------------------------------
Dsrc/procmail/eg.spam-bounce-w-threshold.rc | 44--------------------------------------------
Dsrc/procmail/gen-spam-reply.rc | 94-------------------------------------------------------------------------------
Dsrc/procmail/get-date.rc | 8--------
Dsrc/procmail/get-from.rc | 46----------------------------------------------
Dsrc/procmail/guess-mua.rc | 48------------------------------------------------
Dsrc/procmail/headers.rc | 100-------------------------------------------------------------------------------
Dsrc/procmail/list-addr.rc | 75---------------------------------------------------------------------------
Dsrc/procmail/newsgate.rc | 46----------------------------------------------
Dsrc/procmail/pf-check.rc | 49-------------------------------------------------
Dsrc/procmail/pf-chkto.rc | 25-------------------------
Dsrc/procmail/pf-save.rc | 64----------------------------------------------------------------
Dsrc/procmail/pm-jaaddr.rc | 484-------------------------------------------------------------------------------
Dsrc/procmail/pm-jabup.rc | 140-------------------------------------------------------------------------------
Dsrc/procmail/pm-jacookie.rc | 460-------------------------------------------------------------------------------
Dsrc/procmail/pm-jacookie1.rc | 81-------------------------------------------------------------------------------
Dsrc/procmail/pm-jacron.rc | 210-------------------------------------------------------------------------------
Dsrc/procmail/pm-jadaemon.rc | 423-------------------------------------------------------------------------------
Dsrc/procmail/pm-jadate.rc | 146-------------------------------------------------------------------------------
Dsrc/procmail/pm-jadate1.rc | 224-------------------------------------------------------------------------------
Dsrc/procmail/pm-jadate2.rc | 162-------------------------------------------------------------------------------
Dsrc/procmail/pm-jadate3.rc | 201-------------------------------------------------------------------------------
Dsrc/procmail/pm-jadate4.rc | 125-------------------------------------------------------------------------------
Dsrc/procmail/pm-jadate5.rc | 227-------------------------------------------------------------------------------
Dsrc/procmail/pm-jadup.rc | 138-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaempty.rc | 86-------------------------------------------------------------------------------
Dsrc/procmail/pm-jafrom.rc | 93-------------------------------------------------------------------------------
Dsrc/procmail/pm-jafwd.rc | 401-------------------------------------------------------------------------------
Dsrc/procmail/pm-jalist.rc | 1866-------------------------------------------------------------------------------
Dsrc/procmail/pm-jamime-decode.rc | 290-------------------------------------------------------------------------------
Dsrc/procmail/pm-jamime-kill.rc | 712-------------------------------------------------------------------------------
Dsrc/procmail/pm-jamime-recode.rc | 185-------------------------------------------------------------------------------
Dsrc/procmail/pm-jamime-save.rc | 486-------------------------------------------------------------------------------
Dsrc/procmail/pm-jamime.rc | 245-------------------------------------------------------------------------------
Dsrc/procmail/pm-janetmind.rc | 214-------------------------------------------------------------------------------
Dsrc/procmail/pm-janslookup.rc | 395-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaorig.rc | 273-------------------------------------------------------------------------------
Dsrc/procmail/pm-japing.rc | 125-------------------------------------------------------------------------------
Dsrc/procmail/pm-japop3.rc | 415-------------------------------------------------------------------------------
Dsrc/procmail/pm-jarandf.rc | 128-------------------------------------------------------------------------------
Dsrc/procmail/pm-jasrv-check.rc | 84-------------------------------------------------------------------------------
Dsrc/procmail/pm-jasrv-daemon.rc | 118-------------------------------------------------------------------------------
Dsrc/procmail/pm-jasrv-err.rc | 101-------------------------------------------------------------------------------
Dsrc/procmail/pm-jasrv-from.rc | 103-------------------------------------------------------------------------------
Dsrc/procmail/pm-jasrv-msg.rc | 77-----------------------------------------------------------------------------
Dsrc/procmail/pm-jasrv-multi.rc | 136-------------------------------------------------------------------------------
Dsrc/procmail/pm-jasrv-req.rc | 85-------------------------------------------------------------------------------
Dsrc/procmail/pm-jasrv-send.rc | 333-------------------------------------------------------------------------------
Dsrc/procmail/pm-jasrv.rc | 704-------------------------------------------------------------------------------
Dsrc/procmail/pm-jastore.rc | 139-------------------------------------------------------------------------------
Dsrc/procmail/pm-jasubject.rc | 573-------------------------------------------------------------------------------
Dsrc/procmail/pm-jatime.rc | 127-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaube-keywords.rc | 785-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaube-prg-annoyance-filter.rc | 218-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaube-prg-bmf.rc | 283-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaube-prg-bogofilter.rc | 219-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaube-prg-bsfilter.rc | 214-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaube-prg-ifile.rc | 183-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaube-prg-runall.rc | 280-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaube-prg-spamassassin.rc | 236-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaube-prg-spamoracle.rc | 281-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaube-prg-spamprobe.rc | 192-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaube.rc | 1575-------------------------------------------------------------------------------
Dsrc/procmail/pm-jaube1.rc | 67-------------------------------------------------------------------
Dsrc/procmail/pm-javac.rc | 144-------------------------------------------------------------------------------
Dsrc/procmail/pm-javar.rc | 562-------------------------------------------------------------------------------
Dsrc/procmail/unread-default.rc | 48------------------------------------------------
Dsrc/procmail/unread-mh.rc | 90-------------------------------------------------------------------------------
Msrc/zlibs/accounts | 17-----------------
Msrc/zlibs/addressbook | 4++--
Msrc/zlibs/email | 22----------------------
Msrc/zlibs/filters | 249++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Msrc/zlibs/maildirs | 61-------------------------------------------------------------
86 files changed, 205 insertions(+), 19630 deletions(-)

diff --git a/build/install-gnu.sh b/build/install-gnu.sh @@ -18,9 +18,8 @@ mkdir -p $JARO_LIBEXEC { test -r $srcdir/src/fetchdate } || { print "Error: first build, then install."; return 1 } -mkdir -p $JARO_SHARE/{.procmail,.mutt,.stats} +mkdir -p $JARO_SHARE/{.mutt,.stats} cp -ra $srcdir/doc/* $JARO_SHARE/ -cp -ra $srcdir/src/procmail/* $JARO_SHARE/.procmail/ cp -ra $srcdir/src/mutt/* $JARO_SHARE/.mutt/ cp -ra $srcdir/src/stats/* $JARO_SHARE/.stats/ diff --git a/doc/Accounts/imap.default.txt b/doc/Accounts/imap.default.txt @@ -1,16 +1,13 @@ # Name and values are separated by spaces or tabs # comments start the line with a hash -# Name appearing in From: field +# Give a name to this account name To Be Configured +# configure Identity.txt to set your From: field # Email address (default is same as login) email unknown@gmail.com -# Aliases also received on this mail -# alias mimesis@gmail.com -# alias nemesis@gmail.com - # Internet address host imap.gmail.com diff --git a/doc/Accounts/smtp.default.txt b/doc/Accounts/smtp.default.txt @@ -1,7 +1,7 @@ # Name and values are separated by spaces or tabs # comments start the line with a hash -# Name for this account +# Give a name to this account name To Be Configured # Internet address diff --git a/doc/Aliases.txt b/doc/Aliases.txt @@ -0,0 +1,7 @@ +# Setup the aliases to your email: other addresses you +# receive and that should be treated as your own. +# One per line. + +info@work.com +desk@volunteering.org +drugs@blackmarket.net diff --git a/doc/Filters.txt b/doc/Filters.txt @@ -1,6 +1,6 @@ # Example filter configuration for Jaro Mail -# mailinglist filters are in order of importance +# Mailinglist filters are in order of importance # syntax: to <list email> save <folder> # below some commented out examples, note the use of a prefix, # which makes it handy when browsing with file completion. @@ -20,10 +20,10 @@ # Other filters for web 2.0 using folder names with a prefix: # they can facilitate folder maintainance. -# from identi.ca save web.identica # from Twitter save web.twitter # from linkedin save web.linkedin # from googlealerts save web.google +# from plus.google.com save web.google # from facebook save web.facebook # from FriendFeed save web.friendfeed # from academia.edu save web.academia diff --git a/doc/Identity.txt b/doc/Identity.txt @@ -0,0 +1,34 @@ +# Configure the identity disclosed by your emails + +# Your name +set realname = "Luther Blisset" + +# The from field shown by your mails +set from = "Luther Blisset <luther@dyne.org>" + +# set signature='~/.signature' # signature file +# set pgp_sign_as="0xB4DC0FF3" # UserID/KeyID for signing +# set locale="" # system default locale ("C") + +# Customized headers example + +unmy_hdr * # remove all extra headers first. + +# my_hdr Organization: Dyne.org +# my_hdr X-GPG-Keyserver: pgp.mit.edu +# my_hdr X-GPG-Id: 0xB4DC0FF3 +# my_hdr X-GPG-Fingerprint: B2D9 9376 BFB2 60B7 601F 5B62 F6D3 FBD9 B4DC 0FF3 +# my_hdr X-Face: %H:nE)m:Rl>Z?(C7EvRtuUJp4^f@d\#~4pB48~:1:EC)^&9EDcZaKL/*+10(P?g*N0>n8n3&\n kVzfAD`+RofVAx~ew>FGQmmT7NqlSQx+M8LN5`,h^aPF[Njx+A~%f!&VJu9!y:~ma/\'^@mvOr@}DyG\n @\"g`kfy(vyRC + + +# Go wild with Mutt! +# below you can add any other custom configuration + + +## dark background (uncomment to switch) +# source /usr/share/mutt/themes/colors-solarized-dark-256 +# source /usr/share/mutt/themes/colors-solarized-dark-16 + +## light background (uncomment to switch) +# source /usr/share/mutt/themes/colors-solarized-light-256 +# source /usr/share/mutt/themes/colors-solarized-light-16 diff --git a/src/jaro b/src/jaro @@ -665,7 +665,11 @@ main() case "$subcommand" in compose) compose ${PARAM} ;; queue) queue ${PARAM} ;; - fetch) fetch ${PARAM};; # was checking is_online + fetch) + if [ "$account" = "" ]; then fetchall + else fetch; fi + filter_maildir incoming + ;; send) send ${PARAM} ;; # was checking is_online peek) peek ${PARAM} ;; # was checking is_online @@ -685,7 +689,7 @@ main() stat) CLEANEXIT=0; stats ${PARAM} ;; complete) CLEANEXIT=0; complete ${PARAM} ;; - isknown) CLEANEXIT=0; isknown ${PARAM} ;; + isknown) CLEANEXIT=0; sender_isknown ${PARAM} ;; learn) CLEANEXIT=0; learn ${PARAM} ;; forget) CLEANEXIT=0; forget ${PARAM} ;; list) CLEANEXIT=0; list_addresses ${PARAM} ;; @@ -701,7 +705,12 @@ main() backup) backup ${PARAM} ;; rmdupes) rmdupes ${PARAM} ;; merge) merge ${PARAM} ;; - filter) filter_maildir incoming ${PARAM} ;; + + filter) + update_filters ${PARAM} + filter_maildir ${PARAM} + ;; + deliver) deliver ${PARAM} ;; passwd) change_password ${PARAM} ;; diff --git a/src/procmail/COPYING b/src/procmail/COPYING @@ -1,71 +0,0 @@ - -Upstream Author: - - Jari Aalto <jari.aalto@cante.net> - -Copyright - - lib-stebbens/: - Copyright (C) 1995-1997 Alan Stebbens <aks@sgi.com> - - <rest of the files>: - Copyright (C) 1997-2008 Jari Aalto <jari.aalto@cante.net> - -License - - From doc/license/LICENSE.txt: - - This program runs solely with Free Software. It does not rely - on any component of non-Free Software. - - Copyright (C) 1997-2008 Jari Aalto - - This program (referring to all files, including documentation, - distributed in project "Procmail Module Library") is free - software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - Visit <http://www.gnu.org/copyleft/gpl.html> for more information. - - - - - - Exception: The documentation of project "Procmail Module Library" - (*.txt and *.html files) is DUAL LICENCED and may be - distributed under the terms of GNU General Public License (GNU - GPL) --see above--; *or*, at your option, distributed under - the terms of GNU Free Documentation License (GNU FDL). - - The end user can continue to distribute the documentation in - this dual licence form *or* select the other license (GNU GPL, - GNU FDL) and remove the unwanted one. - - Copyright (C) 1997-2008 Jari Aalto - - Permission is granted to copy, distribute and/or modify - this document under the terms of the GNU Free - Documentation License, Version 1.2 or any later version - published by the Free Software Foundation; with no - Invariant Sections, no Front-Cover Texts, and no - Back-Cover Texts. A copy of the license is included in the - section entitled "GNU Free Documentation License"; - see the file COPYING.GNU-GFDL. - - Visit <http://www.gnu.org/licenses/fdl.html> for more information. - -The Debian packaging is licensed under the GPL version 2 or, (at your -option) any later version, see below, and is: - - Copyright (C) 2008-2010 Jari Aalto <jari.aalto@cante.net> - Copyright (C) 2007 Michael Ablassmeier <abi@debian.org> - Copyright (C) 2001-2003 Elie Rosenblum <fnord@debian.org> - Copyright (C) 2000 Dr. Guenter Bechly <gbechly@debian.org> - Copyright (C) 1999 Raphael Hertzog <rhertzog@hrnet.fr> - Copyright (C) 1996-1998 Karl Sackett <krs@debian.org> - diff --git a/src/procmail/ackmail.rc b/src/procmail/ackmail.rc @@ -1,298 +0,0 @@ -# ackmail.rc -- procmail rc to acknowledge mail (with either a -# vacation message, or an acknowledgement) -# -# $Id: ackmail.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# Copyright (C) 1995 Alan K. Stebbens <aks@sgi.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# Usage: -# -# After setting the variables below appropriately, add the following -# to your .procmailrc: -# -# INCLUDERC=ackmail.rc -# -# Features: -# -# If the file $VACAMSG exists, it is assumed that the user is in -# "vacation mode", and mail will be acknowledged with the contents of -# the $VACAMSG file, with the subject line appended with "[on -# vacation]". -# -# If $VACAMSG doesn't exist, and $ACKMSG does, mail will be -# acknowledged with the contents of $ACKMSG with the subject line -# appended with "[acknowledgment]". -# -# If neither the file $ACKMSG nor $VACAMSG exists, this recipe does -# nothing. -# -# Mail from any daemon or the usual set of mailing lists will not be -# acknowledged (uses ^FROM_DAEMON). -# -# Mail from any of a set of configured users ($NOACKS) will not be -# acknowledged (be default, this includes the user). -# -# Mail from any user will only be acknowledged once per day. -# -# Regardless of whether or not "ackmail.rc" acknowledges the mail, any -# recipes following the INCLUDERC will continue to filter the incoming -# mail (that is, it is not considered to be delivered). -# -# Before including the "ackmail.rc" file, be sure to setup the following -# variables: -# -# MY_ADDR - preferred email address for the user -# -# MY_NAMES - regex matcing personal names & alternatives; -# ultimately, only mail addressed to $MY_NAMES -# will be acknowledged; defaults to the -# contents of $SIGNATURE or $HOME/.signature, in -# that order. -# -# NOACKS - regex matching people from whom to NOT -# acknowledge mail; defaults to $MY_ADDR -# -# NOACKFILE - path to a file containing regexps of addresses to not -# acknowledge -# -# ACKS - file containing the acknowledgment cache; -# defaults to $MAILDIR/.acks.cache -# -# ACKMSG - file containing the message to reply with; -# defaults to ackmsg -# -# VACAMSG - file containing the message to reply with; -# defaults to vacation.msg -# -# FROMSIG - From: header to use in the auto-ack; defaults -# to "Mailer-Daemon of $USER" -# -# MUA - define as one of the keywords below to tell the -# recipe on how to calculate the unread mail: -# MUA=default - your unread mail sits in $DEFAULT (you don't filter -# mail into folders) -# MUA=mh - your mail is filtered into the MH +inbox; tries to -# use any Unseen-Sequence, or calculates it from the -# output of "folders +inbox". -# MUA=XXXXX - causes a recipe named "unread-XXXXX.rc" to be -# invoked (if it exists) to calculate the number -# of unread messages and returned in $UNREAD. -# -# -# And be sure PATH includes the directory containing "formail". - -# If the mail is directly to me, and not an auto-reply itself -# then do the auto-ack - -MY_NAMES=${MY_NAMES:-${SIGNATURE:-`cat $HOME/.signature 2>/dev/null`}} -ACKS=${ACKS:-ackmail.cache} -ACKMSG=${ACKMSG:-ackmsg} -VACAMSG=${VACAMSG:-vacation.msg} -FROMSIG=${FROMSIG:-"Mailer-Daemon of $USER"} -NOACKS=${NOACKS:-$MY_ADDR} -NOACKFILE=${NOACKFILE:-''} - -# Handy regexp patterns (taken from "headers.rc") -PRE_ADDR_SPAN='(.*[^-(.%@a-zA-Z0-9])?' -POST_ADDR_SPAN='(([^),.!:a-zA-Z0-9].*)?(,|$[^>]))' -FROMHDR="(^(((Resent-)?(From|Sender)|X-Envelope-From):|>?From )$PRE_ADDR_SPAN)" - -# Begin the tests -# 1. Is it addressed to me (using any of my names)? -# 2. Is there an acknowledgement file or vacation message file? -# 3. Is the mail NOT from any kind of daemon -# 4. Is the mail NOT from a mailing list manager which procmail doesn't know -# 5. Does the subject NOT have any text indicating some kind of automatic -# reply mechanism has already taken place? -# 6. Is this NOT a message we generated (a bounce, maybe)? -# 7. Is the message NOT from anyone on our "noack" list? - -# If you need to debug your configuration of ackmail.rc, just "touch -# ackmail.log" and the recipe below will log the ackmail.rc activity to -# ackmail.log. When you are satisfied with your configuration, simply -# remove ackmail.log and logging will stop. - -:0 -* ? test -f ackmail.rc.log -{ - OLDACKLOGFILE=$LOGFILE - LOGFILE=ackmail.rc.log - LOGABSTRACT=all - VERBOSE=on -} - -# Get the best return address without names & comments. -# This will be the same address we respond to. -SENDER=`formail -rtzx To:` - -# Define a list of well-known list mailer addresses -LIST_MAILERS='((Mail(er)?-?)?daemon|root|LISTSERV|ListProc|\ -[a-zA-Z0-9-]+-(list|request|owner)|(owner-)?list-[a-zA-Z0-9-]+|\ -Majordomo|Mailagent|Postmaster|mmdf|news|n?uucp)' - -# This is the major condition by which we decide to respond -# or not. - -:0ch -* $ ^TO($USER|$MY_ADDR|$MY_NAMES) -* ? test -f $ACKMSG -o -f $VACAMSG -* !^FROM_DAEMON -* $! SENDER ?? $LIST_MAILERS -* $! $FROMHDR(Majordomo|Listserv) -* !^Subject: .*(\[(ack(nowledge?ment)?|on vacation)\]|\ - auto(matic)[- ]reply|\ - away from mail|\ - out of town|\ - can ?not (reply|answer)|\ - (on |via )vacation( program)?) -* $!^X-Loop: *$MY_ADDR -* $!$FROMHDR($NOACKS)$POST_ADDR_SPAN -{ - # Okay -- we're doing to do the auto-ack or vacation mail - # - # We're forking for the auto-ack, shut up comsat, and assume that, - # in this process, the mail is delivered - DELIVERED=yes - COMSAT=off - - # Don't output logfile info; the user can query $ACKS to see which - # users have been acknowledged. This only affects the child - # process. - LOGABSTRACT=no - - # Check for a NOACKFILE; if it exists, and if the sender matches one - # of the regexps within the NOACKFILE, then do not ack this mail - :0h - * ? test -n "$NOACKFILE" -a -f "$NOACKFILE" - * ? echo "$SENDER" | egrep -s -f "$NOACKFILE" - { HOST=_do_not_ack_this_user } - - # Check the mail to see if we have replied recently, and if so, if - # we should reply again - DATE=`date +'%D'` - - # Get the subject - :0 ch - SUBJ=| formail -zX'Subject:' | sed -e 's/["~]//g' -e 's/^ *[Rr]e: *//g' - SUBJ="${SUBJ:-'(no subject)'}" - - # Get which file: "vacation.msg" has precedence over "ackmsg" - :0 - * ? test -f $VACAMSG - { ACKFILE=$VACAMSG ACKM='on vacation' } - :0 E - { ACKFILE=$ACKMSG ACKM='acknowledgment' } - - # Check the cache for a recent ack (a successful grep "delivers" the - # mail) - LOCKFILE=$ACKS.lock - :0 Wh - | fgrep -i -s "$SENDER $DATE" $ACKS - - # Not in the $ACKS file; add it - JUNK=`(fgrep -i -v "$SENDER" $ACKS ; echo "$SENDER $DATE" ) >$ACKS.new ; - rm -f $ACKS ; mv $ACKS.new $ACKS ` - - # Release the lock - LOCKFILE - - # Replace the headers with a reply - - # (Note: do not use -k here; "h" recipes include the blank - # line in the headers, and formail -r generates a blank line - # also. If you use '-k', then the original blank line will - # be kept, and the additional will be added, resulting - # in two blank lines). - - :0 fhw - | formail -rtI"From: $FROMSIG" \ - -I"Reply-To: $MY_ADDR" \ - -I"Precedence: junk" \ - -I"Subject: Re: $SUBJ [$ACKM]" \ - -I"X-Loop: $MY_ADDR" \ - -I"References:" - - # If formail failed, it is because it couldn't be found - # avoid acks in this case - :0 e - { LOG="****Error: Formail failed in ackmail.rc at `date` -" - HOST=_stop_processing_now - } - - # Replace the body with the ack message - :0 fbw - | cat $ACKFILE - - # If the cat $ACKFILE failed, it is probably because ackfile can't - # be read; in this case, create a reasonable reply - :0 efb - | echo "Your mail concerning '$SUBJECT' was received." ; \ - echo "I'll reply to it as soon as I can." - - # Now maybe do some substitutions, depending upon whether or not the - # particular strings exist. - :0 fBb - * $SUBJECT - | sed -e "s~\$SUBJECT~$SUBJ~g" - - :0 fBb - * $SENDER - | sed -e "s~\$SENDER~$SENDER~g" - - # If the string $UNREAD is in the message, then figure out - # how many unread messages and substitute it - :0 B - * $UNREAD - { - UNREAD=no # by default - - # Define the MUA if it isn't defined already - :0 - * MUA ?? !.+ - * ? test -f guess-mua.rc - { INCLUDERC=guess-mua.rc } - - # For any MUA keyword, there should be a corresponding - # unread-$MUA.rc file. - :0 - * MUA ?? .+ - * ? test -f unread-$MUA.rc - { INCLUDERC=unread-$MUA.rc } - - # Finally, substitute UNREAD into the current body - :0 fb - | sed -e "s~\$UNREAD~$UNREAD~g" - } - - # Finally, deliver it - :0 w - ! -oi -t - - HOST=end_of_processing # just in case sendmail failed -} - -# Undo any debug logging -:0 -* LOGFILE ?? ackmail\.rc\.log -{ - VERBOSE=no - LOGABSTRACT=yes - LOGFILE=$OLDACKLOGFILE - OLDACKLOGFILE -} diff --git a/src/procmail/comm-reply-file.rc b/src/procmail/comm-reply-file.rc @@ -1,66 +0,0 @@ -# comm-reply-file.rc -*- text -*- -# -# procmail rc file to filter a reply message body with a given file, -# or report an error. -# -# $Id: comm-reply-file.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# Copyright (C) 1995 Alan K. Stebbens <aks@sgi.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# Usage: -# -# REPLYFILE=file-to-be-sent -# REPLYERR="error message if file doesn't exist" -# - -:0 -* ! REPLYFILE ?? . -{ LOG="comm-send-file.rc: REPLYFILE not defined! -" -} - -# REPLYFILE is defined -:0 E -{ - - # On the assumption that the message body has been prepared, - # filter it and append the requested file. - :0 fbw - * ? test -f $REPLYFILE - | cat - $REPLYFILE - - # The file wasn't available, generate an error message - :0 E - { - # Provide for a default error message if $REPLYERR isn't set - :0 - * ! REPLYERR ?? . - { - # get the basename of the file (don't show any path) - :0 - * ! REPLYFILE ?? .*/\/[^/]+$ - * ! REPLYFILE ?? \/^.*$ - { REPLYERR="Sorry, the file you requested is not currently available." } - :0 E - { REPLYERR="Sorry, the file '$MATCH' is not currently available." } - } - - :0 fbw - | cat - ; echo "$REPLYERR" - } -} diff --git a/src/procmail/commands.rc b/src/procmail/commands.rc @@ -1,366 +0,0 @@ -# commands.rc -*- text -*- -# -# procmailrc file to check for commands in the subject line -# -# $Id: commands.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# Copyright (C) 1995 Alan K. Stebbens <aks@sgi.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# Usage: -# -# HELPFILE=commands.help [optional] -# INFOFILE=commands.info [optional] -# PROCMAILINFO=procmail.info [optional] -# COMMANDLOG=commands.log [optional] -# NOACKFILE=noacks [optional] -# -# INCLUDERC=commands.rc -# -# Notes: -# -# * This recipe consumes the input if it successfully matches. -# Processing does not continue unless the subject is not a -# command. -# -# * HELPFILE should contain general help, and be relatively short. -# -# * INFOFILE should contain more detailed information on the -# supported commands. -# -# * All default filenames are relative to $MAILDIR. -# -# * NOACKFILE is used by "ackmail.rc", with the same default. -# -# * Processed commands are logged in $COMMANDLOG. The format of the -# logged information is: -# -# date : address : command -# -# * To debug your configuration, touch $MAILDIR/commands.rc.log and -# watch its contents for logged information. Remove this file when -# you no longer wish to have a detailed debug log. -# -# * This recipe file uses "comm-reply-file.rc" (which is part of the -# procmail library). -# -# Current commands are: -# -# (send | get) help -# (send | get) info(rmation)? -# (send | get) pgp key -# (send | get) procmail info -# (send | get) procmail lib(rary) -# (send | get) smartlist lib(rary) -# (send | get) emacs setup -# (send | get) procmailrc -# (en|dis)able (auto *)ack(nowledgments) -# -# Author: Alan K. Stebbens -# -# Check for any of the commands - -:0 -* ? test -f commands.rc.log -{ OLDCMDLOGFILE=$LOGFILE - LOGFILE=commands.rc.log - LOGABSTRACT=all - VERBOSE=yes -} - -:0 -* ^Subject: *['"]?\/\ - ((send|get) +(help|info(rmation)?|\ - procmailrc|\ - (procmail|smartlist) *(- *)?info(rmation)?|\ - (procmail|smartlist) *(- *)?lib(rary)?|\ - emacs(-| *)setup|\ - pgp *key)|\ - (en|dis)able +(auto *)?ack(nowledge?ment)?s?) -* ! ^FROM_DAEMON -* $ ! ^X-Loop: $MY_ADDR -{ - # We're forking at this point -- so shutup procmail - COMSAT=off - - # Tell sendmail we've got control - DELIVERED=yes - - # Save a copy just in case (in log mode) - :0 c: - * LOGFILE ?? commands\.rc\.log - commands.requests - - # Get the trigger subject - SUBJ=$MATCH - - # Get the best reply address (used for logging) - :0 - * ! ^Reply-to: *\/[^ ].* - * ! ^From: *\/[^ ].* - * ! ^Sender: *\/[^ ].* - * ! ^From *\/[^ ]+ - { FROM=nobody } - :0E - { FROM=$MATCH } - - # Just in case these aren't defined - FROMSIG="${FROMSIG:-\"The Mailer-Daemon of $USER\" <$USER>}" - MY_ADDR="${MY_ADDR:-<$USER>}" - - # The log file - COMMANDLOG=${COMMANDLOG:-commands.log} - - # The basic processing works like this: - # Now that we've captured the important information from the - # incoming mail, we replace the headers portion with an - # autoreply header. - # - # Then, as part of recognizing the SUBJECT command, we - # replace the body portion with the response - # - # After testing for all the possible subject commands, - # we then submit the mail unless it is empty. - - # Generate a reply header, and replace the headers - :0 fhw - | formail -rI"From: $FROMSIG" \ - -I"Reply-To: $MY_ADDR" \ - -I"Subject: Re: $SUBJ" \ - -I"Precedence: junk" \ - -I"X-Loop: $MY_ADDR" - - # Now, start a new message body - :0 fbw - | echo "This message was sent automatically in reponse to your recent" ; \ - echo "mail with the subject: \"$SUBJ\"." ; \ - echo "" - - # Now process each command - - ##### send procmailrc - ##### send procmail lib - :0 - * SUBJ ?? procmail(rc| *(- *)?lib(rary)?) - { - # **** This is very site specific **** - PROCMAILDIR=$HOME/src/mail/procmail/procmail-lib - :0 - * SUBJ ?? procmailrc - { - REPLYFILE=$PROCMAILDIR/procmailrc-example - INCLUDERC=comm-reply-file.rc - } - :0 E - { - REPLYFILE=$PROCMAILDIR/procmail-lib.shar - INCLUDERC=comm-reply-file.rc - } - } - - #### send procmail info - :0 E - * SUBJ ?? (procmail|smartlist) *(- *)?info - { - PROCMAILINFO=${PROCMAILINFO:-procmail.info} - REPLYFILE=$PROCMAILINFO - INCLUDERC=comm-reply-file.rc - } - - ##### send smartlist library - :0 E - * SUBJ ?? smartlist *(- *)?lib(rary)? - { - # **** This is very site specific **** - REPLYFILE=$HOME/src/mail/procmail/smartlist-lib/smartlist-lib.shar - INCLUDERC=comm-reply-file.rc - } - - ##### send information - :0 E - * SUBJ ?? info(rmation)? - { - # The information file with a suitable default - INFOFILE=${INFOFILE:-commands.info} - REPLYFILE=$INFOFILE - INCLUDERC=comm-reply-file.rc - } - - ##### send emacs setup - :0 E - * SUBJ ?? emacs(-| *)setup - { - # Send emacs setup (shar archive is several files) - EMACSSETUP="$HOME/emacs/site-setup.shar*" - count=`echo $EMACSSETUP | wc -w` - - # For this command, we are responding with several mails - # so we cannot use procmail to "hold" them all at the - # same time. So, we generate several sendmail invocations - # and leave the current mail buffer empty by filtering it - # with /dev/null - - :0 fw:tmp.reply.lock - * $ ? test -f $EMACSSETUP - | cat - > tmp.reply ; \ - i=1 ; \ - for file in $EMACSSETUP ; do \ - cat tmp.reply $file \ - | formail -I "Subject: Re: $SUBJ [part $i/$count]" \ - | $SENDMAIL -oi -t ; \ - i=`expr $i + 1` ; \ - done ; \ - cat /dev/null - - :0 Efbw - | cat - ; \ - echo "Sorry, the emacs setup archive file is not currently available." - } - - ##### send pgp key - :0 E - * SUBJ ?? pgp *key - { - # Add some more headers - :0 fhw - | formail -I"Mime-Version: 1.0" \ - -I"Content-Type: application/pgp; format=keys-only" \ - -I"Content-Description: PGP key of $MY_ADDR" \ - -I"Content-Transfer-Encoding: 7bit" - - # get the text for the body - :0 fbw - | cat - ; \ - sh -c "pgp -kxaf $MY_ADDR 2>/dev/null" - - # If PGP failed somehow, leave a nice return message - :0 efbw - | cat - ; \ - echo "Sorry, my PGP key is not available at the moment." - } - - ##### (disable|enable) ack(nowledgements) - :0 E - * SUBJ ?? (dis|en)able - { - # Be sure NOACKFILE is defined - NOACKFILE=${NOACKFILE:-noacks} - - # remove this address from NOACKS - WHO=`formail -zxTo:` - - # The content of NOACKS are regexps, so we must carefully convert - # the address into a regexp which *matches* a regexp. - REWHO=`echo "$WHO" | sed -e 's/[.]/\\\\\\\\\\\\./g'` - - # See if the user is currently in the list of NO-ACKs - LOCKFILE=$NOACKFILE.lock - - :0 - * ? grep -s "^$REWHO" $NOACKFILE - { - # It is -- If "enable", remove it. - :0 - * SUBJ ?? enable - { - JUNK=`grep -v "^$REWHO" $NOACKFILE > $NOACKFILE.new ; - mv $NOACKFILE.new $NOACKFILE` - } - - :0 Afbw - | cat - ; \ - echo "Future mail from $WHO will be auto-acknowledged." ; \ - echo "" ; \ - echo "If you wish to disable auto-acknowledgements, please" ; \ - echo "send me an email message with the subject: \"disable autoacks\"." - - :0 Efbw - | cat - ; \ - echo "Mail from $WHO is already not being auto-acknowledged." - } - - # Else, $WHO is not in the $NOACKs - :0 E - { - # If the command was disable, add it to the file - # We must convert the address to a regexp as part of adding it - # to the file. - :0 - * SUBJ ?? disable - { JUNK=`echo "$WHO" | sed -e 's/[.]/\\\\./g' >> $NOACKFILE` } - - :0 Afbw - | cat - ; \ - echo "Future mail from $WHO will not be acknowledged." ; \ - echo "" ; \ - echo "If you wish to enable auto-acknowledgements, please" ; \ - echo "send me an email message with the subject: \"enable autoacks\"." - - :0 Efbw - | cat - ; \ - echo "Mail from $WHO is already being acknowledged." - } - - # Remove the global lockfile - LOCKFILE - } - - ##### send help (explicitly or because of some other request) - :0 E - { - # This is a combined recipe -- both the "send help" recipe - # and the "unknown" command recipes result in the sending - # of the helpfile. - - # If an unknown subject, append an error message - :0 fbw - * ! SUBJ ?? help - | cat - ; \ - echo 'Sorry, I don't know how to do this request.' ; \ - echo '' - - # The help file with a suitable default - HELPFILE=${HELPFILE:-commands.help} - REPLYFILE=$HELPFILE - INCLUDERC=comm-reply-file.rc - } - - # Okay, procmail should be "holding" some headers and some body - # text. Send it (if it is not an empty mail) - - :0 cw - * > 1 - ! -oi -t - - # Don't log anything else - LOGABSTRACT=off - - # Log this request (and mark the mail as "delivered") - :0 hw: $COMMANDLOG$LOCKEXT - | echo "`date` : $FROM : $SUBJ" >> $COMMANDLOG - - HOST=end_of_processing -} - -:0 -* LOGFILE ?? commands\.rc\.log -{ LOGFILE=$OLDCMDLOGFILE - LOGABSTRACT=yes - VERBOSE=no -} - -# End of commands.rc diff --git a/src/procmail/correct-addr.rc b/src/procmail/correct-addr.rc @@ -1,411 +0,0 @@ -# correct-addr.rc -# -# $Id: correct-addr.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# Copyright (C) 1996 Alan K. Stebbens <aks@sgi.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# Procmail recipe file to help forward mail from an OLD address to a -# NEW address, and do some mailing list mail management. -# -# This recipe file is intended to make it easy for users to forward -# their mail from their old address to a new address, and, at the same -# time, educate their correspondants about it by CC'ing them with the -# mail. -# -# Only mail directly addressing the user at the old address will cause a -# "correction notice" to be sent. -# -# Mail *not* directly addressing the old address (eg: from a mailing list) -# is treated separately, according to the MAILLIST variable; it can be one -# or more of these values: -# -# drop This is the default behaviour, and is only defined to -# explicitly acknowledge this. In other words, "drop" -# and "forward" are mutually exclusive, and omitting -# "forward" implies "drop", but not vice versa. -# -# forward forward all mailing list mail to $NEWADDR, inserting -# "Resent-From:" and "Resent-To:" headers. Of course, -# $NEWADDR must also be defined. -# -# report report the headers of all mailing list mail to -# $POSTMASTER, so that the person handling this role can -# send the appropriate unsubscription requests. -# -# *** NOT IMPLEMENTED *** -# -# bounce return all mailing list mail with "User has moved!" to -# the "request" or "owner" address; great pains are taken -# to not respond to a general distribution list address. -# If the proper list address cannot be determined, then -# the ultimate fallback return address is "postmaster" at -# the originating domain. -# -# remove If the originating mailing list software type can be -# determined, automatically generate an "unsubscribe" -# address on the $OLDADDR. Currently, the recipe -# understands Majordomo, SmartList, and LISTSERV commands. -# If the mailing list software cannot be determined, then -# falls back to "report" action. -# -# change If the originating mailing list software type can be -# determined, automatically generate mails to the list -# request address to unsubscribe the old address and to -# subscribe the new address, if given. If the mailing -# list software cannot be determined, then falls back -# to "report" action. -# -# Multiple keywords can be given to accomplish several things on the -# mailing list mail. -# -# Without the "forward" keyword, mailing list mail will not ever be -# forwarded, even if NEWADDR is defined. Therefore, to have mailing -# list mail be both forwarded and bounced, use "forward,bounce". To -# have mailing list mail be forwarded, and have the subscription -# changed where possible, use "forward,change". -# -# -# Usage: -# -# These variables are *optional*, with the defaults as shown: -# -# OLDLOGIN=$LOGNAME -# The primary old login; this will be used in the -# correction notice sent to correspondants. -# -# OLDUSER=$FRIENDLY (see get-from.rc} -# The user's old real name, included in the correction -# notice. If not set by the user, FRIENDLY is used, which -# is determined by the procmail recipe file "get-from.rc". -# -# OLDLOGINS='$\LOGNAME' -# A regexp matching the old login name(s). If the user -# received mail at more than one login name, this should -# match them all. For most users, the default is fine. -# -# NOTLOGINS= -# A regexp matching logins mail to which should NOT be -# forwarded or corrected. This can be used to form -# a filter to correct mail addressed ambiguously. See -# the man page for examples. -# -# NOTSUBJECTS= -# Any mail containing subjects matching this regexp does -# not get corrected or filtered. -# -# DOMAIN= -# The domain in which this user resides; without this -# definition, this script can only match on the user -# name. -# -# HOSTS='[^. ]+' -# A regexp matching the hosts at which the OLDLOGIN -# receives mail. This is used in conjunction with $DOMAIN -# so don't place the domain in this regexp. -# -# NEWADDR= -# The address to which mail should be forwarded. There is -# no default, resulting in no forwarding; in this case, only -# reply with "no such user" notices. -# -# NEWUSER=$OLDUSER -# The new user name, defaulting to the old user name. This -# is used for correction notices. -# -# POSTMASTER=Postmaster <postmaster> -# This is used as the From: address for both the correction -# "no such user" notices. -# -# MAILLIST=[keyword,...] -# One or more keywords: forward, report, bounce, remove, -# or change, separated by spaces or commas. See the -# description above for details. -# -# INCLUDERC=correct-addr.rc -# -# Examples: -# -# a. John Carter has moved from his current location to "carter@mars.com", -# and he wishes to have his mailing mail forwarded. -# -# NEWADDR = carter@mars.com -# MAILLIST = forward -# INCLUDERC = correct-addr.rc -# -# b. Clark Kent has moved back to his hometown, and does not want his -# mail forwarded at all, especially his mailing lists. -# -# NEWADDR # guarantee no NEWADDR -# MAILLIST = bounce,remove -# INCLUDERC = correct-addr.rc -# -# c. Dennis Mitchell has been receiving mail by many aliases, and, having -# gone off to college, wishes to have all of his mail sent to his -# new email address. -# -# NEWADDR = menace@engineering.ucsb.edu -# OLDLOGINS = "(Dennis|D.Mitchell|Dennis.Mitchell|Menace)" -# MAILLIST = forward -# INCLUDERC = correct-addr.rc -# -# d. Lois Lane has gotten married, and wishes to have her mail forwarded -# to her new address, with her mailing list subscriptions changed, and -# she wishes to have any correction notices mention her new name. -# -# NEWADDR = lois@smallville.ia.us -# OLDLOGINS = "(Lois|Lane|L.Lane|Lois[._]Lane)" -# NEWUSER = "Lois Kent" -# MAILLIST = forward,change -# INCLUDERC = correct-addr.rc -# -# e. Tom, a clever system manager, has installed an automatic alias for -# users when their logins expires (and they no longer have a home -# directory in which to place a ~/.procmailrc file), which invokes -# a small shell script, called "correct-mail": -# -# olduser1: "|correct-mail olduser1" -# olduser2: "|correct-mail olduser2" -# -# The shell script looks like this: -# -# #!/bin/sh -# PATH=$PATH:/usr/local/bin ; export PATH -# procmail -m LOGNAME=$1 \ -# MAILLIST=bounce,report \ -# DEFAULT=/dev/null \ -# MAILDIR=/tmp \ -# LOGFILE=/usr/adm/correct-mail.log \ -# LOGABSTRACT=yes \ -# /etc/procmailrcs/correct-addr.rc -# - -# First let's do some optional logging -# If the file "correct-addr.rc.log" exists, we log extensively -# to it. - -:0 -* ? test -f correct-addr.rc.log -{ CA_LOGFILE=$LOGFILE - CA_LOGABSTRACT=$LOGABSTRACT - CA_VERBOSE=$VERBOSE - LOGFILE=correct-addr.rc.log - LOGABSTRACT=all - VERBOSE=yes -} - -# A temporary file used to hold mail being reported to the postmaster -REPORTMAIL=tmp.ca-mail.$LOGNAME - -# Make sure variables have default settings - -OLDLOGIN=${OLDLOGIN:-$LOGNAME} -HOSTS=${HOSTS:-'[^. >(),;]+'} -POSTMASTER="${POSTMASTER:-\"Postmaster <postmaster>\"}" -MAILLIST=${MAILLIST:-forward} - -DOMAIN="`echo \"$DOMAIN\" | sed -e 's/\\./\\\\./'`" - -# HOSTPART matches the entire hostname part of an address -HOSTPART="(@($HOSTS(\.$DOMAIN)?|$DOMAIN))?([,();> ]|$)" - -# Define a regexp matching the old addresses -:0 -* OLDLOGINS ?? . -{ OLDADDRS="($OLDLOGIN|$OLDLOGINS)$HOSTPART" } - -# There isn't a set of other logins -:0 E -{ OLDADDRS="$OLDLOGIN$HOSTPART" } - -# Okay -- now begin the basic tests. - -# Be sure we don't loop -:0 -* $ ^X-Loop: $LOGNAME@$HOST -{ } - -# Make sure that the negative filters do not apply - -# If there is a NOTLOGINS defined, and it matches the addressee -# then don't correct/forward -:0 E -* NOTLOGINS ?? . -* $ ! ^TO$NOTLOGINS$HOSTPART -{ } - -# If there is a NOTSUBJECTS defined, and it matches the subject -# then don't correct or forward -:0 E -* NOTSUBJECTS ?? . -* $ ! ^Subject: *$NOTSUBJECTS -{ } - -# Else, if the mail matches the OLDLOGINS, then correct and forward -:0 E -* $ ^TO$OLDADDRS -{ - # Begin the correction and forwarding part - OLDADDR=$MATCH - - :0 - * OLDADDR ?? [,(); >]$ - { OLDADDR="`echo \"$OLDADDR\" | sed -e 's/[,(); >]$//'`" } - - # First, save a copy - LOCKFILE=$REPORTMAIL.lock - - :0 c - $REPORTMAIL - - # Set OLDUSER to FRIENDLY if not already set - :0 - * ! OLDUSER ?? . - { INCLUDERC=get-from.rc - OLDUSER=$FRIENDLY } - - # Generate a new header - :0 fhw - | formail -rt -I"From: $POSTMASTER" \ - -I"Subject: Your mail to $OLDADDR" \ - -I"X-Loop: $LOGNAME@$HOST" - - # Is there a new address for forwarding? - :0 a - * NEWADDR ?? . - { - # Be sure NEWUSER is set - NEWUSER=${NEWUSER:-$OLDUSER} - - # Make sure the new user gets a copy of the correction notice - :0 afhw - | formail -A"Cc: $NEWADDR ($NEWUSER)" - - :0 afbi - | echo "Your mail to $OLDUSER at:" ; \ - echo "" ; \ - echo " $OLDADDR" ; \ - echo "" ; \ - echo "is no longer correct; ${NEWUSER} now receives mail at:" ; \ - echo "" ; \ - echo " $NEWADDR" ; \ - echo "" ; \ - echo "This message, with your original mail, is also being forwarded" ; \ - echo "to the new address." ; \ - echo "" ; \ - echo "Please remember to update the address you have for $NEWUSER in" ; \ - echo "any mail address database you may use." - } - - # If NEWADDR is not set, just tell the sender that this address - # is no longer valid - :0 Efbi - | echo "Your mail to $OLDUSER at:" ; \ - echo "" ; \ - echo " $OLDADDR" ; \ - echo "" ; \ - echo "is being returned because this user is no longer at this address" ; \ - echo "and no forwarding address has been provided." - - # Append the signature and the original mail, and send it - :0 fb - | cat ; \ - echo "" ; \ - echo "Regards, the $POSTMASTER" ; \ - echo "" ; \ - echo "Your original mail follows:" ; \ - echo "------------------------------------------------------------" ; \ - formail <$REPORTMAIL - - JUNK=`rm -f $REPORTMAIL` - - LOCKFILE - - # Now ship off the mail to sendmail - :0 - ! -oi -t -} - -# If the mail wasn't directly to $OLDLOGIN, it is mail from a -# mailing list, so don't send a correction notice, - -#### Mailing list mail #### - -:0 E -* MAILLIST ?? (forward|report|bounce|remove|change) -* $!^X-Loop: $LOGNAME@$HOST -{ - - # Both change and remove require some mailing list heuristics - # Use common code for this - :0 - * MAILLIST ?? (change|remove) - { - # get common header definitions - INCLUDERC=headers.rc - - # Try to determine the mailer address - INCLUDERC=list-addr.rc - - # ***** NOT YET IMPLEMENTED ***** - - } - - :0c - * MAILLIST ?? report - { - LOCKFILE=tmp.mail.lock - :0 chw # save a copy of the headers - | sed -en '1,/^[ ]*$/s/^/ /p' >tmp.mail - - :0 fhw # generate report header to Postmaster - | formail -I"From: Mailer-Daemon <mailer-daemon>" \ - -I"To: $POSTMASTER" \ - -I"Subject: Mailing list mail to old address: $OLDLOGIN" \ - -I"X-Loop: $LOGNAME@$HOST" - - :0 afbwi # make a report - | echo "Mail is still being sent to $OLDLOGIN indirectly, possibly" ; \ - echo "through a mailing list. The headers of the mail are supplied " ; \ - echo "below." ; \ - echo "" ; \ - echo "------------------- Original mail headers ------------------" ; \ - cat tmp.mail - - LOCKFILE - - :0 aw # file the report - ! -oi -t - } - - # forward it if NEWADDR defined, and MAILLIST includes "forward" - :0 - * MAILLIST ?? forward - * NEWADDR ?? . - { # Add new headers indicating the forwarding - :0 fhw - | formail -A"X-Loop: $LOGNAME@$HOST" \ - -i"Resent-From: $OLDADDR" \ - -i"Resent-To: $NEWADDR" - :0 aw - ! $NEWADDR - } - - # Otherwise, assume a drop - :0 - /dev/null - -} diff --git a/src/procmail/date.rc b/src/procmail/date.rc @@ -1,485 +0,0 @@ -# date.rc -# -# Copyright (C) 1995 Alan K. Stebbens <aks@sgi.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# $Id: date.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# Procmail recipe to extract and create some variables related to -# the date in the message. If the message has no date reference, -# either the variables are returned undefined, or set using the -# current date depending upon DATE_DEFAULT_NOW. - -# Currently, this recipe file parses dates with these formats: -# -# 1. Tue(sday), 31 Dec 96 -# 2. Tue, 31 Dec 1996 -# 3. 12/31/96 -# 4. Tuesday, December 31, 1996 -# -# If DATE is not defined, then obtain the date from the current input message -# from the following headers, in decreasing priority: Resent-Date:, Date:, -# and "From ". -# -# If DATE is defined, it is simply used as the input. -# -# Thus to parse the date from the current mail message do this: -# -# DATE INCLUDERC=date.rc -# -# To make this even easier, use "get-date.rc": -# -# INCLUDERC=get-date.rc -# -# To parse a given date string, simply set DATE: -# -# DATE=12/31/96 INCLUDERC=date.rc -# -# -# These variables are set from the parsing of DATE: -# -# DATE # the original, complete date string from which -# # all other variables were derived -# DATE_WEEKDAY # the weekday name, if present -# DATE_WDAY # the short weekday name, if present -# DATE_DAY # the day of the month (eg: 1) -# DATE_DAY2 # the day of the month with two digits: (eg: 01) -# DATE_MONTH # the month of the year -# DATE_MONTH2 # the month of the year with two digits: (eg: 01) -# DATE_MONTHNAME # the long name of the month (eg: December) -# DATE_MONTHABBR # the abbreviated name of the month (eg: Dec) -# DATE_YEAR # the four-digit year (eg: 2001) -# DATE_YEAR2 # the last two digits of the year (eg: 96) -# -# DATE_MMDDYY # the date as MM/DD/YY (use DATE_SEP1 as separator) -# DATE_MMDDYYYY # the date as MM/DD/YYYY -# DATE_YYMMDD # the date as YY/MM/DD (use DATE_SEP1 as separator) -# DATE_YYYYMMDD # the date as YY/MM/DD (use DATE_SEP1 as separator) -# DATE_DDMMMYY # the date as DD MMM YY (use DATE_SEP2 as separator) -# DATE_DDMMMYYYY # the date as DD MMM YYYY -# -# DATE_UNIX # the date as WDAY, DD MMM YYYY (ala `date`) -# DATE_LONG # the date as WEEKDAY, MMMMM DD, YYYY -# DATE_DEC # the date as DD-MMM-YYYY -# DATE_MMMDDYYYY # the date as MMMMM DD, YYYY -# DATE_TIME # the date/time in `date` format: Fri Oct 11 12:52:48 PDT 1996 -# DATE_CTIME # the date/time in "ctime" format: Fri Sep 13 00:00:00 1986 -# -# DATE_SEP1 # the character used to separate digits/letters of -# # MMDDYY or YYMMDD -# DATE_SEP2 # the character used to separate DDMMMYY -# -# TIME # the orininal string from which the time variables -# # were derived. -# TIME_HOURS # hours (as given) -# TIME_HOURS2 # hours in 2 digits (as given) (eg: 01) -# TIME_HOURS12 # hours modulo 12 -# TIME_HOURS24 # military hours [00-23] -# TIME_MINS # minutes (eg: 34) -# TIME_SECS # seconds (eg: 56) -# TIME_AMPM # 'am' or 'pm' -# TIME_ZONE # The timezone JST, EST, EDT, etc. -# -# TIME_MILITARY # hhmm (0000-2359) eg: 0630 -# TIME_HHMM # hh:mm (eg: 12:03) -# TIME_HHMMSS # hh:mm:ss (eg: 12:03:45) -# TIME_12 # hh:mm am/pm -# TIME_24 # hh:mm (military style) -# -# These variables are used within date.rc but will not return -# meaningful values. -# -# DAYS_RE MONTHS_RE S Y N NN APM ZONE X D - -DAYS_RE='(Mon|Tues?|Wed(nes)?|Thu(rs)?|Fri|Sat(ur)?|Sun)(day)?' -MONTHS_RE='(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|June?|\ -July?|Aug(ust)?|Oct(ober)?|(Sept?|Nov|Dec)(ember)?)' -S='[/-,. ]+' -Y='[0-9][0-9][0-9][0-9]' -N='[0-9]+' -NN='[0-9][0-9]' -APM='[ap]m' -ZONE='([-+][0-9][0-9][0-9]( GMT)?|[PMCE][SD]T([45678][PMCE]DT)?|JST)' - -:0 -* ! DATE ?? . -{ :0 - * ^Resent-Date: *\/[^ ].* - { DATE=$MATCH } - :0 E - * ^Date: *\/[^ ].* - { DATE=$MATCH } - :0 E - * ^From *[^ ]+ +\/[^ ].* - { DATE=$MATCH } -} - -:0 -* ! DATE ?? . -* DATE_DEFAULT_NOW ?? . -{ DATE=`date` } - -# If there is a date to work with, let's begin to parse it -:0 -* DATE ?? . -{ # First, look for a weekday, and extract it - :0 - * $ DATE ?? ()\/$DAYS_RE - { DATE_WDAY=$MATCH - # See if the day was abbreviated or long - :0 - * DATE_WDAY ?? day - { DATE_WEEKDAY=$DATE_WDAY # get the long day name - # And, extract the short version from it - :0 - * DATE_WEEKDAY ?? ^\/... - { DATE_WDAY=$MATCH } - } - :0 E # okay, it was a short name - { :0 - * DATE_WDAY ?? Tue - { DATE_WEEKDAY=Tuesday } - :0 E - * DATE_WDAY ?? Wed - { DATE_WEEKDAY=Wednesday } - :0 E - * DATE_WDAY ?? Thu - { DATE_WEEKDAY=Thursday } - :0 E - * DATE_WDAY ?? Sat - { DATE_WEEKDAY=Saturday } - :0 E - { DATE_WEEKDAY=${DATE_WDAY}day } - } - } - - # Here's where we parse the date - :0 # MM/DD/YYYY? - * $ DATE ?? ()\/$N$S$N$S$Y - { X=$MATCH - :0 - * $ X ?? ()\/$N - { MM=$MATCH } - :0 - * $ X ?? $N$S\/$N - { DD=$MATCH } - :0 # try YYYY first - * $ X ?? $S\/$Y - { YYYY=$MATCH } - :0 E - * $ X ?? $N$S$N$S\/$N - { YY=$MATCH } - } - :0 E # YYYY/MM/DD? - * $ DATE ?? ()\/$Y$S$N$S$N - { X=$MATCH - :0 - * $ X ?? ()\/$Y - { YYYY=$MATCH } - :0 - * $ X ?? $Y$S\/$N - { MM=$MATCH } - :0 - * $ X ?? $Y$S$N$S\/$N - { DD=$MATCH } - } - :0 E # MM/DD/YY or YY/MM/DD? - * $ DATE ?? $N$S$N$S$N - { X=$MATCH - :0 - * $ X ?? ()\/$N - { MM=$MATCH } - :0 - * $ X ?? $N$S\/$N - { DD=$MATCH } - :0 - * $ X ?? $N$S$N$S\/$N - { YY=$MATCH } - - # Use heuristics to determine of MM/DD/YY or YY/MM/DD - # If MM > 12, it must be YY - :0 E - * MM ?? ^([2-9][0-9]|1[3-9]) - { X=$YY YY=$MM MM=$DD DD=$X X } # swap formats - } - :0 E # is it DD MMM YYYY ? - * $ DATE ?? ()\/$N$S$MONTHS_RE$S$N - { X=$MATCH - :0 - * $ X ?? ()\/$N - { DD=$MATCH } - :0 - * $ X ?? ()\/$MONTHS_RE - { MMM=$MATCH } - :0 # first try matching YYYY - * $ X ?? ()\/$Y - { YYYY=$MATCH } - :0 E # ok, use YY, but don't match the first pair - * $ X ?? $N.*$S\/$N - { YY=$MATCH } - } - :0 E # YYYY MMM DD? - * $ DATE ?? ()\/$Y$S$MONTHS_RE$S$N - { X=$MATCH - :0 - * $ X ?? ()\/$Y - { YYYY=$MATCH } - :0 - * $ X ?? ()\/$MONTHS_RE - { MMM=$MATCH } - :0 - * $ X ?? $Y$S.*$S\/$N - { DD=$MATCH } - } - :0 E # MMM DD, YYYY? - * $ DATE ?? ()\/$MONTHS_RE$S$N$S$Y - { X=$MATCH - :0 - * $ X ?? ()\/$MONTHS_RE - { MMM=$MATCH } - :0 - * $ X ?? ()\/$N - { DD=$MATCH } - :0 - * $ X ?? ()\/$Y - { YYYY=$MATCH } - } - # Okay, this might be a Unix date: MMM DD HH:MM:SS ZONE YEAR - # So, test the parts individually - :0 E # MMM DD ... YYYY? - * $ DATE ?? $MONTHS_RE$S$N.*$Y - { :0 # MMM DD? - * $ DATE ?? ()\/$MONTHS_RE$S$N - { X=$MATCH - :0 # get the month name - * $ X ?? ()\/$MONTHS_RE - { MMM=$MATCH } - :0 # get the day - * $ X ?? ()\/$N - { DD=$MATCH } - :0 E - { DD='??' } - } - :0 # is there a year? - * $ DATE ?? ()\/$Y - { YYYY=$MATCH } - } - - # Now match for any time - :0 # hh:mm(:ss) (a/pm) (+700 | pdt/pst...) - * $ DATE ?? ()\/$N:$NN(:$NN)?($S$APM)?($S$ZONE)? - { TIME=$MATCH # get any time string - # clear these variables - TIME_HOURS TIME_HOURS2 TIME_MINS TIME_SECS TIME_AMPM TIME_HOURS24 - :0 # get the hours - * $ TIME ?? ()\/$N - { TIME_HOURS=$MATCH TIME_HOURS2=$MATCH - :0 - * TIME_HOURS2 ?? ^.$ - { TIME_HOURS2=0$TIME_HOURS } - } - :0 - * $ TIME ?? $N:\/$NN - { TIME_MINS=$MATCH } - :0 - * $ TIME ?? $N:$NN:\/$NN - { TIME_SECS=$MATCH } - :0 - * $ TIME ?? ()\/$APM - { TIME_AMPM=$MATCH - :0 # if 01..09,10,11 pm? - * TIME_AMPM ?? pm - * TIME_HOURS ?? (0?[1-9]|1[01]) - { TIME_HOURS24=`expr $TIME_HOURS + 12` } - :0 E # if 12 am? - * TIME_AMPM ?? am - * TIME_HOURS ?? 12 - { TIME_HOURS24=00 } - TIME_HOURS12=$TIME_HOURS - } - # no AM/PM, create HOURS24, HOURS12 - :0 E # given time >= 13? - * TIME_HOURS ?? (1[3-9]|2.) - { TIME_HOURS24=$TIME_HOURS TIME_HOURS12=`expr $TIME_HOURS - 12` } - :0 E # no am/pm, and time < 12 - { TIME_HOURS24=$TIME_HOURS TIME_HOURS12=$TIME_HOURS } - - :0 # now, check for time zone - * $ TIME ?? ()\/$ZONE - { TIME_ZONE=$MATCH } - - # Create the remaining derived vars - TIME_HHMM="$TIME_HOURS:$TIME_MINS" - TIME_HHMMSS=$TIME_HHMM:${TIME_SECS:-00} - TIME_MILITARY=$TIME_HOURS24$TIME_MINS - } - X T # clear the variables we used - - # We now have three parts: MM or MMM, DD, and YY or YYYY. - - # If we have MMM, convert to MM (which will later be converted back to MMM) - :0 # is MMM defined? - * MMM ?? . - { :0 # is it the long name? - * MMM ?? ^.... - { DATE_MONTHNAME=$MMM - :0 # extract the abbreviation - * MMM ?? ^\/... - { DATE_MONTHABBR=$MATCH } - MM # clear MM - } - :0 E # nope, it must be an abbreviation - * MMM ?? Jan - { MM=01 } - :0E - * MMM ?? Feb - { MM=02 } - :0E - * MMM ?? Mar - { MM=03 } - :0E - * MMM ?? Apr - { MM=04 } - :0E - * MMM ?? May - { MM=05 } - :0E - * MMM ?? Jun - { MM=06 } - :0E - * MMM ?? Jul - { MM=07 } - :0E - * MMM ?? Aug - { MM=08 } - :0E - * MMM ?? Sep - { MM=09 } - :0E - * MMM ?? Oct - { MM=10 } - :0E - * MMM ?? Nov - { MM=11 } - :0E - * MMM ?? Dec - { MM=12 } - MMM # clear MMM - } - - # If we have MM, convert to MMM - :0 - * MM ?? . - { :0 # check on leading zero - * MM ?? ^0?\/[0-9]$ - { DATE_MONTH=$MATCH - DATE_MONTH2=0$MATCH - } - :0 E - { DATE_MONTH2=$MM DATE_MONTH=$MM } - MM=$DATE_MONTH - # Now, convert MM -> DATE_MONTHNAME - :0 - * MM ?? 10 - { DATE_MONTHNAME=October } - :0E - * MM ?? 11 - { DATE_MONTHNAME=November } - :0E - * MM ?? 12 - { DATE_MONTHNAME=December } - :0E - * MM ?? 1 - { DATE_MONTHNAME=January } - :0E - * MM ?? 2 - { DATE_MONTHNAME=February } - :0E - * MM ?? 3 - { DATE_MONTHNAME=March } - :0E - * MM ?? 4 - { DATE_MONTHNAME=April } - :0E - * MM ?? 5 - { DATE_MONTHNAME=May } - :0E - * MM ?? 6 - { DATE_MONTHNAME=June } - :0E - * MM ?? 7 - { DATE_MONTHNAME=July } - :0E - * MM ?? 8 - { DATE_MONTHNAME=August } - :0E - * MM ?? 9 - { DATE_MONTHNAME=September } - MM # clear MM - } - # Set the month abbreviation - :0 - * DATE_MONTHNAME ?? ^\/... - { DATE_MONTHABBR=$MATCH } - - # Now check on the day - :0 - * DD ?? ^0?\/[0-9]$ - { DATE_DAY=$MATCH DATE_DAY2=0$MATCH } - :0 E - { DATE_DAY=$DD DATE_DAY2=$DD } - DD # clear DD - - # Now check on the year: if YYYY is not available, use YY - YYYY=${YYYY:-$YY} - YY # clear YY - - # If YYYY only has two digits, derive the current year - :0 - * YYYY ?? ^..$ - { YYYY=`date +%Y | sed -e 's/..$/'$YYYY'/'` } - - DATE_YEAR=$YYYY - YYYY # clear YYYY - - :0 # get the last two digits of the year - * DATE_YEAR ?? ^..\/.. - { DATE_YEAR2=$MATCH } - - SEP1=${DATE_SEP1:-'/'} - SEP2=${DATE_SEP2:-' '} - - # Now, setup the formatted strings - DATE_MMDDYY="$DATE_MONTH2$SEP1$DATE_DAY2$SEP1$DATE_YEAR2" - DATE_MMDDYYYY="$DATE_MONTH2$SEP1$DATE_DAY2$SEP1$DATE_YEAR" - YYMMDD="$DATE_YEAR2$SEP1$DATE_MONTH2$SEP1$DATE_DAY2" - YYYYMMDD="$DATE_YEAR$SEP1$DATE_MONTH2$SEP1$DATE_DAY2" - DATE_DDMMMYY="$DATE_DAY2$SEP2$DATE_MONTHABBR$SEP2$DATE_YEAR2" - DATE_DDMMMYYYY="$DATE_DAY2$SEP2$DATE_MONTHABBR$SEP2$DATE_YEAR" - DATE_MMMDDYYYY="$DATE_MONTHNAME $DATE_DAY, $DATE_YEAR" - DATE_UNIX="$DATE_WDAY, $DATE_DAY$SEP2$DATE_MONTHABBR$SEP2$DATE_YEAR" - DATE_LONG="$DATE_WEEKDAY, $DATE_MONTHNAME $DATE_DAY, $DATE_YEAR" - DATE_TIME="$DATE_WDAY $DATE_MONTHABBR $DATE_DAY2 $TIME_HHMMSS" - DATE_CTIME="$DATE_WDAY $DATE_MONTHABBR $DATE_DAY2 $TIME_HOURS24:$TIME_MINS:${TIME_SECS:-00}" - :0 - * TIME_AMPM ?? . - { DATE_TIME="$DATE_TIME $TIME_AMPM" } - :0 - * TIME_ZONE ?? . - { DATE_TIME="$DATE_TIME $TIME_ZONE" DATE_CTIME="$DATE_CTIME $TIME_ZONE" } - DATE_TIME="$DATE_TIME $DATE_YEAR" - DATE_CTIME="$DATE_CTIME $DATE_YEAR" -} diff --git a/src/procmail/dupcheck.rc b/src/procmail/dupcheck.rc @@ -1,222 +0,0 @@ -# dupcheck.rc -# -# Copyright (C) 1997 Alan K. Stebbens <aks@sgi.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# Usage: -# -# INCLUDERC=dupcheck.rc -# -# If the current mail has a "Message-Id:" header, run the -# mail through "formail -D", causing duplicate messages to -# be dropped. -# -# If the mail does not have a "Message-Id", or if the variable -# "dupcheck_use_md5" is set, then run the body through MD5SUM (defaults -# to "md5sum"), causing duplicate messages to be dropped. However, -# even if "dupcheck_use_md5" is set, the "formail -D" filter will -# still be applied if a Message-Id: exists. -# -# Currently, the only way to use *only* an "md5sum" duplicate check -# is to remove the Message-Id: before invoking this recipe file. -# Something like this: -# -# :0fh # remove the Message-Id: -# | formail -IMessage-Id: -# INCLUDERC=dupcheck.rc -# -# In my opinion, however, an MD5 checksum should be used in addition to using -# the Message-Id:, not instead of. The MD5 checksums can be used to -# detect and avoid redistributed or resent messages. -# -# The variable MD5SUM can be set to the program to perform the checksum -# on the message body. By default, it is set to "md5sum". -# -# This recipe has been enhanced with a "fail-safe" algorithm to avoid -# losing mail which has been "soft-failed" by some later part of the -# user's recipe file. This algorithm is only applied if the variable -# "dupcheck_failsafe" has been set to the number 1 or 2. -# -# There are two methods available to accomplish this, and selected by -# the variable "dupcheck_failsafe". -# -# 1. the simple way: remove the checksum files when procmail exits with -# an exitcode of 75. This is done by using a TRAP command. -# -# The disadvantage is that when any mail "soft fails" for any -# reason, duplicate mail arriving after the soft-failure for mail -# originally received before the soft-failure will not be detected. -# -# An advantage of this method is its simplicity. The worst case is -# that a few duplicates may not be detected. -# -# 2. the hard way: using an additional "pending" log file, when a new -# mail arrives and passes the checksum filters the first time, add it -# to the "pending" file. Using a TRAP command, remove the processed -# mail from the "pending" file, unless the exitcode was 75 -# (EX_TEMPFAIL). If the mail fails the checksum commands, but is -# still in the pending file, then do NOT drop the mail as a -# duplicate, and leave it in the pending file. Eventually, when the -# mail is finally delivered (by any means), it will be removed from -# the "pending" file. -# -# The disadvantage with this method is its complexity: an additional -# "pending" file is needed, and there is a small performance hit for -# each mail, in order to maintain the pending file. -# -# The advantage of this method is its completeness: all duplicates -# will still be detected and dropped. -# -# Both methods require the use of the TRAP command; they set additional -# commands into the TRAP variable. If the TRAP command has already been -# set, the new commands are added to the list of commands. -# -# *** Warning: if the user sets the TRAP command in a later recipe, care -# should be taken to avoid losing the commands installed by this recipe. -# The way to set TRAP with a new command, without losing the existing -# ones, if any is: -# -# TRAP="${TRAP:+${TRAP}; }new-command args ..." -# -# All the default filenames used by this recipe are relative to the -# current directory, $MAILDIR. - -msgids=.msgids # where we keep the message id's -md5sums=.md5sums # where the md5 checksums go -pendingids=.pendingids # pending mail cache - -dupcheck_failsafe=${dupcheck_failsafe:-2} - # set to 1, 2, or anything else, - # to indicate which method is - # preferred. Defaults to 2. - # If unset or not 1 or 2, then *no - # failsafe* method is applied. - -OLDCOMSAT=${COMSAT:-off} # Don't tell COMSAT anything -COMSAT=off - -# To keep the complexity of this recipe down, we'll separate the -# failsafe methods - -:0 # methods 1 or 0 (none) -* !dupcheck_failsafe ?? ^^2^^ -{ - :0 Wh: $msgids.lock # is there a Message-Id:? - * ^Message-Id: *\/[^ ].* - | formail -D 16384 $msgids - # mail is not a duplicate.. - :0 e # passed formail's check; failsafe it? - * dupcheck_failsafe ?? 1 - { TRAP="${TRAP:+${TRAP}; }test \$EXITCODE -eq 75 && rm -f $msgids" } - - :0 # derive a checksum if needed or requested - * 1^0 !^Message-Id: - * 1^0 dupcheck_use_md5 ?? . - { :0 b # scan only the body - MD5SUM=|${MD5SUM:-md5sum} # compute md5sum on the body - - LOCKFILE=$md5sums.lock # lock $md5sums - :0 aWhi # see if this is a duplicate message - |fgrep -s "$MD5SUM" $md5sums # if fgrep succeeds, we've tossed the mail - # Hurray! The mail is not a duplicate! - :0 echi # add the new checksum to the file - |echo "$MD5SUM" >>$md5sums - LOCKFILE # unlock $md5sums - - :0 # see if the msg already has a header - * ^X-MD5-Checksum: \/[^ ].* - * $? test "$MD5SUM" != "$MATCH" - { insert_opt='i' } # save the old flags on mismatch - :0 fh # insert (or replace) current checksum - |formail -${insert_opt:-'I'}"X-MD5-Checksum: $MD5SUM" - :0 # any failsafe? - * dupcheck_failsafe ?? 1 - { TRAP="${TRAP:+${TRAP}; }test \$EXITCODE -eq 75 && rm -f $md5sums" } - } -} -:0 E # fail-safe method 2: -* dupcheck_failsafe ?? ^^2^^ -{ # With method 2, we must maintain a file of "pending" mail using this - # recipe and a command in the TRAP variable. - - :0 chi:$pendingids.lock # ensure that the pending cache is writable - * !?test -w $pendingids - | rm -f $pendingids ; touch $pendingids - - pending # clear var - LOCKFILE=$pendingids.lock # lock $pendingids - # If there's a Message-Id and the mail is not pending - :0 # is there a message-id? - * ^Message-Id: *[^ ]\/.* - { MSGID=$MATCH # save for later - :0 # see if pending - * $!?fgrep -s '$MATCH' $pendingids - { :0 Wh:$msgids.lock # see if the mail is a duplicate - |formail -D 16384 $msgids - - :0 chi # it's not; update the pending cache - |echo "$MSGID" >>$pendingids - - } - :0 E # it is a pending mail - { pending=y } # mark it so - # Update the TRAP command list to remove the msgid from the - # pending cache on normal exits - TRAP="${TRAP:+${TRAP}; }\ - if test \$EXITCODE -ne 75 ; then \ - fgrep -v '$MSGID' $pendingids >$pendingids.new ; \ - mv $pendingids.new $pendingids ; \ - fi" - } - LOCKFILE # unlock $pendingids - - # if not already pending, derive a checksum if needed or requested - :0 - * 1^0 !^Message-Id: - * 1^0 dupcheck_use_md5 ?? . - { :0 b # checksum the desired headers and body - MD5SUM=|${MD5SUM:-md5sum} # see if this is a duplicate message - LOCKFILE=$pendingids.lock # check the pending cache - :0 # make sure it's not pending - * ! pending ?? y - * $!?fgrep -s '$MD5SUM' $pendingids - { :0 Whi:$md5sums.lock # see if mail is an MD5 duplicate - |fgrep -s "$MD5SUM" $md5sums - # Hurray! the mail is not a duplicate - :0 chi: # add the new checksum to the file - |echo "$MD5SUM" >>$md5sums - :0 achi # update the pending cache - |echo "$MD5SUM" >>$pendingids - } - LOCKFILE # maybe pending now - # Either we've updated the pending file, or the checksum was - # already in it. So, now we update the TRAP command list to - # remove the checksum on normal exits. - TRAP="${TRAP:+${TRAP}; }\ - if test \$EXITCODE -ne 75 ; then \ - fgrep -v '$MD5SUM' $pendingids >$pendingids.new ; \ - mv $pendingids.new $pendingids ; \ - fi" - :0 # see if the msg already has a header - * ^X-MD5-Checksum: \/[^ ].* - * $? test "$MD5SUM" != "$MATCH" - { insert_opt='i' } # save old headers on mismatch - :0 fh # in any case, set the new checksum - |formail -${insert_opt:-'I'}"X-MD5-Checksum: $MD5SUM" - } # end md5 check -} -COMSAT=$OLDCOMSAT # set COMSAT back to original value -OLDCOMSAT diff --git a/src/procmail/eg.spam-bounce-w-threshold.rc b/src/procmail/eg.spam-bounce-w-threshold.rc @@ -1,44 +0,0 @@ - SPAMSITES='(spam.com|foo.org|blah.com)' # sites to check - MAXFROM=10 # more than 10 mails/day from - :0 # check for mail from a spam site - * $ ^(From|Sender:|Reply-To:).*@.*$SPAMSITES - { # ok -- mail is from a possible spam site -- check # of occurances - FROM=`formail -rtzxTo:` # get the best from - DATE=`date +%Y%m%d` # get YYYYMMDD - SUBJ=`formail -zxSubject:` # get the subject - FROMLOG=from.log # logfile of FROM addresses - :0ci: # log this message - | echo "$FROM $DATE : $SUBJ" >>$FROMLOG - # Find out how many message have been received today - COUNT=`fgrep -c "$FROM $DATE" $FROMLOG` - :0 # see if we've received too many - * $ -$MAXFROM^0 - * $ $COUNT^0 - { # count was exceeded - generate a reply - :0 # clean up the subject - * SUBJ ?? Re: *\/[^ ].* - { SUBJ=$MATCH } - :0 fh # generate a reply header - * $ !^X-Loop: *$LOGNAME@$HOST - | formail -rt -I"From: ($LOGNAME's Mail-Agent) $LOGNAME" \ - -I"Subject: Re: $SUBJ" \ - -I"Precedence: junk" \ - -I"X-Loop: $LOGNAME@$HOST" - :0 afb # generate a reply body - | echo "Your message is being returned because you've sent me" ; \ - echo "too many message today. Your original message follows:" ; \ - cat - - :0 a # send it off - ! -t - :0 E # no reply generated - error.log # keep an error log - } - # mail count is okay, forge on - } - # normal mail processing follows - -The recipe works by keeping a log of all recieved mail, with a -single line of "$FROM $DATE : $SUBJ" being appended to the log file. -Then, if the number of lines with the "$FROM $DATE" string exceeds -a threshold, a reply is generated. If any error in the reply, or -if a mail loop is detected, file the mail to "error.log". diff --git a/src/procmail/gen-spam-reply.rc b/src/procmail/gen-spam-reply.rc @@ -1,94 +0,0 @@ -# gen-spam-reply.rc -# -# Copyright (C) 1997 Alan K. Stebbens <aks@sgi.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# $Id: gen-spam-reply.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# This is a sample procmail rc file which can be used -# to generate an automatic response to mail which has -# somehow been identified as being a source of spam. -# -# If the variables ADDR, TOADDR, or REGEXP match, then -# current message, then a response is generated to the -# originator of the message, stating that something about -# the message had been identified as a source of spam. -# The original message is returned as part of the response. -# -# -# This recipe file does not set the policy by which a -# "spam site" is selected, it merely implements whatever -# policy the user has chosen. -# -# Use this "subroutine" recipe file as follows: -# -# Set one or more of the following variables: -# -# ADDR=some-spam-source-address -# TOADDR=some-noisy-mailing-list -# REGEXP=a-regexp-which-matches-a-spam-mail -# INCLUDERC=gen-spam-reply.rc -# -# -# Our handy FROM_DOMAIN variable. If you *know* that this recipe will -# always have FROM_DOMAIN defined already, then you don't need to define -# it again. But, I've put it here, so that the recipe file can stand -# on its own and is more understandable. -# -# See "headers.rc" for a collection of header regexps. -# -:0 # pull in handy headers file, if needed -* ! HEADERS_RC ?? . -{ INCLUDERC=headers.rc } - -# See if the mail came by any source address from $ADDR -spam # flag to maybe set -:0 # ADDR set and matches? -* ADDR ?? . -* $${FROM_DOMAIN}${ADDR}\> -{ spam=1 } -:0 # TOADDR set and matches? -* TOADDR ?? . -* $^TO$TOADDR -{ spam=1 } -:0 # REGEXP set and matches? -* REGEXP ?? . -* $$REGEXP -{ spam=1 } -:0 # is the mail spam? -* spam ?? . -{ # yes, generate a reply header - SUBJ=`formail -zXSubject: | tr -d '"'` # get the subject (without quotes) - - :0 fhw # generate a reply header - | formail -rt -I"Subject: Re: $SUBJ" \ - -I"Precedence: junk" \ - -I"X-Loop: $LOGNAME@$HOST" - :0 afb # form the reply body - | echo "\ -Email from your site is being shunned because something about\n\ -it has been identified as a source of spam. If your mail\n\ -was, in fact, not spam, please resend it using the\n\ -keyword 'not-spam' in the subject. Unsolicited commercial\n\ -use of this mailbox will be billed at $500 per incident.\n\ -\n\ -Your original email follows:\n\ -----------------------------------------------------------" ; \ - cat - - - :0 a # now feed the reply to sendmail - ! -oi -t -} diff --git a/src/procmail/get-date.rc b/src/procmail/get-date.rc @@ -1,8 +0,0 @@ -# get-date.rc -# -# See date.rc for Copyright info. -# -# $Id: get-date.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -DATE -INCLUDERC=date.rc diff --git a/src/procmail/get-from.rc b/src/procmail/get-from.rc @@ -1,46 +0,0 @@ -# get-from.rc -- procmail rc file to get the "best" from address -# -# Sets FROM and FRIENDLY, the latter being the "friendly" user name -# sans any address. -# -# $Id: get-from.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# Copyright (C) 1995 Alan K. Stebbens <aks@sgi.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# Get the best FROM -:0 -* ! ^Reply-to: *\/[^ ].* -* ! ^From: *\/[^ ].* -* ! ^Sender: *\/[^ ].* -* ! ^From +\/[^ ]+ -* ! ^X-Envelope: *\/[^ ].* -{ FROM=nobody } -:0E -{ FROM=$MATCH } - -# Get the "friendly" name part of the address, by -# 1. removing any bracketed address part, -# 2. removing any unbracketed address part, -# 3. unquoting any text -# 4. unparenthesizing any text -FRIENDLY=`echo $FROM | sed -e 's/ *<.*> *//' \ - -e 's/ *[^ ][^ ]*[\@\!][^ ][^ ]* *//' \ - -e 's/"\(.*\)"/\1/' \ - -e 's/(\(.*\))/\1/'` -FRIENDLY=${FRIENDLY:-$FROM} - diff --git a/src/procmail/guess-mua.rc b/src/procmail/guess-mua.rc @@ -1,48 +0,0 @@ -# guess-mua.rc -# -# Guess the Mail User Agent and set MUA -# -# $Id: guess-mua.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# Copyright (C) 1995 Alan K. Stebbens <aks@sgi.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# First, let's check for MH - -# Make sure it's not already defined -:0 -* MUA ?? !.+ -{ - # See if mhpath works - MHPATH=`mhpath + 2>/dev/null` - - :0 - * MHPATH ?? .+ - { MUA=mh } - - # Else, see if ~/.pinerc works - :0 E - * test -f $HOME/.pinerc - { MUA=pine } - - # Else, check for ~/.mailrc (for BSD/mail) - :0 E - * test -f $HOME/.mailrc - { MUA=mail } - - # Add others as they are needed.. -} diff --git a/src/procmail/headers.rc b/src/procmail/headers.rc @@ -1,100 +0,0 @@ -# procmail rc to define patterns to recognize the headers -# -# $Id: headers.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# Copyright (C) 1995 Alan K. Stebbens <aks@sgi.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# Use these is recipes like this: -# -# # If mail is from john or mary, then file in "+urgent" -# :0 -# * $ $FROM(john|mary)@ -# urgent/. -# -# # if the mail is directly to me, then file it -# :0 -# * $ $TO($USER)@ -# mymail/. -# -# # See which list this mail is from: -# :0 -# * $ $FROM_LIST_MAILER -# { LISTADDR=$MATCH } - - - # These patterns span any comment text before and after email addresses - # Use PRE_ADDR_SPAN before any names; it will span a string of non-address - # characters up to the beginning of a valid email address. - -PRE_ADDR_SPAN='(.*[^-(.%@a-zA-Z0-9])?' - - # Use POST_ADDR_SPAN after any names; it will span a string of non-address - # characters up to the a comma "," or the end of the line - -POST_ADDR_SPAN='(([^),.!:a-zA-Z0-9].*)?(,|$[^>]))' - - # These are to match RFC822 style addresses (not including UUCP addresses) - # Use $USERADDR to match a user name part of an email address - -USERADDR='[-a-zA-Z0-9_:.+=/]+' - - # Use $HOSTADDR to match the FQDN hostname part of an address - -HOSTADDR='[-a-zA-Z0-9_:.+=/]+' - - # Use $HOSTNAME to match the "plain" hostname (not include any domains) - -HOSTNAME='[-a-zA-Z0-9_:+=/]+' - - # Use $ADDR to match either an RFC 822 or UUCP email address - -ADDRESS="<?($USERADDR(@$HOSTADDR)?|($HOSTADDR!)+$USERADDR)>?" - - # Use $FROM to match mail from someone - -FROM="(^((Reply-To|(Resent-)?(From|Sender)|X-Envelope-From):|>?From )\ -$PRE_ADDR_SPAN)" - - # Use $TO to match mail to someone (but only "To:", not "Cc:") - -TO="(^((Original-)?(Resent-)?To|(X-Envelope|Apparently(-Resent)?)-To):\ -$PRE_ADDR_SPAN)" - - # Use $CC to match mail to someone (but only "Cc:", not "To") - -CC="(^((Original-)?(Resent-)?Cc|(X-Envelope|Apparently(-Resent)?)-Cc):\ -$PRE_ADDR_SPAN)" - - # For completeness, this should be roughly equivalent to ^TO - -TOCC="($TO|$CC)" - - # Pattern to recognize lists by precedence - -LIST_PRECEDENCE='(^Precedence:.*(junk|bulk|list))' - - # Names of common list mailers - # List the more specific mailers first, with generic names later - -LIST_MAILERS="(LISTSERV|ListProc|${USERADDR}-(l(ist)?|request|own[er]r)|\ -owner-${USERADDR}|Majordomo?|Mailagent|mmdf|news|n?uucp|\ -Post(mast(er)?|-?office)|procmail|SmartList|(Mailer-)?daemon|root)" - - # Pattern to put them all together, just to detect mail from a list - -FROM_LIST="($LIST_PRECEDENCE|$FROM$LIST_MAILERS$POST_ADDR_SPAN)" diff --git a/src/procmail/list-addr.rc b/src/procmail/list-addr.rc @@ -1,75 +0,0 @@ -# -# list-addr.rc -# -# Get a mailing list address, if possible. -# - -:0 -* DEBUG ?? . -{ SENDMAIL=true - LOGABSTRACT=all - VERBOSE=yes } - -INCLUDERC=headers.rc - -# There seems to be a new convention to provide sub/unsub info on -# informational headers. The following is an attempt to discover -# if there is any header which contains the patter .*-request. -# If so, it's a good bet that the string is the list request address. - -:0 H -* $\/${USERADDR}-request@$HOSTADDR -{ LISTADDR=$MATCH } - -# Okay, if that didn't work, now we do some heuristic lookups of -# well-known list mailer addresses. - -# However, we must do this carefully, because some mails have the -# "From:" or "Sender:" set to "BLAH-request" or "BLAH-owner", but -# the "From " header has "Daemon" or "Root". The problem is that -# just doing a "^$FROM\/$LIST_MAILERS" will always match the "From " -# header if it was from "root" or "daemon", even though the more -# useful address is on the subsequent "Resent-From:" or "Sender:" -# header. This is why the multi-line condition below - -:0 EH -* $!^Resent-Reply-To:$PRE_ADDR_SPAN\/$LIST_MAILERS@$HOSTADDR -* $!^Resent-Sender:$PRE_ADDR_SPAN\/$LIST_MAILERS$HOSTADDR -* $!^Resent-From:$PRE_ADDR_SPAN\/$LIST_MAILERS$HOSTADDR -* $!^Reply-To:$PRE_ADDR_SPAN\/$LIST_MAILERS$HOSTADDR -* $!^Sender:$PRE_ADDR_SPAN\/$LIST_MAILERS$HOSTADDR -* $!^From:$PRE_ADDR_SPAN\/$LIST_MAILERS$HOSTADDR -* $!^X-Envelope-From:$PRE_ADDR_SPAN\/$LIST_MAILERS@$HOSTADDR -* $!^From $PRE_ADDR_SPAN\/$LIST_MAILERS@$HOSTADDR -{ - :0 - * $ $FROM$LIST_MAILERS@$HOSTADDR - { LISTADDR=$MATCH } -} - -# Cool. We matched one of the headers from above -:0 E -{ LISTADDR=$MATCH } - -# This stuff only happens in DEBUG mode -# ie: procmail -DDEBUG -m list-addr.rc <testmail -# - -:0 -* DEBUG ?? . -{ - :0 - * LISTADDR ?? . - { LOG="List address = $LISTADDR -" } - - :0E - { SENDER=`formail -zxSender:` - :0 - * $ SENDER ?? @\/$HOSTADDR - { ORIGHOST=$MATCH - LOG="Postmaster = Postmaster@$ORIGHOST -" } - } - HOST=bye -} diff --git a/src/procmail/newsgate.rc b/src/procmail/newsgate.rc @@ -1,46 +0,0 @@ -# news-gate procmail recipe file -# -# Take mail and post it as a piece of news, after possibly -# inserting either a header or a trailer to the mail. -# -# The header or trailer only get added if the source address is from -# outside of the SGI domain. -# -# This file should be installed into /etc/procmailrcs, and the -# ownership set to the uid of the login by which the news postings -# will be accomplished. -# - -MAILDIR=/etc/procmailrcs # make this the current directory - -INEWS=/usr/local/bin/inews # or whatever program you have to insert news - -NEWSGROUP=$1 # the argument is the list name - -#LOGFILE=log # uncomment these for debugging -#VERBOSE=yes -#LOGABSTRACT=all - -FROM=`formail -rtzxTo:` # get who the mail is from -USER="[0-9a-zA-Z_.-]+" -HOST="[0-9a-zA-Z_-]+" -DOMS="(corp|engr|asd|nsd|esd|wcs|csd)" - -:0 # is this user not from SGI? -* $! FROM ?? ^^($USER|$USER@$HOST|$USER@($HOST)?$DOMS(\.sgi\.com)?|$USER@sgi\.com)^^ -{ - :0 fh # if header defined, prepend it - * ? test $LIST.header - | cat $LIST.header - - - :0 fh # if trailer defined, append it - * ? test $LIST.trailer - | cat - $LIST.trailer -} - -:0 fh # now do the header manipulation -| formail -R To: Originally-To: -INewsgroups: $NEWSGROUP - -:0 # now post the mail -| $INEWS - diff --git a/src/procmail/pf-check.rc b/src/procmail/pf-check.rc @@ -1,49 +0,0 @@ -# pf-check.rc -# -# $Id: pf-check.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# Procmail recipe file to check if an address is from a given -# address or, if it is from me, if it is *to* that same address. -# -# If the address matches, append DEST to PF_DEST. -# -# After all checks are complete, invoke pf-save.rc to save the -# message into the appropriate folders. See its comments for details. -# -# Clear these variables before invoking the first time: -# -# PF_DEST The destination of all filed mail. -# PF_FROM The derived FROM address. -# -# Set these variables before invoking: -# -# ADDR Address to which addressed mail will be filed -# into the named folder. -# -# DEST Destination into which addressed mail will be -# dropped. -# -# INCLUDERC=pf-check.rc - -:0 -* ADDR ?? . -* DEST ?? . -{ - # Figure out who this mail is from - :0 - * ! PF_FROM ?? . - { PF_FROM=`formail -rtzxTo:` } - - # is this mail from the given $ADDR? - # if so, prefile it - :0 - * $ PF_FROM ?? $ADDR - { PF_DEST="$PF_DEST $DEST" } - - # if not directly from the address, see if it is from me, - # and to the address. - :0 E - * $ PF_FROM ?? ${USER:-$LOGNAME} - * $ ^TO$ADDR - { PF_DEST="$PF_DEST $DEST" } -} diff --git a/src/procmail/pf-chkto.rc b/src/procmail/pf-chkto.rc @@ -1,25 +0,0 @@ -# pf-chkto.rc -# -# $Id: pf-chkto.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# Procmail recipe file to check a To: address ADDR for Mail folder -# filing. If the address matches, append DEST to PF_DEST. -# -# After all checks are complete, invoke pf-save.rc to save the -# message into the appropriate folders. See its comments for details. -# -# Set these variables before invoking: -# -# ADDR Address to which addressed mail will be filed -# into the named folder. -# -# DEST Destination into which addressed mail will be -# dropped. -# -# INCLUDERC=pf-chkto.rc - -:0 -* ADDR ?? . -* DEST ?? . -* $ ^TO$ADDR -{ PF_DEST="$PF_DEST $DEST" } diff --git a/src/procmail/pf-save.rc b/src/procmail/pf-save.rc @@ -1,64 +0,0 @@ -# pf-save.rc -# -# $Id: pf-save.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# Author: Alan K. Stebbens <aks@sgi.com> -# -# Procmail recipe file to save the current message to -# a list of one or more folders set by pf-check.rc. -# -# You may wish to set the variable PF_DEST before invoking. -# -# INCLUDERC=pf-save.rc -# -# If the message is filed into a folder, LOGABSTRACT is -# set to "off" so a duplicate log is not created. - -:0 -* PF_DEST ?? . -{ - - # Add a new X-Filed if necessary - :0 fh - * !^X-Filed: - | formail -A "X-Filed: $PF_DEST" - - # Else, if there is already a header, possibly append to it - :0 E - { - OLD_PF_DEST=`formail -zxX-Filed:` - :0 fh - * $!^X-Filed:.*$PF_DEST - |formail -I"X-Filed: $OLD_PF_DEST $PF_DEST" - } - - # If filing into MH folders, use one copy and procmail will take - # care of linking. - :0 c - * PF_DEST ?? /\.$ - $PF_DEST - - # If not filing into MH folders, use recursive filing - :0 E - { - DEST=`echo $PF_DEST | cut -d' ' -f1` - PF_DEST=`echo $PF_DEST' ' | cut -d' ' -f2-` - - # File into the first folder now - :0 c: - $DEST - - # Possibly file into the 2nd and other folders with recursion - # It must be non-blanks, and not identical to the already filed DEST - :0 c - * PF_DEST ?? [^ ] - * $! DEST ?? $PF_DEST - |procmail -pm PF_RECURSE=yes $PMSRC/pf-save.rc - - # If we were recursing, don't file multiple copies into DEFAULT - :0 - * PF_RECURSE ?? yes - { HOST=_stop_now_ } - } - LOGABSTRACT=off -} diff --git a/src/procmail/pm-jaaddr.rc b/src/procmail/pm-jaaddr.rc @@ -1,484 +0,0 @@ -# pm-jaaddr.rc -- extract 'foo@some.com' email address from variable INPUT -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This includerc extracts the various components of email address -# from variable `INPUT'. You can do quite a lot interesting things with -# your email address. One of the tricks that you could use if you -# don't have sendmail plus addressing capabilities, is that you put -# the additional infomation to the RFC comment. Eg. If you read and -# followup to posts in usenet games groups, you could use: -# -# From: <login@site.com> (John Doe+usenet.games) -# -# Or if your email address's localpart (that's characters before @) -# already signify your First and surname, you don't need to repeat it -# in comment. However, place special marker "+" to mark -# additional information part for your procmail recipes: -# -# From: <first.surname@site.com> (+usenet.games) -# -# The use of RFC comment should work everywhere because RFC requires -# that comments are preserved along with the address information. -# If you would have sendmail plus addressing capabilities you would -# have used: -# -# From: <login+usenet.games@site.com> (John Doe) -# -# The idea is that the list infomation is readily available from -# the email. The following recipe will derive the plus information -# and use it directly as a mailbox where to drop the message. If -# The Editor: Emacs, means anything to you, you can program it -# to generate the appropriate From headers automatically when you -# send mail from Gnus Mail/Newsreader MUA. Drop me a message if -# you need an example how a piece of Emacs lisp code makes those -# magic RFC plus addresses in the background while you compose the -# body of the message. -# -# RC_EMAIL = $PMSRC/pm-jaaddr.rc -# TOME = "(login1|login2)" -# -# :0 -# *$ ^TO\/.*$TOME.* -# { -# INPUT = $MATCH -# INCLUDERC = $RC_EMAIL -# PLUS = $COMMENT_PLUS -# -# # If COMMENT_PLUS was defined, we found "+" -# # address which contain "usenet.games". Save it to -# # folder. -# -# :0 : -# * PLUS ?? [a-z] -# $PLUS -# } -# -# Notes -# -# 1998-05 David Hunt <dh@west.net> also mentioned that "you need to -# remember that some MTAs, (qmail for one, and soon vmail) use a dash -# ( - ) as the subaddress delimiter. So you'll want to allow for that -# in your code". For this reason the email part accepts both -# "-" and "+". The RFC comment however accepts only "+" and "--". -# -# Example input -# -# "From: foo+procmail@this.site.com (Mr. foo)" traditional -# "From: foo-procmail@this.site.com (Mr. foo)" new styled -# -# NOTE: M$SOFT mailers tend to send idiotic smart quotes "'Mr. foo'" -# and this recipe ignores these two quotes ["'] as if message had -# only the standard ["] -# -# Returned values -# -# ADDRESS "foo+procmail@this.site.com" -# containing the email address without <> -# -# ACCOUNT "foo+procmail" -# all characters before @ -# -# ACCOUNT1 "foo" -# characters before plus: account1+account2@site -# Note, if there is no "+", this is same as ACCOUNT. -# -# ACCOUNT2 "procmail" -# _only_ set if plus found: account1+account2@site -# -# SITE "this.site.com" -# all characters after @ -# -# DOMAIN "site.com" -# the main domain, preceding words in site are -# considered subdomain (local) addresses. -# -# sub.sub.domain.net -# -# SUB "this.site" -# all the sub-domain names without the NET part. -# -# SUB1 "site" -# The first subdomain counted from the _RIGHT_ after NET -# -# SUB2 "this" -# Second subdomain. -# -# SUB3 "" -# Third subdomain. -# -# SUB4 "" -# Fourth subdomain. -# -# NET "com" -# last characters after last period ( net,com,edu ...) -# -# COMMENT Anything unside parenthesis (Mr. Foo) or if no -# parentheses found, then anything between quotes -# "Mr. Foo" -# -# COMMENT_PLUS Anything after the "+" in the comment, like -# "Mr Foo+mail.usenet" --> "mail.usenet" -# -# Note: some MTA's don't allow + character, so use -# alternatively '--': -# "Mr Foo--mail.usenet" --> "mail.usenet" -# -# Additionally there is variables DOT1 DOT2, which behave like -# ACCOUNT1 and ACCOUNT2, but in respect to dotted firstname.surname -# type address: -# -# john.doe@site.com -# -# ACCOUNT1 = john.doe -# ACCOUNT2 = <empty> -# DOT1 = john -# DOT2 = doe -# -# If there is plus, the ACCOUNT2 is defined -# -# john.doe+foo@site.com -# -# ACCOUNT1 = john.doe -# ACCOUNT2 = foo -# DOT1 = john (in respect to ACCOUNT1) -# DOT2 = doe (in respect to ACCOUNT1) -# -# -# Variable ERROR is set to "yes" if INPUT wasn't recognized or parsing -# the address failed. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include pm-javar.rc from there. -# -# Call arguments (variables to set before calling) -# -# INPUT = string-to-parse -# -# Usage example -# -# Read From field and address from it. This is lot faster than using -# external `formail' call. -# -# PMSRC = $HOME/pm -# RC_ADDR = $PMSRC/pm-jaaddr.rc -# -# :0 -# * ^From:\/.*@.* -# { -# INPUT = $MATCH -# -# # Turn off the logging while executing this part -# VERBOSE="off" INCLUDERC = $RC_ADDR VERBOSE="on" -# -# :0 -# * ERROR ?? yes -# { -# # Hmm, no std email address found. Any other ideas? -# } -# } -# -# Change Log (none) - -# .................................................... &initialising ... - - -id = " pm-jaaddr.rc" -dummy = " -====================================================================== -$id: init: -" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ..................................................... &output-vars ... -# output variables. Defining them on their own kills them - -ADDRESS - -ACCOUNT -ACCOUNT1 -ACCOUNT2 -DOT1 -DOT2 - -SITE - -DOMAIN -SUB1 -SUB2 -SUB3 -SUB4 - -NET - -COMMENT -COMMENT_PLUS - -ERROR = "yes" # set defualt value - -# ........................................................... &do-it ... -# Check that input is something like: Thu, 13 Nov 1997 - -dummy = "$NL$NL$id: start: Parsing $INPUT $NL" - -charset_jaaddr = "[^$WSPC@(){}&?,;:<>\"']+" - -# ... ... ... ... ... ... ... ... ... ... ... ... ... . catch comment ... - - -dummy = "$NL$id: :::::::::::::::::::::::: COMMENT $NL" - -:0 # Catch anything inside parentheses -* INPUT ?? [(]()\/[^)]+ -{ - COMMENT = $MATCH -} - - - :0 E # Else, Try catching "'Mr. Foo'" in Microsoft smart quotes - * INPUT ?? \"'()\/[^\']+ - { - dummy = "$id: Comment catched from inside Microsoft smart quetes.." - COMMENT = $MATCH - } - - dummy = "$NL$id: normal quotes $NL " - - :0 E # Else, Try catching "Mr. Foo" in quotes - * INPUT ?? \"()\/[^\"]+ - { - dummy = "$id: Comment catched from double quotes.." - COMMENT = $MATCH - } - - -dummy = "$NL$id: :::::::::::::::::::::::: COMMENT_PLUS $NL" - -:0 # derive plus address, if RFC comment trick -* COMMENT ?? (\++|--)\/.* -{ - COMMENT_PLUS = $MATCH -} - -# ... ... ... ... ... ... ... ... ... ... ... ... ... catch address .. - -dummy = " $NL$id: Find <login@site.com> $NL " - -# Try strict address first <> - -:0 -*$ INPUT ?? $s*<\/$charset_jaaddr@$charset_jaaddr> -{ - INPUT = $MATCH - - # Drop the trailing ">" too - # - :0 - *$ INPUT ?? ^\/$charset_jaaddr@$charset_jaaddr - { - ADDRESS = $MATCH - } -} - -dummy = "$NL$id: :::::::::::::::::::::::: INPUT --> ADDRESS [$INPUT] $NL" - -# No joy, then try to locate @ character - -:0 E -*$ INPUT ?? $s*\/$charset_jaaddr@$charset_jaaddr -{ - ADDRESS = $MATCH -} - - -# ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. explode .. -# If we got the address, derive other parts - - -dummy = "$NL$id: :::::::::::::::::::::::: ADDRESS [$ADDRESS] $NL" - - -:0 -* ADDRESS ?? @\/.* -{ - SITE = $MATCH - - :0 # Get last three characters - * SITE ?? (\.)\/...^^ - { - NET = $MATCH - } - :0 E # Nope, it was two (like .us) - * SITE ?? \.\/..^^ - { - NET = $MATCH - } - - - # If next recipe does not match, ie. there is no two components in - # the address. Eg: - # - # foo@a.b.com -> DOMAIN = b.com - # foo@this.com -> DOMAIN = this.com - - DOMAIN = $SITE - - :0 - *$ SITE ?? (\.)\/[^.]+\.$NET - { - DOMAIN = $MATCH - } - - # It's a bit tricky to count backward with procmail, but in this - # case it it possible, because there is "." separating the parts. - # - # this.site.here.com : Get everything until period, delete period - # -> SUB this.site.here - # - # Next; we repeate following 3 times - # - # this.site.here : get everything until period, delete period - # -> this.site : save this to `tmp' - # - # If there is no matches, reset `tmp' to empty to prevent next recipes to - # match. If there is no more matches, the ":0 E" recipe assigns the last - # - # --> this : into last SUB - - :0 - * SITE ?? ()\/.*\. - * MATCH ?? ()\/.*[^.] - { - SUB = $MATCH - SUB1 = $SUB # suppose only one subdomain. @this.com - tmp = "" - - :0 - * SUB ?? .*\.\/[^.]+^^ - { - SUB1 = $MATCH - } - - tmp - - :0 - * SUB ?? ()\/.*\. - * MATCH ?? ()\/.*[^.] - { - tmp = $MATCH - - :0 - * tmp ?? .*\.\/[^.]+^^ - { - SUB2 = $MATCH - } - :0 E - { - SUB2 = $tmp tmp = "" - } - } - - :0 - * tmp ?? ()\/.*\. - * MATCH ?? ()\/.*[^.] - { - tmp = $MATCH - - :0 - * tmp ?? .*\.\/[^.]+^^ - { - SUB3 = $MATCH - } - :0 E - { - SUB3 = $tmp tmp = "" - } - } - - :0 - * tmp ?? ()\/.*\. - * MATCH ?? ()\/.*[^.] - { - tmp = $MATCH - - :0 - * tmp ?? .*\.\/[^.]+^^ - { - SUB4 = $MATCH - } - :0 E - { - SUB4 = $tmp tmp = "" - } - } - - - - } - - - :0 - * ADDRESS ?? ^^\/[^@]+ - { - ACCOUNT = $MATCH - - # Handle plus addresses and explode it - - :0 - * ACCOUNT ?? [-+]\/.* - { - ACCOUNT2 = $MATCH - } - - :0 - * ACCOUNT ?? ()\/[^+]+ - { - ACCOUNT1 = $MATCH - } - - - # Handle firstname.surname - - :0 - * ACCOUNT1 ?? [.]\/.* - { - DOT2 = $MATCH - } - - :0 - * ! DOT2 ?? ^^^^ - * ACCOUNT1 ?? ()\/[^.]+ - { - DOT1 = $MATCH - } - - - } - -} - -dummy = "$NL$NL$id: end: $ERROR $NL" - -# end of file pm-jaaddr.rc diff --git a/src/procmail/pm-jabup.rc b/src/procmail/pm-jabup.rc @@ -1,140 +0,0 @@ -# pm-jabup.rc -- Keeep N arriving message backup in separate directory -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# Preserve last N arriving messages in a separate sub-directory. -# This should be your safety-belt recipe that you put to the beginning -# of your .procmailrc. -# -# Procmail saves the backup files with names like: msg.rcG msg.scG -# msg.3YS1, msg.4YS1, msg.VYS1, msg.fYS1 to the backup directory. -# -# Note: this recipe will alawys call shell commands for each message -# you recive. That is needed because cleaning of the backup directory. -# If you receive only small number of messages per day, the performance -# drop of your .procmailrc is not crucial. But if you store many messages -# per day, then the shell calls may be a performance problem. -# -# In that case, consider moving the cleanup to the pm-jacron.rc -# module (The cleanup is run only once a day, not for every message) -# -# John Gianni send his simple bsckup script to Jari, who packaged -# and generalized the code. The code is reused with John's permission -# and maintaining responsibility was transferred to Jari -# -# Required settings -# -# (none) -# -# Call arguments (variables to set before calling) -# -# o JA_BUP_MAX, How many messages to keep at maximum. 32 is default -# o JA_BUP_DIR, Where to store the messages. $HOME/Mail/bup by default -# o JA_BUP_FILES, regexp to match the saved files. Procmail default. -# o JA_BUP_CHECK_DIR. Once you have verified that this recipe works, -# that directories are ok, please set this flag to "no" to prevent -# running unnecessary `test' command for each email. -# -# Usage example -# -# You only want to keep backup of messages that are not from mailing -# lists. You may want to use TO_ macro to detect addresses better, -# this example matches against all headers -# -# LISTS = "(procmail|list-1|list-2)" -# JA_BUP_DIR = $HOME/Mail/backup/. # Create the path too -# JA_BUP_MAX = 42 # this should be enough -# -# :0 -# *$ ! $LISTS -# { -# INCLUDERC = $PMSRC/pm-jabup.rc -# } -# -# If you get many messages, please don't use this module. Instead -# see pm-jacron.rc where similar backup work is done better. -# -# Change Log (none) - -# .................................................... &initialising ... -id = " pm-jabup.rc" -dummy = "subroutine: $id start" - -# .......................................................... &public ... - -default = "$HOME/Mail/bup" -JA_BUP_DIR = ${JA_BUP_DIR:-$default} -JA_BUP_MAX = ${JA_BUP_MAX:-32} -JA_BUP_FILES = ${JA_BUP_FILES:-"msg.*"} -JA_BUP_CHECK_DIR = $JA_BUP_CHECK_DIR:-"yes"} - -# ........................................................... &check ... - -:0 -* JA_BUP_CHECK_DIR ?? yes -{ - # - If we're using the default directory, check that it exists. - # - Create one if needed and exit if create was unsuccessfull - - :0 - *$ JA_BUP_DIR ?? $default - *$ ! ? $IS_DIR $default || $MKDIR $default - { - EXITCODE = 217 # just some code, doesn't mean anything - HOST # stop immediately - } - - - :0 - *$ ! ? $IS_DIR $JA_BUP_DIR - { - dummy = "$id: $JA_MSG_ERROR $JA_BUP_DIR is not a directory" - EXITCODE = 217 - HOST - } -} - -# ........................................................... &do-it ... - -dummy = "subroutine: pm-jabup.rc delivering backup." - -:0 c: -$JA_BUP_DIR - -# i = ignore write errors -# -# - The 'rm -f dummy' makes sure that rm always has at least one argument, -# because there may not be files in the directory. -# - 'ls -t' returns files sorted by date, newest first -# - 'sed' just chops first N files from the ls listing, leaving list -# of old files -# -# NOTE -# -# - If you get lot of mail, it is too expensive to run this after -# every message. Plese use cron(1) or pm-jacron.rc module to run something -# only once a day. - -:0 hwic -| cd $JA_BUP_DIR \ - && $RM -f dummy `$LS_BY_DATE $JA_BUP_FILES | $SED -e 1,${JA_BUP_MAX}d` - - -dummy = "subroutine: $id end." - -# end of file pm-jadate.rc diff --git a/src/procmail/pm-jacookie.rc b/src/procmail/pm-jacookie.rc @@ -1,460 +0,0 @@ -# pm-jacookie.rc -- Handle cookie (unique id) confirmations -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with program. If not, write to the -# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -# Boston, MA 02110-1301, USA. -# -# Visit <http://www.gnu.org/copyleft/gpl.html> -# -# Overview of features -# -# o Each user must register himself to cookie cache before he -# is considered "known" -# o Unless user return the generated cookie string; which is -# typically a decimal or hex number, he is not considered as -# known and should not have access to services you provide. -# o Can be used as a "doorbell" spam/UBE shield -# -# Description -# -# This recipe handles generating the cookie to new users, comparing -# the returned cookie against the original one and passing known -# users through if they already had returned their cookie. -# -# When you run automatised scripts, eg. to manage mailing lists -# where users can subscribe and unsubscribe, you have better to -# install safety measure so that someone can not subscribe his enemy -# to 30 mailing lists. -# -# The *cookie* is any continuous block of random characters that -# is sent to person who wanted to use the service. He must send -# back the *cookie* before the service starts an action, like -# subscribe. If someone forges the From address to pretend to be -# someone else and then subscribes as-beeing-someone-else to a -# mailing list, the cookie protects this from happening. -# -# The cookie is sent to someone-else, and he must return the cookie -# before the "subscribe" service is activated. Obviously this -# someone-else will not be interested in sending back the cookie and -# thus the forgery fails. Isn't that simple, but efective protection -# against misuse? -# -# Should I use this as Challenge-Response Spam shield? -# -# Unsolicited Bulk Email aka Spam is crawling from every possible -# domain thinkable, so you might think that a challenge-response -# policy could be deployed to regular email communication as well. -# The idea would be that unknown people are requested to -# "join" to a white list, before discussion is initiated with them. -# Bulk email shotguns do not reply to challenges (here: cookies), -# so confirmations are not returned. Individual people that want to -# talk, *may* want to return the cookies. -# -# Sounds like a perfect Unsolicited Bulk Email shield? No more -# non-invited mail? Wrong. Don't use this module for that. The -# whole idea of challenge-response is flawed and causes trouble -# for every person who tries to contact. Imagine for 10 people -# using C-R systems; they would all need to authenticate -# themselves. Who is going to believe that he is not replying to -# a spammer who is collecting email addresses? And what about -# automatic messages that might be received -- there is no -# artificial intelligence to deparate "human" messages from -# automatically generated messages, so challenges just -# increase the overall mail traffic. Every C-R system doubles -# the mail traffic and becomes spam problem by itself. -# -# In short, don't use this module for implementing a C-R system -# to block regular mail to you. -# -# How it works -# -# By default the cookie generated uses CRC 32 `cksum', but if you have -# md5, you should use it. The cookie is generated from the reply -# address and immediately stored to cookie database file with entry -# -# DATE FROM-a COOKIE-a -# DATE FROM-b COOKIE-b -# -# If this was a new user or an old user, who has not registered his -# cookie yet, then original message is sent back to the sender with -# instructions: "please place the magic string to Subject line and -# resent the message." -# -# When cookie is returned back, a new line to the database is added, -# simply by adding a duplicate entry. The file now looks like this: -# -# DATE FROM-a COOKIE-a -# DATE FROM-b COOKIE-b -# DATE FROM-a COOKIE-a -# -# When there is two or more same entries, like FROM-a, the address -# is supposed to be known and person behind it "cleared". -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include -# -# o pm-javar.rc -# o pm-jadate.rc -# o pm-jacookie1.rc -# o pm-jastore.rc -# -# Call arguments (variables to set before calling) -# -# o JA_COOKIE_SEND, flag. Default is "yes". Set to "no" if you want -# to take full control of the message returned to user. You can check -# variable `ERROR' and use `key' which holds the unique `cookie' -# o JA_COOKIE_CACHE, cache to determine if this is new user or not. -# o JA_COOKIE_AUTO_KEY, flag. If set to "yes"; the cookie is -# initially put to the Subject when the message is bounched back. -# Receiver only has to press "r" to reply to send the cookie -# and message back (convenient). You set this flag to "no" when -# you want to avoid accidnebts eg. when receiver is about to -# subscribe to a mailing lists: he has to manually insert the cookie -# into subject. But keep flag to "yes" if you use this module to -# get your friends registered easily. -# o JA_COOKIE_KEYS, the cookie database. Email address and person's -# access cookie. -# o JA_COOKIE_RC, dubroutine to generate the cookie id from INPUT. -# By default uses CRC 32. -# o JA_COOKIE, the string from which the cookie will be generated. -# If you already have the return addres for the sender derived, -# you should assing a value to this to save unnecessary formail call. -# -# Returned values -# -# ERROR will contain the efective action when this recipe file ends -# -# o "new-user", This is first message from sender. -# o "known-user", message has email that has been "cleared" ie. -# cookie had been returned and user registered. -# o "key-mismatch", This is at least second message from sender. -# But he dind't send the confirmation in this message. -# -# `key' is an internal variable in this recipe file and will hold the -# cookie id in case of "new-user" and "key-mismatch". You may want to -# use it if you generate your own reply. -# -# Example usage for UBE shield -# -# This is what I use to prevent unknown people from sending me UBE. -# It takes a bit extra, but they can easily return the message. -# Fill in the missing variables, this won't work out of the box for you. -# -# WORK = "(domain1|domain2|domain3)" -# LISTS = "(procmail|list-2|list-3|list-4)" -# VALID = "(postmaster|abuse|$LISTS|$WORK)" -# RC_COOKIE = $PMSRC/pm-jacookie.rc -# UBE_SPOOL = $HOME/Mail/junk.ube.spool # Save spam here -# -# :0 -# *$ ! From:.*$VALID -# *$ ! ^FROM_DAEMON -# { -# JA_COOKIE_SEND = "yes" # Activate it -# INCLUDERC = $RC_COOKIE -# -# :0 : -# * ! ERROR ?? known-user -# $UBE_SPOOL -# -# # ... Past this point: it was user in whitelist, so the -# # recipes after this block will take care of it -# } -# -# Example usage for subscriptions -# -# $RC_COOKIE = $PMSRC/pm-jacookie.rc -# -# ...Mailing lists handled here... -# ...Your work messages filed here.. -# -# TO = `formail -rt -zxTo:` # We need this elswhere -# JA_COOKIE_TO = $TO -# -# # For List-X all subscribe requests must -# # be confirmaed -# -# * ^TO_()list-x -# * ^Subject: +subscribe\> -# { -# JA_COOKIE_SEND = "no" -# INCLUDERC = $RC_COOKIE -# -# :0 -# * ERROR ?? known-user -# { -# # User sent the subsribe request again, allow joining -# # immediately. -# } -# :0 E -# { -# # Because the Send was set to "no"; we're in charge -# # to send a reply to the user. -# # ...generate suitable message with formail -rt -# } -# -# } -# -# # End of example -# -# Change Log: (none) - -# ............................................................ &init ... - -dummy = " -====================================================================== -pm-jacookie.rc: init: -" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -:0 -*$ ! YYYY ?? ^^$d$d$d$d^^ -{ - INCLUDERC = $PMSRC/pm-jadate.rc -} - -JA_COOKIE_SEND = ${JA_COOKIE_SEND:-"yes"} -JA_COOKIE_AUTO_KEY = ${JA_COOKIE_AUTO_KEY:-"yes"} - -JA_COOKIE_CACHE = ${JA_COOKIE_CACHE:-$HOME/.cookie-cache-new-user} -JA_COOKIE_CACHE_SIZE = ${JA_COOKIE_CACHE_SIZE:-8192} -JA_COOKIE_KEYS = ${JA_COOKIE_KEYS:-$HOME/.cookie-cache-keys} -JA_COOKIE_WHITELIST = ${JA_COOKIE_WHITELIST:-$HOME/.cookie-cache-whitelist} - -JA_COOKIE_RC = ${JA_COOKIE_RC:-$PMSRC/pm-jacookie1.rc} - -JA_COOKIE_XLOOP = ${JA_COOKIE_XLOOP:-"\ -Procmail Authentication service (PAS)"} - -JA_COOKIE_SUBJECT_TAG= ${JA_COOKIE_SUBJECT_TAG:-"PAS-cookie-"} -JA_COOKIE_HEADER = ${JA_COOKIE_HEADER:-"X-PAS-Auth-Key:"} -cookie = "" - -JA_COOKIE_MSG = ${JA_COOKIE_MSG:-"\ -Your message need to be authenticated. Include the authentication key -at the end of Subject header and resend your message."} - -# - If not set, set the variable. We use `r' instead of `rt' -# because of `-rD' later. -# - User can preset the JA_COOKIE to his liking if the "to" field's -# string is not enough to generate a unique cookie from it. - -JA_COOKIE_FROM = ${JA_COOKIE_FROM:-`$FORMAIL -r -zxTo:`} - -# - Should non-authenticated messages be saved? Change this -# to mailbox name as needed. - -JA_COOKIE_DEVNULL = ${JA_COOKIE_DEVNULL:-/dev/null} - -# ..................................................... &read-cookie ... - -jaCookieData = "" -jaCookieKey = "" - -:0 -*$ $SUPREME^0 H ?? ^Subject:()\/.* +$JA_COOKIE_SUBJECT_TAG[0-9]+ -*$ $SUPREME^0 B ?? ^Subject:()\/.* +$JA_COOKIE_SUBJECT_TAG[0-9]+ -{ - jaCookieSubject = $MATCH - - :0 - * ^FROM_DAEMON - { - # The sender is not there, drop this message - - :0 h - * JA_COOKIE_DEVNULL ?? /dev - $JA_COOKIE_DEVNULL - - # For mailbox, use lock - - :0 : - $JA_COOKIE_DEVNULL - } - - :0 - *$ jaCookieSubject ?? $JA_COOKIE_SUBJECT_TAG\/[0-9]+ - { - jaCookieData = $MATCH - } - - # Remove cookie from subject - - :0 - *$ jaCookieSubject ?? ^()\/.* +$JA_COOKIE_SUBJECT_TAG - *$ MATCH ?? ^()\/.*[ ] - *$ MATCH ?? ^()\/.*[^ ] - { - jaCookieSubject = $MATCH - } -} - -# No cookie was in the subject - -:0 E -* ^Subject: \/.* -{ - jaCookieSubject = $MATCH -} - -# ....................................................... &whitelist ... - -# Is this user in whitelist already? - -ERROR = "" -jaCookieWhitelist = "" - -:0 -* jaCookieData ?? ^^^^ -* ? $GREP '\<$JA_COOKIE_FROM\>' $JA_COOKIE_WHITELIST -{ - jaCookieWhitelist = "yes" - ERROR = "known-user" -} - -# ........................................................... &do-it ... - -jaCookieNewUser = "yes" -jaCookieDate = $YYYY-$MM-$DD - -# - Mail arrived, check cache. Use regional lock because formail -# is in the condition line. -# - If user was there already, formail returns success -# - Options -rD cause adding the email to the cache. - -LOCKFILE = ${JA_COOKIE_CACHE}.lock -dummy = "pm-jacookie.rc: Testing new user" - -:0 -* jaCookieWhitelist ?? ^^^^ -* ? $FORMAIL -rD $JA_COOKIE_CACHE_SIZE $JA_COOKIE_CACHE -{ - jaCookieNewUser = "no" -} - -LOCKFILE -mail = "" - -# He is not in whitelist (ERROR="") and he did not return -# the cookie (cookie="") - -dummy ="pm-jacookie.rc: Check if white [$jaCookieWhitelist] ERROR [$ERROR] cookie [$cookie]" - -:0 -* jaCookieWhitelist ?? ^^^^ -* jaCookieNewUser ?? no -{ - dummy = "pm-jacookie.rc: Old user, did he return a cookie [$jaCookieData]" - - :0 - * jaCookieData ?? [0-9] - { - # This user has returned confirmation. Check that it is correct - - dummy = "pm-jacookie.rc: confirming the cookie" - - :0 - *$ ? $GREP ".*$JA_COOKIE_FROM.+$jaCookieData" $JA_COOKIE_KEYS - { - dummy = "pm-jacookie.rc: Adding to whitelist" - msg = "$JA_COOKIE_FROM" - - :0 hwc : $JA_COOKIE_WHITELIST$LOCKEXT - | echo "$msg" >> $JA_COOKIE_WHITELIST - - ERROR = "known-user" - } - - :0 E - { - # Ask to send again - - ERROR = "cookie-error" - jaCookieKey = $jaCookieData - jaCookieMail = "yes" - } - } - - :0 E - { - dummy = "pm-jacookie.rc: Unknown user. Generate new key" - jaCookieNewUser = "yes" - } -} - -:0 -* jaCookieNewUser ?? yes -{ - saved = $ERROR - - INPUT = $JA_COOKIE_FROM - INCLUDERC = $JA_COOKIE_RC - jaCookieKey = $OUTPUT - - ERROR = $saved # restore value that got changed in subroutine - - jaCookieMail = "yes" - jaCookieMsg = "$jaCookieDate $JA_COOKIE_FROM $jaCookieKey" - dummy = `echo "$jaCookieMsg" >> $JA_COOKIE_KEYS` -} - -dummy = "pm-jacookie.rc: If new user/mismatched key, maybe send mail [$jaCookieMail]" - -:0 -* jaCookieMail ?? yes -* jaCookieWhitelist ?? ^^^^ -* JA_COOKIE_SEND ?? yes -* ! jaCookieKey ?? ^^^^ -*$ ! ^X-Loop:.*$JA_COOKIE_XLOOP -*$ ! $JA_FROM_DAEMON -{ - dummy = "pm-jacookie.rc: Request authentication $JA_COOKIE_FROM" - - # - If auto-mode is "on"; then put the key in the subject - # - Sender only has to reply to message. - - jaCookieKey = "$JA_COOKIE_SUBJECT_TAG$jaCookieKey" - - :0 fhw - * JA_COOKIE_AUTO_KEY ?? yes - | $FORMAIL -I "Subject: $jaCookieSubject $jaCookieKey" - - # Add extra header as well to message that go past the next one - - :0 fhw - | $FORMAIL -A "$JA_COOKIE_HEADER $jaCookieKey" - - :0 hbw c: $JA_COOKIE_CACHE$LOCKEXT - | ( $FORMAIL -rk -b \ - -A "X-Loop: $JA_COOKIE_XLOOP"; \ - echo "You Authentication key is: $jaCookieKey"; \ - echo "$JA_COOKIE_MSG"; \ - ) | $SENDMAIL $SENDMAIL_FLAGS - -} - -dummy = "pm-jacookie.rc: end: $ERROR" - -# pm-store.rc ends here diff --git a/src/procmail/pm-jacookie1.rc b/src/procmail/pm-jacookie1.rc @@ -1,81 +0,0 @@ -# pm-jacookie1.rc -- Generate unique id from INPUT variable. -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# When given a string, this subroutine returns a unique number -# representing a string, a cookie. -# -# Required settings -# -# (none) -# -# Call arguments (variables to set before calling) -# -# o INPUT, String from which the magic-cookie is calculated -# o JA_COOKIE_CMD: shell command to read INPUT and return decimal -# or hex cookie string as one continuous block of characters. -# It decaults to HP-UX `cksum', but your system may have `md5' -# or `chksum' -# -# Return values -# -# o Variable OUTPUT will contain the cookie. -# -# Example usage -# -# INPUT = "foo@site.com" -# JA_COOKIE_CMD = "md5" # or chksum -# INCLUDERC = $PMSRC/pm-jacookie1.rc -# cookie = $OUTPUT -# -# Change Log: (none) - - -id = "pm-jacookie1.rc" -dummy = " -====================================================================== -$id: init: -" - - -# ........................................................... &input ... - -# This is standard CRC 32 - -JA_COOKIE_CMD = ${JA_COOKIE_CMD:-"cksum"} - -# ........................................................... &do-it ... - -# Generate new key for this new user - -OUTPUT = `echo $INPUT | $JA_COOKIE_CMD` - - -# - At least HP-UX cksum produces two values: CRC DATA-LEN -# - We're only interested in the CRC part -# -:0 -* OUTPUT ?? ^^\/[0-9a-f]+ -{ - OUTPUT = $MATCH -} - -dummy = "$id: end:" - - -# pm-store.rc ends here diff --git a/src/procmail/pm-jacron.rc b/src/procmail/pm-jacron.rc @@ -1,210 +0,0 @@ -# pm-jacron.rc -- Procmail: Run cron once a day -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html> -# -# Description -# -# Framework for all cron tasks that can be run once a day. -# This is a wrapper recipe to your cron task list: when the day changes, -# you cron includerc is called. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This recipe -# will include -# -# o pm-javar.rc -# o pm-jadate.rc -# -# Call arguments (variables to set before calling) -# -# o JA_CRON_RUN_FLAG, You _must_ define this flag file. -# o JA_CRON_DATE_FILE, File where the date information, last cron run, -# is kept. Defaults to $HOME/.yymmdd -# o JA_CRON_RC, your includerc which is run when cron triggers. -# -# A file `JA_CRON_RUN_FLAG' which defaults to ~/.yymmdd.run is created -# when your includerc, that contains list of cron tasks, is run. If new -# mail arrives while your cron recipes are still running, you should -# prevent invoking the cron again by checking if this file exists. -# When all the cron tasks have been run, this flag file is removed. -# Remember to use "w" flag in your cron recipes where necessary -# to serialize the work. -# -# Return values -# -# (none) -# -# Usage example -# -# Save backups to separate directory, but do cleaning only once a day -# We do not keep backups from mailing list messages -# -# LISTS = "(procmail|list-1|list-2)" -# BACKUP_DIR = "$HOME/Mail/backup/." -# -# # Store backups: separate files to directory -# -# :0 c: -# *$ ! $LISTS -# $BACKUP_DIR -# -# # Run JA_CRON_RC once a day. It contains all daily cron tasks -# -# CRON_RC = $PMSRC/pm-jacron.rc # the framework -# JA_CRON_RC = $PMSRC/pm-mycron.rc # the tasks to do -# JA_CRON_RUN_FLAG = $HOME/.cron-running # define this! -# -# # Do not enter here if message arrived at the same day when -# # the cron is already running. The CRON_RC takes care -# # of deleting the file when cron has finished. -# -# :0 -# *$ ! ? $IS_EXIST $JA_CRON_RUN_FLAG -# { -# INCLUDERC = $CRON_RC -# } -# -# The *pm-jacron.rc* file may contain anything. For example to clean -# the backup directory; you add these statements there -# -# # rm dummy: if ls doesn't return files, make sure rm has -# # at least one argument. -# # -# # ls -t: list files; newest first -# # -# # sed: chop $max newest files from the listing, leaving the -# # old ones -# -# max = 32 -# -# :0 hwic -# | cd $BACKUP_DIR && $RM -f dummy `ls -t msg.* | $SED -e 1,${max}d` -# -# # End of file pm-mycron.rc -# -# Change log (none) - -# ............................................................ &init ... - - -id = "pm-jacron.rc" -dummy = " -======================================================================== -$id: init: -" - -# .......................................................... &public ... - -JA_CRON_DATE_FILE = ${JA_CRON_DATE_FILE:-$HOME/.yymmdd} -JA_CRON_RC = ${JA_CRON_RC:-""} -JA_CRON_RUN_FLAG = ${JA_CRON_RUN_FLAG:-${JA_CRON_DATE_FILE}.cron-running} - -# ........................................................ &settings ... - -:0 -*$ ! ? $IS_EXIST $JA_CRON_RUN_FLAG -{ - - - :0 - * ! WSPC ?? ( ) - { - INCLUDERC = $PMSRC/pm-javar.rc - } - - dummy = "$id: Define date variables if not yet set" - - :0 - *$ ! YYYY ?? ^^[0-9]+^^ - { - INCLUDERC = $PMSRC/pm-jadate.rc - - } - - - error = "no" - - :0 - *$ ! YYYY ?? ^^[0-9]+^^ - { - error = "$id: $JA_MSG_ERROR_FATAL Loading of pm-jadate.rc failed." - } - - # ......................................................... &private ... - - yymmdd = $YYYY-$MM-$DD # ISO 18 - - # Create initial .yymmdd file if it doesn't exist. - - :0 - *$ ! ? $IS_EXIST $JA_CRON_DATE_FILE - * error ?? no - { - - :0 hwic: $JA_CRON_DATE_FILE$LOCKEXT - | echo $yymmdd > $JA_CRON_DATE_FILE - } - - - # Read previously saved value - - yymmdd_prev = "" - - :0 hwic - * error ?? no - yymmdd_prev=| $CAT $JA_CRON_DATE_FILE - - - # ............................................................ do-it ... - - dummy = "$id: test if it is time to run cron?" - - # - If RC file is defined - # - if different date then enter this block - # - If cron flag is not up: another procmail instance is not - # already running this cron recipe. - - :0 - *$ JA_CRON_RC ?? [a-z] - *$ ! yymmdd ?? ^^$yymmdd_prev^^ - * error ?? no - *$ ! ? $IS_EXIST $JA_CRON_RUN_FLAG - { - dummy = "$id: CRON-TRIGGERED" - - # Update timestamp to tell that we're running cron job now. - - :0 hwic: $JA_CRON_DATE_FILE$LOCKEXT - | echo $yymmdd > $JA_CRON_DATE_FILE - - :0 hwic - | $TOUCH $JA_CRON_RUN_FLAG - - INCLUDERC = $JA_CRON_RC # The user's task list for this day - - # Free the cron flag. Cron ended - - :0 hwic - *$ ? $IS_EXIST $JA_CRON_RUN_FLAG - | $RM -f $JA_CRON_RUN_FLAG - - } -} - -dummy = "$id: end:" - -# end of file diff --git a/src/procmail/pm-jadaemon.rc b/src/procmail/pm-jadaemon.rc @@ -1,423 +0,0 @@ -# pm-jadaemon.rc -- Handle DAEMON messages by changing subject -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# When you send a message to a address that had delivery troubles, -# you get a DAEMON message back explaining the error problem. I -# usually want to save these daemon mesaages to a different folder -# and check the folder from time to time. A typical daemon message -# is like this (shortened) -# -# From: Mail Delivery Subsystem <MAILER-DAEMON@my.domain.com> -# Subject: Warning: could not send message for past 4 hours -# -# The original message was received at... -# ----- Transcript of session follows ----- -# Deferred: Connection timed out -# ----- Original message follows ----- -# [YOUR MESSAGE AS YOU SENT IT WITH HEADERS] -# -# Well, when I read the subjects, I do not like the standard error -# messages, but I also like to know to which address the delivery -# failed and what was the original subject. This small recipe changes -# the daemon message's Subject to -# -# Subject BRIEF-ERROR-REASON, SENT-TO-ADDRESS, ORIGINAL-SUBJECT -# -# and from that you can immediately tell if you should be worried Eg. -# if SENT-TO-ADDRESS was your friend's, then you want to take actions -# immediately, but if it were your complaint to UBE message to -# postmaster, you don't want to bother reading that daemon message. -# Here are some real examples: -# -# fatal errors,postmaster,ABUSE (Was: Super Cool Site!) -# Host unknown,postmaster,ABUSE (Was: A-Credit Information) -# undeliverable,postmaster,Could you investigate this spam -# Warning-Returned,friend,Have you looked at this -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# needs scrips -# -# o pm-javar.rc -# -# Call arguments (variables to set before calling) -# -# o `JA_DAEMON_SAVE'. This is by default `yes' which causes the -# original subject to be saved under header field `X-Old-Daemon-Subject'. -# If you don't want that extra header generated, set this variable to `no' -# o `JA_DAEMON_REGEXP', which messages to trigger -# -# Return values -# -# o Variable ERROR will be set to "yes" if daemon message was handled -# otherwise; value is "no" -# -# Usage example -# -# Just add this recipe somewhere in your .procmailrc. The place where -# you would put this daemon message trapper subroutine is crucial: -# think carefylly how you order your recipes. One suggested order -# could be: backup important messages, cron-subroutine, -# handle duplicates, DAEMON MESSAGES, plus addressed message, -# server message (file server, ping responder...), MAILING LISTS, -# send possible vacation replies only after all above, apply -# kill file, detect mime, save private messages and las FILTER UBE. -# -# -# PMSRC = $HOME/pm -# RC_DAEMON = $PMSRC/pm-jadaemon.rc -# DAEMON_MBOX = $HOME/Mail/junk.daemon.mbox -# -# ... -# -# INCLUDERC = $RC_DAEMON -# -# :0 : # If that was a daemon message, save it -# * ERROR ?? yes -# $DAEMON_MBOX -# -# Change Log: (none) - -dummy = " -======================================================================== -pm-jadaemon.rc: init:" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ........................................................... &input ... - -JA_DAEMON_SAVE = ${JA_DAEMON_SAVE:-"yes"} - -# ----- The following addresses had permanent fatal errors ----- -# <joe@example.com> -# -# ----- Transcript of session follows ----- -# ... while talking to 168.231.153.98: -# 550 5.1.2 <joe@example.com>... Host unknown (Name server: host not found) -# <<< 501 healy!me@example.com... Refused -# -# ----- The following addresses had transient non-fatal errors ----- -# <nobody@mail14.example.com> -# <<< 550 5.1.1 unknown or illegal alias: email.jdoe@example.com -# 550 <email.jdoe@example.com>... User unknown - -JA_DAEMON_REGEXP = ${JA_DAEMON_REGEXP:-"\ -^From.*(MAILER-DAEMON|abuse@|postmaster@|daemon@)\ -|(Transcript of session follows\ -|permanent fatal errors\ -|MAILBOX NOT FOUND\ -|Invalid recipient\ -|Service unavailable\ -|Message is too large\ -|550.*User unknown\ -|550.*illegal alias\ -|message was not delivered\ -|blocked using.*spamcop\ -|quota exceed\ -|501.*refused\ -|Domain blacklisted\ -|transient non-fatal errors\ -|user.*doesn't exist\ -|Deferred: Connection timed out\ -)\ -" -# ......................................................... &output ... - -ERROR = "no" - -# ........................................................... &do-it ... - -errTo = "" -charset = "[^ @(){}<>]" -daemon = ! - -# Novell Mercury MTA send Broken message headers, The "From " is all wrong. -# -# From mmokrejs Wed Aug 14 16:48:53 2002 -# Received: from SpoolDir by OKBDELL (Mercury 1.44); 14 Aug 02 16:33:29 +0100 (MET) -# 14 Aug 02 16:33:51 +0100 (MET) -# From: Mail Delivery System <postmaster.mustela@lfmotol.cuni.cz> -# Subject: Delivery failure notification -# Message-ID: <5C4D0D00E16@mustela.lfmotol.cuni.cz> -# X-Diagnostic: Possible loopback problem -# X-Envelope-To: montana-request - -:0 -*$ ()\/^From:$s+Mail Delivery System.* -* ^X-Diagnostic: -{ - daemon = "yes" -} - -# If you wonder why ()\/ and non-sensical ".*" at the end is used, -# it is only for logging purposes. It's easier if you can look from log file -# what the regexp actually matched. - -:0 -*$ ()\/$JA_DAEMON_REGEXP.* -{ - daemon = "yes" -} - -dummy = "Check for DAEMON status [$daemon]" - -:0 -*$ daemon ?? ^^yes^^ -{ - errText # Kill variable - - # Read the reason from MAIL DAEMON (subject field) - - :0 - * B ?? THIS IS A WARNING MESSAGE - { - errText = "Warn-Returned," - - # ----- The following addresses had transient non-fatal errors ----- - # <foo@d255f016.mch.sni.de> - - :0 - * B ?? The following addresses.*($)\/.*@ - { - match = $MATCH - } - } - - # ......................................... sendmail-error-codes ... - - :0 E - * B ?? ()\/550.*User unknown - { - errText = "Err-Unknown," - match = $MATCH - } - - :0 E - * B ?? ()\/554.*Mail loop detected - { - errText = "Err-Loop," - match = $MATCH - } - - # TO: foo@bar [552 Requested mail - # operation aborted: Cannot be routed.] - - :0 E - * B ?? ()\/.*552 .*mail operation.* - { - errText = "Err-Unknown," - match = $MATCH - } - - :0 E - *$ $SUPREME^0 B ?? following addresses have delivery notifications - *$ $SUPREME^0 B ?? has encountered a delivery problem. - *$ $SUPREME^0 B ?? Mailbox disk quota exceeded - *$ $SUPREME^0 B ?? did not reach the following recipient - *$ $SUPREME^0 B ?? Your message was refused by recipient - *$ $SUPREME^0 B ?? was not delivered to: - *$ $SUPREME^0 B ?? Delivery of the email was stopped - *$ $SUPREME^0 B ?? User mailbox exceed - *$ $SUPREME^0 B ?? Mailbox full - *$ $SUPREME^0 B ?? Our virus detector - { - errText = "Warn-Delivery," - } - - :0 E - * B ?? ()\/(not.*delivered.*($).*after.*hours\ - |still undelivered after.*(hours|days)\ - ).* - { - errText = "Warn-Returned," - } - - # ...................................................... unknown ... - - :0 E - *$ $SUPREME^0 H ?? ^Subject:.*(could not send|returned) - *$ $SUPREME^0 B ?? ()\/(message.*undeliverable\ - |could not be delivered\ - |no longer a valid address\ - |addresses had permanent fatal errors\ - | User unknown\ - ).* - { - # The message that you sent was undeliverable to the following: - # postmaster (user not found) - - # This e-mail address, `abc', is no longer a valid address. You can - # reach Mr Foo at his new email address: - # - # foo@bar.com - # - # <ORIGINAL MESSAGE FOLLOWS> - - # Subject: Returned mail: Cannot send message - # The following addresses had permanent fatal errors - - errText = "err-Unknown," - } - - # ........................................................ other ... - - :0 E - * ^Subject:.*\/Host unknown - { - errText = "$MATCH," - - :0 - * B ?? THIS IS A WARNING - { - errText = "Warn-$errText" - } - } - - :0 E - * ^Subject:.*\/Too many hops - { - errText = "MaxHops," - } - - :0 E B - * Connection to.*failed - { - errText = "Err-connection," - } - - # ........................................................ qmail ... - - # Hi. This is the qmail-send program at master.debian.org. - # I'm afraid I wasn't able to deliver your message to the ... - # This is a permanent error; I've given up. Sorry it didn't work out. - # - # <address>: - # Sorry, no mailbox here by that name. (#5.1.1) - - :0 E - * B ?? wasn't able to deliver your message to.*addresse - { - errText = "err-Unknown," - - :0 - * B ?? it didn't work out.($)+\/.* - { - match = $MATCH - } - } - - # ................................................... Novel MTA ... - - :0 E - *$ ^X-Diagnostic:$s+\/.* - { - errText = "err-Unknown," - match = $MATCH - } - - # .................................... daemon message known now? ... - # If the previous recipes didn't set errText, - # then this message was from a postmaster that sent it to - # the spam-l or to some other mailing list where it's okay - # to post copies of UBE. - - :0 - * ! errText ?? ^^^^ - { - # Read the old subject from body of original message - - :0 B - *$ $SUPREME^0 ^Subject: \/.* - *$ $SUPREME^0 The subject of the message is: \/.* - { - errSubj = $MATCH - } - - # Hm, no copy in the body of message? Look at headers then. - - :0 E - *$ $SUPREME^0 match ?? $a - { - errSubj = $match - } - - # Nothing matched, so take subject - - :0 E - * ^Subject:()\/.* - { - errSubj = $MATCH - } - - # To whom we tried to mail the message. Find it out - # - # login@site.com - # | - # This part will be derived, there must be leading space - - :0 - * errTo ?? ^^^^ - { - :0 - *$ match ?? [<]()\/$charset+ - { - errTo = "$MATCH," - } - - :0 E B - *$ ^To:.*\/$charset+@ - *$ MATCH ?? ()\/$charset+ - *$ MATCH ?? ^^\/[^@]+ - { - errTo = "$MATCH," - } - - :0 E B - *$ ()\/$charset+@ - *$ MATCH ?? ^^\/[^@]+ - { - errTo = "$MATCH," - } - } - - dummy = "$NLpm-jadaemon.rc: recognized message: $errText ($errSubj)" - - # Now make new, combined, subject: - # --> short error reason + original subject - - :0 fhw - * JA_DAEMON_SAVE ?? yes - * ^Subject: \/.* - | ${FORMAIL:-formail} -I "X-Old-Daemon-Subject: $MATCH" - - :0 fhw - | ${FORMAIL:-formail} -I"Subject: ${errText}${errTo}${errSubj}" - - ERROR = "yes" # Raise the flag - } -} - -dummy = "pm-jadaemon.rc: end: (DAEMON detect status = $ERROR)" - -# end of file pm-jadaemon.rc diff --git a/src/procmail/pm-jadate.rc b/src/procmail/pm-jadate.rc @@ -1,146 +0,0 @@ -# pm-jadate.rc -- Read date from the message hdrs: From_, Receved: -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This recipe will scan several headers to find the date string. -# When suitable header is found and the parsing has succeeded, the -# return variables are set. The Date values reflects the arrive time -# of the message; not the sending time. If nothing works, a shell call -# `date' is used as a last resort. -# -# Returned values -# -# YYYY = 4 digits -# YY = 2 digits -# MON = 3 characters -# MM = 2 digits -# DAY = 3 characters -# DD = 2 digits -# hh = 2 digits if available -# mm = 2 digits if available -# ss = 2 digits if available -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include -# -# o pm-javar.rc -# o pm-jadate1.rc -# o pm-jadate3.rc -# o pm-jadate4.rc -# -# Call arguments (variables to set before calling) -# -# (none) -# -# Usage example -# -# INCLUDERC = $PMSRC/pm-jadate.rc -# # now we have all date variables that we need -# # -# $TODAY = $YYYY-$MM-$DD -# -# Change Log (none) - -# .................................................... &initialising ... - - -id = "pm-jadate.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ..................................................... &output-vars ... -# output variables, these actually come from the another subroutine, -# but let's mention them here too -# -# DATE YYYY MM MON DD DAY hh mm ss - -ERROR = "yes" - -# ........................................................... &do-it ... - -# Try MDA From_ header first -# From foo@bar.com Tue Nov 18 12:43:56 1997 - -fromRegexp = "...$s+...$s+$d+$s+$d$d:.*" - -dummy = "$id: From_ date test" - -:0 -*$ ^From$s+$NSPC+\/$s+$fromRegexp -{ - dummy = "$id: Standard From_ header matched" - INPUT = $MATCH - INCLUDERC = $PMSRC/pm-jadate3.rc # Date parser -} - -# Get time from first header, which is in some systems is -# Received: ... ; Thu, 13 Nov 1997 11:43:50 +0200 - -dummy = "$id: Received date test" - -:0 -*$ ! YYYY ?? $d -*$ ^Received:.*;$s+\/...,$s+$d+$s+...$s$d$d$d$d.* -{ - dummy = "$id: First Received header matched" - INPUT = $MATCH - INCLUDERC = $PMSRC/pm-jadate1.rc # Date parser -} - -# Emacs Gnus add X-From-line to the message -# Emacs Rmail adds Mail-from line to the message -# This is same as From_ - -dummy = "$id: MUA date test" - -:0 -*$ ! YYYY ?? $d -*$ ^(X-From-Line|Mail-from):$s+$NSPC+\/$s+$fromRegexp -{ - dummy = "$id: Other possible From_ header matched" - INPUT = $MATCH - INCLUDERC = $PMSRC/pm-jadate3.rc # Date parser -} - - -# Still no luck, I should add more tests to the above but I don't -# know what. Call sh 'date' as a last resort -# - -dummy = "$id: sh date test" - -:0 -*$ ! YYYY ?? $d -{ - dummy = "$id: Last chance, calling sh date " - INCLUDERC = $PMSRC/pm-jadate4.rc -} - -dummy = "$id: end:" - -# end of file pm-jadate.rc diff --git a/src/procmail/pm-jadate1.rc b/src/procmail/pm-jadate1.rc @@ -1,224 +0,0 @@ -# pm-jadate1.rc -- 'Tue, 31 Dec 1997' date parser from variable INPUT -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This includerc parses date from variable `INPUT' which has string -# -# "Week, Daynbr Month Year" -# -# Example input -# -# "Tue, 31 Dec 1997" -- without comma -# "Tue 31 Dec 1997" -- with comma -# -# Returned values -# -# YYYY = 4 digits -# YY = 2 digits -# MON = 3 characters -# MM = 2 digits -# DAY = 3 characters -# DD = 2 digits -# hh = 2 digits If available -# mm = 2 digits If available -# ss = 2 digits If available -# TZ = 5 characters If available -# -# Variable ERROR is set to `yes' if it couldn't recognize the INPUT -# and couldn't parse the basic YYYY, YY, MM, DD variables. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include pm-javar.rc from there. -# -# Call arguments (variables to set before calling) -# -# INPUT = string-to-parse -# -# The INPUT can have anything after "Week, dayNbr Month Year", or -# before it: you can pass a string like -# "Thu, 13 Nov 1997 11:43:23 +0200". -# -# Usage example -# -# The first *Received* header will tell when the message was received -# by your mailserver. We parse the date and avoid calling expensive -# `date' command. -# -# PMSRC = $HOME/pm -# RC_DATE_WDMY = $PMSRC/pm-jadate1.rc #Week-Day-Month-Year parser -# -# # Get time from first header, it ends like this: -# # -# # Received: ... ; Thu, 13 Nov 1997 11:43:50 +0200 -# -# :0 -# *$ ^Received:.*;$s+\/...,$s+$d.* -# { -# INPUT = $MATCH -# -# # Turn off the logging while executing this part -# -# VERBOSE=off INCLUDERC = $RC_DATE_WDMY VERBOSE=on -# -# :0 -# * ERROR ?? yes -# { -# # Use some other way to get the time or shout loudly -# } -# } -# -# Change Log (none) - -# .................................................... &initialising ... - - -id = "pm-jadate1.rc" -dummy = " -======================================================================== -$id: init: -" - - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ..................................................... &output-vars ... -# output variables - -YYYY MM MON DD DAY hh mm ss TZ -ERROR = "yes" # set defualt value - -# ........................................................... &do-it ... -# Check that input is something like: Thu, 13 Nov 1997 - -dummy = "$id: Parse date like [Tue, 31 Dec 1997]" -dummy = "$id: INPUT = $INPUT" # show what we try to match - -:0 D -*$ INPUT ?? $s*\/[SMTWF]$a$a[,$WSPC]+$d+$s+$a$a$a.* -{ - INPUT = $MATCH - - :0 - * INPUT ?? ^\/... - { - DAY = $MATCH - } - - # Move to the DD MON section - - :0 - *$ INPUT ?? [SMTWF]$a$a[,$WSPC]+\/$d.* - { - INPUT = $MATCH - } - - - :0 - *$ INPUT ?? ^\/$d$d - { - DD = $MATCH - } - :0 E # else - *$ INPUT ?? ^\/$d - { - DD = "0$MATCH" - } - - :0 - *$ INPUT ?? ^$d+$s+\/... - { - MON = $MATCH - } - - # ........................................................ &year ... - - :0 - *$ INPUT ?? ^$d+$s+...$s+\/.... - { - YYYY = $MATCH - } - - - # If this last recipe succeeds, then the whole string has been parsed. - # - :0 - * YYYY ?? ..\/.. - { - YY = $MATCH - ERROR = "no" - } - - - # ........................................................ &time ... - # Change INPUT - - in = $INPUT - - :0 - *$ INPUT ?? ^$d+$s+...$s+....$s+\/.* - { - INPUT = $MATCH - } - - - :0 - *$ INPUT ?? ^\/$d$d - { - hh = $MATCH - } - - :0 - *$ INPUT ?? ^$d$d:\/$d$d - { - mm = $MATCH - } - - - :0 - *$ INPUT ?? ^$d$d:$d$d:\/$d$d - { - ss = $MATCH - } - - :0 - *$ INPUT ?? ^$d$d:$d$d:$d$d$s+\/[-+].... - { - TZ = $MATCH - } - - - # Now reverse engineer to the numer, David Tamkin <dattier@miso.wwa.com> - # technically one should use $\monthnym but here it doesn't matter - # If user gave invalid input, will not match - - :0 - * $ mm2nbr ?? $MON\/.. - { - MM = $MATCH - } -} - -dummy = "$id: end:" - -# end of file pm-jadate.rc diff --git a/src/procmail/pm-jadate2.rc b/src/procmail/pm-jadate2.rc @@ -1,162 +0,0 @@ -# pm-jadate2.rc -- 'YYYY-MM-DD' ISO date parser from variable INPUT -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This includerc parses date in format "YYYY-MM-DD hh:mm:ss" -# like `1997-12-01' and sets following variables whenever called -# -# YYYY = 4 digits -# YY = 2 digits -# MON = 3 characters -# MM = 2 digits -# DD = 2 digits -# hh = 2 digits If avaliable -# mm = 2 digits If avaliable -# ss = 2 digits If avaliable -# -# Variable ERROR is set to `yes' if it couldn't recognize the INPUT -# and couldn't parse the basic YYYY, YY, MM, DD variables. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include pm-javar.rc from there. -# -# Call arguments (variables to set before calling) -# -# INPUT = string-to-parse -# -# Last string in INPUT that matches number sequence `NNNN-NN-NN' is -# parsed. -# -# Usage example -# -# PMSRC = $HOME/pm -# RC_DATE_ISO = $PMSRC/pm-jadate2.rc # ISO date parser -# -# INPUT = "This is 1800-10-11, a very old date" -# -# # Turn off the logging while executing this part -# -# VERBOSE="off" INCLUDERC=$RC_DATE_ISO VERBOSE="on" -# -# Change Log (none) - -# .................................................... &initialising ... - - -id = "pm-jadate2.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ..................................................... &output-vars ... -# output variables - -YYYY MM MON DD hh mm ss -ERROR = "yes" - -# ........................................................... &do-it ... - -dummy = "$id: Parsing date like [YYYY-MM-DD]" -dummy = $INPUT # show what we try to match - -:0 -* INPUT ?? $ ().*\/$d$d$d$d-$d$d-$d$d.* -{ - INPUT = $MATCH - - :0 - * INPUT ?? ^\/.... - { - YYYY = $MATCH - } - - :0 - * INPUT ?? ^..\/.. - { - YY = $MATCH - } - - :0 - * INPUT ?? ^....-\/.. - { - MM = $MATCH - } - - :0 - * INPUT ?? ^....-..-\/.. - { - DD = $MATCH - } - - - # ........................................................ &time ... - # Change INPUT - - in = $INPUT # this is no-op, but now we see the value in the logfile - :0 - *$ INPUT ?? ^....-..-..$s+\/.* - { - INPUT = $MATCH - } - - :0 - *$ INPUT ?? ^\/$d$d - { - hh = $MATCH - } - - :0 - *$ INPUT ?? ^$d$d:\/$d$d - { - mm = $MATCH - } - - - :0 - *$ INPUT ?? ^$d$d:$d$d:\/$d$d - { - ss = $MATCH - } - - # .................................................. &month-name ... - - # If user gave invalid YYYY-MM-DD spec, then the next recipe will - # not match: eg 1111-22-33 - - :0 - * $ nbr2mm ?? $MM\/... - { - MON = $MATCH - ERROR = "no" - } - -} - - -dummy = "$id: end:" - -# end of file pm-jadate2.rc diff --git a/src/procmail/pm-jadate3.rc b/src/procmail/pm-jadate3.rc @@ -1,201 +0,0 @@ -# pm-jadate3.rc -- 'Tue Nov 25 19:32:57' date parser from variable INPUT -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This includerc parses date from variable INPUT which has string -# -# "Week, Month dayNbr hh:mm:ss yyyy", -# -# Example -# -# Tue Nov 25 19:32:57 1997 -# -# Returned values -# -# YYYY = 4 digits -# YY = 2 digits -# MON = 3 characters -# MM = 2 digits -# DAY = 3 characters -# DD = 2 digits -# hh = 2 digits -# mm = 2 digits -# ss = 2 sigits -# -# Variable ERROR is set to "yes" if it couldn't recognize the INPUT. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include pm-javar.rc from there. -# -# Call arguments (variables to set before calling) -# -# INPUT = string-to-parse -# -# Usage example -# -# The first *Received* header will tell when the message was received -# by the mailserver. Parse the date and avoid calling expensive `date' -# command. -# -# PMSRC = $HOME/pm -# RC_DATE_WMDT = $PMSRC/pm-jadate4.rc #Week-Month-Day-Time parser -# -# # Get time from X-From-Line: Which was added by my MDA -# # X-From-Line: procmail-request@informatik.rwth-aachen.de \ -# # Tue Nov 25 19:32:57 1997 -# -# :0 c -# *$ ^X-From-Line:\/.* -# { -# INPUT = $MATCH -# -# # Turn off the logging while executing subroutine -# -# VERBOSE=off INCLUDERC = $RC_DATE_WMDT VERBOSE=on -# -# :0 -# * ERROR ?? yes -# { -# # Use some other way to get the time or shout loudly -# } -# } -# -# Change Log (none) - -# .................................................... &initialising ... - - -id = "pm-jadate3.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ..................................................... &output-vars ... -# output variables - - -# Kill following variables, listed one by one here: - -YYYY MM MON DD DAY hh mm ss - -ERROR = "yes" # set defualt value - -# ........................................................... &do-it ... -# Check that input is something like: Thu, 13 Nov 1997 - -dummy = "$id: Parse date like [Tue Nov 25 19:32:57 19:00:00 1997]" -dummy = "$id: INPUT = $INPUT" # show what we try to match - -:0 D -* INPUT ?? $ $s*\/[SMTWF]$a$a[,$WSPC]+$a$a$a$s+$d+$s+$d$d:.* -{ - - INPUT = $MATCH - - :0 D - * INPUT ?? ^\/[A-Z].. - { - DAY = $MATCH - } - - :0 D - *$ INPUT ?? ^...[,$WSPC]\/[A-Z].. - { - MON = $MATCH - } - - - :0 - *$ INPUT ?? ^...[,$WSPC]...$s+\/$d$d - { - DD = $MATCH - } - :0 E # else - *$ INPUT ?? ^...[,$WSPC]...$s+\/$d - { - DD = "0$MATCH" - } - - - # ........................................................ &time ... - # Move to hh:mm:ss section - - :0 - *$ INPUT ?? ^...[,$WSPC]...+$s$d+$s+\/.* - { - INPUT = $MATCH - } - - :0 - *$ INPUT ?? ^\/$d$d - { - hh = $MATCH - } - - :0 - *$ INPUT ?? ^..:\/$d$d - { - mm = $MATCH - } - - - :0 - *$ INPUT ?? ^..:..:\/$d$d - { ss = $MATCH } - - - # ........................................................ &year ... - - :0 - *$ INPUT ?? ^..:..:..$s+\/$d$d$d$d - { - YYYY = $MATCH - } - - # If this last recipe succeeds, then the whole string has been parsed. - - :0 - * YYYY ?? ^..\/.. - { - YY = $MATCH ERROR = "no" - } - - - # Now reverse engineer to the numer, David Tamkin <dattier@miso.wwa.com> - # technically one should use $\monthnym but here it doesn't matter - # If user gave invalid input, will not match - - :0 - *$ mm2nbr ?? $MON\/.. - { - MM = $MATCH - } -} - -dummy = "$id: end:" - -# end of file pm-jadate.rc diff --git a/src/procmail/pm-jadate4.rc b/src/procmail/pm-jadate4.rc @@ -1,125 +0,0 @@ -# pm-jadate4.rc -- make RFC 'Mon, 1 Dec 1997 17:41:09' and parse values -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This subroutine calls shell command date once and prses the values. -# This should be your last resort if you haven't got the date values -# by any other means. This subroutine assumes that the DATE command -# knows the following % specifier formats (HP-UX) -# -# Y NNNN year -# h MON month -# d NN day -# a WEEK Like "Mon" -# H NN hour -# M NN min -# S NN sec -# -# Returned values -# -# DATE = RFC date in format "Mon, 1 Dec 1997 17:41:09" -# This is same as what you would see in From_ -# -# YYYY = 4 digits -# YY = 2 digits -# MON = 3 characters -# MM = 2 digits -# DAY = 3 characters -# DD = 2 digits -# hh = 2 digits -# mm = 2 digits -# ss = 2 sigits -# -# Variable ERROR is set to "yes" if values couldn't be set -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include -# -# o pm-javar.rc -# o pm-jadate1.rc -# -# Call arguments (variables to set before calling) -# -# (none) -# -# Usage example -# -# The First Received line will tell when the message was received by -# the MDA. If thata fails, then get date from the system. If you send -# test messages to # yourself, you don't usually put From_ header in -# it and thus there is # no date information in 'dry run' tests. -# -# # Get time from first eader, which is always same in my system -# # Received: ... ; Thu, 13 Nov 1997 11:43:50 +0200 -# -# INCLUDERC = $PMSRC/pm-javar.rc # to get $s $d definitions -# TODAY # Clear it -# -# :0 -# *$ ^Received:.*;$s+\/...,$s+$d.* -# { -# INPUT = $MATCH -# INCLUDERC = $PMSRC/pm-jadate1.rc -# TODAY = "$YYYY-$MM-$DD" -# } -# -# # Check that variable did get set, if not then we have to call -# # another date subroutine: Call shell then to find out date -# # -# # You could also do this with ':0 E', but this is more -# # educational -# -# :0 -# *$ ! $TODAY^0 -# { -# INCLUDERC = $PMSRC/pm-jadate4.rc # Get date from Shell then -# TODAY = $YYYY-$MM-$DD -# } -# -# Change Log (none) - -# .................................................... &initialising ... - - -id = "pm-jadat4.rc" -dummy = " -======================================================================== -$id: init: -" - -# ..................................................... &output-vars ... -# output variables, these actually come from the another subroutine, -# but let's mention them here too - -# DATE YYYY MM MON DD DAY hh mm ss - -# ........................................................... &do-it ... -# Check that input is something like: Thu, 13 Nov 1997 - -dummy = "$id: Calling shell to get date" - -date = `$DATE "+%a, %d %h %Y %H:%M:%S"` -INPUT = $date - -INCLUDERC = $RC_DATE1 # ...And parse into return variables - -dummy = "$id: end:" - -# end of file pm-jadate4.rc diff --git a/src/procmail/pm-jadate5.rc b/src/procmail/pm-jadate5.rc @@ -1,227 +0,0 @@ -# pm-jadate5.rc -- 'Fri Jun 19 18:51:56 1998' date parser from var INPUT -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This includerc parses date from variable INPUT which has string -# -# "WeekDay Month dayNbr Year" -# -# Example input -# -# "Fri Jun 19 18:51:56 1998" -- without comma -# "Fri, Jun 19 18:51:56 1998" -- with comma -# -# Returned values -# -# YYYY = 4 digits -# YY = 2 digits -# MON = 3 characters -# MM = 2 digits -# DAY = 3 characters -# DD = 2 digits -# hh = 2 digits If available -# mm = 2 digits If available -# ss = 2 digits If available -# TZ = 5 characters If available -# -# Variable ERROR is set to "yes" if it couldn't recognize the INPUT -# and couldn't parse the basic YYYY,YY,MM,DD variables. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include pm-javar.rc from there. -# -# Call arguments (variables to set before calling) -# -# INPUT = string-to-parse -# -# The INPUT can have anything after "Week, dayNbr Month Year", or -# before it: you can pass a string like -# "Fri Jun 19 18:51:56 1998 11:43:23 +0200". -# -# Usage example -# -# The first *Received* header will tell when the message was received -# by your mailserver. We parse the date and avoid calling expensive -# `date' command. -# -# PMSRC = $HOME/pm -# RC_DATE_WDMY = $PMSRC/pm-jadate5.rc #Week-Day-Month-Year parser -# -# # Get time from first header, it ends like this: -# -# :0 -# *$ ()\/From .* -# { -# INPUT = $MATCH -# # Turn off the logging while executing this part -# -# VERBOSE=off INCLUDERC = $RC_DATE_WDMY VERBOSE=on -# -# :0 -# * ERROR ?? yes -# { -# # Use some other way to get the time or shout loudly -# } -# } -# -# Change Log (none) - -# .................................................... &initialising ... - - -id = "pm-jadate5.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ..................................................... &output-vars ... -# output variables - -# Kill following variables - -YYYY MM MON DD DAY hh mm ss TZ - -# Set to default - -ERROR = "yes" # set defualt value - -# ........................................................... &do-it ... -# Check that input is something like: Thu, 13 Nov 1997 - -dummy = "$id: Parse: Fri Jun 19 18:51:56 1998" -dummy = "$id: INPUT = $INPUT" # show what we try to match - -:0 D -*$ INPUT ?? ()\/[SMTWF]$a$a[,$WSPC]+$a$a$a$s$d+$s+.* -{ - INPUT = $MATCH - - :0 - * INPUT ?? ^\/... - { - DAY = $MATCH - } - - :0 - *$ INPUT ?? ^...[,$WSPC]+\/... - { - MON = $MATCH - } - - # Move to the DD MON section - - :0 - *$ INPUT ?? ^...[,$WSPC]+...$s+\/.* - { - INPUT = $MATCH - } - - # ........................................................ &date ... - - :0 - *$ INPUT ?? ^\/$d$d - { - DD = $MATCH - } - :0 E # else - *$ INPUT ?? ^\/$d - { - DD = "0$MATCH" - } - - - # ........................................................ &time ... - # Change INPUT - - in = $INPUT # just for logging purposes - - :0 - *$ INPUT ?? ^$d+$s+\/.* - { - INPUT = $MATCH - } - - - :0 - *$ INPUT ?? ^\/$d$d - { - hh = $MATCH - } - - :0 - *$ INPUT ?? ^$d$d:\/$d$d - { - mm = $MATCH - } - - - :0 - *$ INPUT ?? ^$d$d:$d$d:\/$d$d - { - ss = $MATCH - } - - :0 - *$ INPUT ?? ^$d$d:$d$d:$d$d$s+\/[-+].... - { - TZ = $MATCH - } - - - # ........................................................ &year ... - - :0 - *$ INPUT ?? ^$d+:$d+:$d+$s+\/.... - { - YYYY = $MATCH - } - - - # If this last recipe succeeds, then the whole string has been parsed. - # - :0 - * YYYY ?? ..\/.. - { - YY = $MATCH - ERROR = "no" - } - - - # Now reverse engineer to the numer, David Tamkin <dattier@miso.wwa.com> - # technically one should use $\monthnym but here it doesn't matter - # If user gave invalid input, will not match - - :0 - * $ mm2nbr ?? $MON\/.. - { - MM = $MATCH - } -} - -dummy = "$id: end:" - -# end of file pm-jadate.rc diff --git a/src/procmail/pm-jadup.rc b/src/procmail/pm-jadup.rc @@ -1,138 +0,0 @@ -# pm-jadup.rc -- Procmail: Handle duplicates; store to separate folder -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This recipe stores duplicate messages to separate folder -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include -# -# o pm-javar.rc -# o pm-jastore.rc -# -# Call arguments (variables to set before calling) -# -# o JA_ID_CACHE, Where to keep the Message-Id cache. -# o JA_ID_CACHE_SIZE, how big cache, defualt is 8192 -# o JA_ID_MBOX, where to store duplicate messages -# when delivering message to duplicate mbox. -# o JA_ID_IGNORE, if set to "yes", then ignore duplicate check -# -# Return values -# -# o Variable ERROR is set to "yes" if duplicate message was trapped, -# otherwise value is "no" -# -# Usage Example -# -# For simple usage, just put this somewhere after backup recipes -# -# RC_DUP = $PMSRC/pm-jadup.rc -# ... -# INCLUDERC = $RC_DUP -# -# When you are testing messages, you send them over and over to -# .procmailrc; which means that same message should not be trapped by -# duplicate check. You can call `procmail' with option "-a test" which will -# set pseudo variable `$1'. The recipe below sets flag `JA_ID_IGNORE' -# to "yes" if test is on going and the duplicate filter should be -# bypassed. -# -# RC_DUP = $PMSRC/pm-jadup.rc -# ARG = $1 # Copy pseudo variable to $ARG -# -# :0 -# * ARG ?? test -# { -# JA_ID_IGNORE = "yes" -# } -# -# # Some microsoft product is known to send same message ids -# # over and over. If we detect one, tunr off the duplicate test, -# # because it would trash every message. -# # <MAPI.Id.0016.00666479202020203030303430303034@MAPI.to.RFC822> -# -# :0 -# * ! ^X-msmail -# * ! ^Message-ID: *<MAPI.*@MAPI.to.RFC822> -# { -# JA_ID_IGNORE = "yes" -# } -# -# # Run this command every time a duplicate message is found. -# # It writes a small log entry to MY_LOG -# -# INCLUDERC = $RC_DUP -# -# :0 hwic: -# * ERROR ?? yes -# | echo " [duplicate]" >> $BIFF -# -# Change Log: (none) - -# ............................................................ &code ... - - -id = "pm-jadup.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ..................................................... &output-vars ... -# output variables - -ERROR = "no" - -# .......................................................... &public ... - -JA_ID_CACHE = ${JA_ID_CACHE:-"$HOME/pm-msgid.cache"} -JA_ID_CACHE_SIZE = ${JA_ID_CACHE_SIZE:-8192} -JA_ID_MBOX = ${JA_ID_MBOX:-"junk.duplicates"} -JA_ID_IGNORE = ${JA_ID_IGNORE:-"no"} - -# ........................................................... &do-it ... - -# We need regional lock, because `formail' is run in condition statement. - -jaDupLOCKFILE = $LOCKFILE # save old lockfile -LOCKFILE = ${JA_ID_CACHE}.lock - -:0 -* ^Message-Id: -* JA_ID_IGNORE ?? no -* ? $FORMAIL -D $JA_ID_CACHE_SIZE $JA_ID_CACHE -{ - ERROR = "yes" # Flag duplicate to caller - MBOX = $JA_ID_MBOX - INCLUDERC = $PMSRC/pm-jastore.rc -} - -LOCKFILE = $jaDupLOCKFILE # restore value - -dummy = "$id: end: (DUPLICATE status = $ERROR)" - -# end of file diff --git a/src/procmail/pm-jaempty.rc b/src/procmail/pm-jaempty.rc @@ -1,86 +0,0 @@ -# pm-jaempty.rc -- check if message body is empty -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This simple includerc will define variable BODY_EMPTY to "yes" or -# "no" when called like this You can file empty messages to separate -# folder based on this value -# -# INCLUDERC = $PMSRC/pm-jaempty.rc -# -# :0 -# * BODY_EMPTY ?? yes -# the-empty-mail-folder -# -# This is more designed to be part of other modules. If you just want -# to check for empty message, a simpler recipe like this might be -# better: -# -# INCLUDERC = $PMSRC/pm-javar.rc -# -# :0 B: # if body has only whitespace characters -# *$ ! $NSPC -# the-empty-mail-folder -# -# Required settings -# -# (none) -# -# Change Log (none) - -# ............................................................ &init ... - - -id = "pm-jaempty.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ........................................................... &do-it ... - -BODY_EMPTY = "yes" - -# Every empty line or signarure start is a -1 -# -# Every non-empty line that has characters is +10 -# -:0 -*$ B ?? -1^1 ^$s*$|^-- -* B ?? 10^1 ^.*[a-z] -{ - # no-op. We just count the score value. -} - -SCORE = $= - -:0 -*$ ${SCORE}^0 -{ - BODY_EMPTY = "no" -} - -dummy = "$id: end:" - -# end of file pm-jaempty.rc diff --git a/src/procmail/pm-jafrom.rc b/src/procmail/pm-jafrom.rc @@ -1,93 +0,0 @@ -# pm-jafrom.rc -- get message's best FROM field without calling `formail' -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This includerc extracts the most likely FROM address from the -# message. The order of the search is Reply-to, From_, Sender, From -# and if none found, then as a last resort, call `formail'. You would -# usually use the returned value for logging purposes. -# -# Avoiding extra formail call could be usefull if you receive lot -# of messages per day. -# -# Example input -# -# (none) -# -# Returned values -# -# OUTPUT, containing the derived FROM field -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include pm-javar.rc from there. You nee procmail 3.11pre7 in -# order to use this subroutine. (due to formail -z switch) -# -# Call arguments (variables to set before calling) -# -# (none) -# -# Usage example -# -# INCLUDERC = $PMSRC/pm-jafrom.rc -# FROM = $OUTPUT # now we have the 'best' FROM field -# -# Change Log (none) - -# .................................................... &initialising ... - -id = "pm-jafrom.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ..................................................... &output-vars ... -# output variables - -OUTPUT - -# ........................................................... &do-it ... -# Check that input is something like: Thu, 13 Nov 1997 - -dummy = "$id: Get message's FROM field." - -:0 -*$ ! ^Reply-to: *\/$NSPC.* -*$ ! ^From: *\/$NSPC.* -*$ ! ^Sender: *\/$NSPC.* -*$ ! ^From *\/$NSPC+ -{ - OUTPUT = `formail -zxFrom:` -} -:0 E -{ - OUTPUT = $MATCH -} - - -dummy = "$id: end:" - -# end of file pm-jafrom.rc diff --git a/src/procmail/pm-jafwd.rc b/src/procmail/pm-jafwd.rc @@ -1,401 +0,0 @@ -# pm-jafwd.rc -- Controlling forwarding remotedly -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Overview of features -# -# o Requires latest procmail (formail -z switch) -# o You can send forward-on and forward-off control -# messages via email to control the forwarding in remote site. -# -# Description -# -# This includerc makes it possible to control your message forwarding -# via simple remote email message. Thanks to Era Eriksson and Timothy -# J Luoma who gave the initial idea to this forwarding module in the -# procmail mailing list 1997-10-07. -# -# Activating the forwarding by hand -# -# If you want to activate the forwarding from the local site where -# this module is, then you could simply write the forward address -# to the file pointed by *JA_FWD_FILE* which is `~/.forward-address' -# by default. -# -# % echo Me@somewhere.com > ~/.forward-address -# -# and when you no longer need forwarding, then remove that file. -# But really, this module is not used for that purpose, because it is -# lot easier to write -# -# :0 -# ! Me@somewhere.com -# -# as a first statement in your .procmailrc when you want to forward -# your mail to another account. -# -# Activating the forwarding by remote email -# -# Suppose you're on the road and suddenly realize that you want your -# mail forwarded to the current account, then you send following -# control message -# -# Subject: forward-on password new-address@bar.com -# To: my-account@bar.com -# From: onTheRoad@some.com -# -# That message is is enough to get the mail forwarded to the address -# new-address@bar.com This script will respond to address From that -# the current forwarding is now pointing to address -# "new-address@bar.com". -# -# Deactivating forwarding by remote email -# -# The message is very similar, but the Subject header says -# -# Subject: forward-off password -# -# And no other fields are checked. Not even Reply-To. In this case -# the confirmation message is sent directly back to From address. -# -# Activating forwarding via body message -# -# If for some reason you have no control over the headers of email, -# eg when you send GSM-Mail message from your phone to your account: -# -# EMAIL foo@bar.com FORWARD-ON PASSWORD new-address@bar.com -# -# The email message looks like this: -# -# From: GenEmail <sms@FooBar.net> -# Date: Thu Sep 17, 11:42am +0200 -# To: "'Foo.Bar'" <foo@bar.com> -# Subject: Message 03384874987 -# -# FORWARD-ON PASSWORD new-address@bar.com -# -# Instead of looking at the `Subject' field, you can get this module -# to look at the first words in the body field. See variable -# `JA_FWD_CONTROL_FIELD' which you want to set to "body". -# -# Restricting the control message aceptance -# -# If you only have persistent accounts, then you should set the -# *JA_FWD_FROM_MUST_MATCH* to match those addresses that you have. -# The following setting says that only control messages sent from -# these addresses are accepted. Nobody else can't change your -# forwarding settings. -# -# JA_FWD_FROM_MUST_MATCH = ".*(acc1@a.com|acc2@b.com)" -# -# Hm, that's not a bullet proof, because someone may in theory forge -# the From address. You probably should also set this variable to -# point to accounts where the mail can be legally forwarded to. Then, -# even if the imposter forges the From address; he can't get the -# email forwarded anywhere else than to the valid locations. -# -# JA_FWD_TO_MUST_MATCH = $JA_FWD_FROM_MUST_MATCH -# -# Consider also setting *JA_FWD_PASSWORD_CASE* to Procmail flag -# `D' which causes your control word "forward-on" and password -# to be case sensitive. -# -# Diagnostics -# -# If you don't receive confirmation message, then your control -# message was ill formed or you're not in the *JA_FWD_FROM_MUST_MATCH* -# list. There is no notification sent on failure, so that no attacker -# can draw conclusions. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include -# -# o pm-javar.rc -# -# Installation -# -# You should preset all necessary variables prior adding the -# includerc command to your .procmailrc. Here is one simple setup -# -# #JA_FWD_SENDMAIL = "tee $HOME/test.mail" # Uncomment if testing -# JA_FWD_COPY = no # no copies stored while forwarding -# JA_FWD_PASSWORD_CASE= "D" # case sensitive -# JA_FWD_PASSWORD = "MyMagicString" -# JA_FWD_FROM = $FROM # This is already known. -# INCLUDERC = $PMSRC/pm-jafwd.rc -# -# Comments from the author -# -# Please realise that when you set the forwarding from a remote site, -# be very carefull when you type in the forward address or your mail -# ends up to somebody else's mailbox. Also I recommend that you keep -# *JA_FWD_COPY* to *yes* so that your local account always keep the -# copy of forwarded message. -# -# A step further would conventionally encrypt(1)'ing your forwarded -# messages. This way even your top secret messages would be mostly safe -# even if they end up to someone else's mailbox. -# -# File layout -# -# The layout of this file is managed by Emacs packages folding.el/{{{}}} -# tinybm.el/&tags and tinytab.el for the 4 tab text placement. -# -# Change Log (none) - - -# {{{ Variables -# .................................................... &initialising ... - - -id = "pm-jafwd.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ....................................................... &variables ... - -# If you're testing, set this to "tee FILE", and the sent confirmation -# messages are stored to your disk and not actually mailed. - -JA_FWD_SENDMAIL = ${JA_FWD_SENDMAIL:-"sendmail -oi -t"} - -# File to hold the forward address. When forward is off, this file does -# not exist. - -JA_FWD_FILE = ${JA_FWD_FILE:-"$HOME/.forward-address"} - -# The password needed after the control command. - -JA_FWD_PASSWORD = ${JA_FWD_PASSWORD:-"password"} - -# If you want case sensitive control messages and passwords, -# set this variable to procmail flag "D". Then commands like below -# are different. You should use flag `D' for your own security. -# -# forward-on password -# Forward-on password - -JA_FWD_PASSWORD_CASE = ${JA_FWD_PASSWORD_CASE:-""} - -# Set this to account names and addresses that you use if you want some -# protection. The control messages can be sent only from the matched -# addresses only. The default "." accepts control message from anywhere -# and to be forwarded anywhere. - -JA_FWD_FROM_MUST_MATCH = ${JA_FWD_FROM_MUST_MATCH:-"."} -JA_FWD_TO_MUST_MATCH = ${JA_FWD_TO_MUST_MATCH:-"."} - -# Should the messages stored locally to this account too while forwarding -# messages? a good idea is to keep this "yes", because you never know if -# the forward address was faulty. - -JA_FWD_COPY = ${JA_FWD_COPY:-"yes"} - -# The accepted control messages in Subject field - -JA_FWD_ON = ${JA_FWD_ON:-"forward-on"} -JA_FWD_OFF = ${JA_FWD_OFF:-"forward-off"} - -# Initialize these variables unless they're already set. please set -# before this module, so that you save extra formail call, if you have -# already read the value. -# -# JA_FWD_FROM = $FROM - -JA_FWD_FROM = ${JA_FWD_FROM:-`$FORMAIL -zxFrom:`} - -# From which header to find the password information. -# -# o "header" Look Subject field. -# o "body" Look first words in the body of message -# - -JA_FWD_CONTROL_FIELD = ${JA_FWD_CONTROL_FIELD:-"subject"} - -# This has only meanng if `JA_FWD_CONTROL_FIELD' is set to "body" -# -# "^^" "forward-on password" must be at the very beginning -# of the body -# ".*" "forward-on password" can be anywhere in the body - -JA_FWD_CONTROL_REGEXP = ".*" - -# If the address where we're forwarding bounces, make sure -# we don't get into loop. - -JA_FWD_XLOOP = ${JA_FWD_XLOOP:-"$LOGNAME@$HOST"} - -# }}} -# {{{ Code - -dummy = "Check forward-off control message" - -# ..................................................... &state-check ... - -forward = "" -address = "" - -dummy = "$id: Check if control message is in the Subject" - -:0 -* JA_FWD_CONTROL_FIELD ?? subject -*$ ^From:$JA_FWD_FROM_MUST_MATCH -{ - - :0 $JA_FWD_PASSWORD_CASE - *$ ^Subject: $JA_FWD_OFF ${JA_FWD_PASSWORD}$ - { - forward = "off" - } - - :0 E $JA_FWD_PASSWORD_CASE - *$ ^Subject: $JA_FWD_ON ${JA_FWD_PASSWORD} \/.* - *$ MATCH ?? $JA_FWD_TO_MUST_MATCH - { - forward = "on" - address = "$MATCH" - } -} - -dummy = "$id: Check if control message is in the body" - -:0 E -* JA_FWD_CONTROL_FIELD ?? body -*$ ^From:$JA_FWD_FROM_MUST_MATCH -{ - :0 $JA_FWD_PASSWORD_CASE - *$ B ?? $JA_FWD_CONTROL_REGEXP$JA_FWD_OFF ${JA_FWD_PASSWORD} - { - forward = "off" - } - - :0 E $JA_FWD_PASSWORD_CASE - *$ B ?? $JA_FWD_CONTROL_REGEXP$JA_FWD_ON ${JA_FWD_PASSWORD} \/.* - *$ MATCH ?? $JA_FWD_TO_MUST_MATCH - { - forward = "on" - address = "$MATCH" - } -} - -# ............................................................. &off ... - -dummy = "$id: check forward OFF" - -:0 -* forward ?? off -{ - :0 hwic - * ? $IS_EXIST $JA_FWD_FILE - | $RM $JA_FWD_FILE - - # Kill all fields except the From and make reply to that address. - - subject = "Forward is now off." - - :0 wc - | ( $FORMAIL -X From: | \ - $FORMAIL -rt -I"Subject: $subject" \ - ) | $JA_FWD_SENDMAIL - -} - - -# .............................................................. &on ... -# It's important that we don't forward mailer daemon messages -# of self bounces. The X-Loop was attached by us and while -# the FROM_DAEMON would already trigger bounce message, we double -# check with X-Loop - - -dummy = "$id: check forward ON $address" - -:0 E -* forward ?? on -*$ ! ^X-Loop: $JA_FWD_XLOOP -*$ ! $JA_FROM_DAEMON -{ - - # Beware invalid address. The required @ character prevents from - # at least some mistakes. - - :0 c - *$ address ?? [^$WSPC]+@ - | echo "$address" > $JA_FWD_FILE - - # - formail -rt will use Reply-To but we also CC to the 'From:' address. - # - If the From and Reply to are the same, then this sends two messages - # but that's not a bad thing. - # - The `A' says that this recipe is executed only if the - # previous recipe put the `address' to `JA_FWD_FILE' - - subject = "Forwarding to [$address]" - - :0 Ahwc - | ( $FORMAIL -IReply-To: | \ - $FORMAIL -rt \ - -I"Subject: $subject" -I"CC: $JA_FWD_FROM"; \ - -i"X-Loop: $JA_FWD_XLOOP" \ - echo "Forwarding has been activated" \ - ) | $JA_FWD_SENDMAIL - -} - -# .................................................... do-forwarding ... -# Now do the forwarding -# File tests: -# -# s => file exists and has a size greater than zero -# r => file must be readable by us - -dummy = "$NL$NL$id: Check if forward is activated $NL" - -:0 -* forward ?? ^^^^ -*$ ? $IS_NOT_EMPTY $JA_FWD_FILE -*$ ? $IS_READABLE $JA_FWD_FILE -{ - # If the copy option is on, store the mail also locally - # and send a copy to forwarded address. - # - # The `E' Receipe only forwards and does not keep local copy. - - :0 - *$ JA_FWD_COPY ?? yes - { - :0 c - ! `$CAT $JA_FWD_FILE` - } - :0 E - ! `$CAT $JA_FWD_FILE` -} - -dummy = "$id: end:" - -# }}} - - -# pm-jafwd.rc ends here diff --git a/src/procmail/pm-jalist.rc b/src/procmail/pm-jalist.rc @@ -1,1866 +0,0 @@ -# pm-jalist.rc -- Subroutine to detect mailing LIST from message. -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This subroutine tries to detect and derive the mailing list name as -# it appears in some of the known methods that ezlm, smarlist, -# listserv, majordomo etc. normally use. After this subroutine has -# been applied to message the variable `LIST' contains the mailing -# list name. Subroutine adaptively finds new new mailing lists -# from the messages. -# -# The alternative to subscribing to many mailing lists is to read -# them from web archives. Even better way is to use NNTP server at -# http://www.gmane.org which allows you to post as you would to a -# regular newsgroup. Consider using the NNTP interface and you may -# save you from receiving lot of messages that can already be found -# from Gmane's server. -# -# Quick start -# -# If you just want to jump in and use this module and you -# noteice that some list isn't trapped, please set -# -# o JA_LIST_HEADER_REGEXP to match the From: field -# -# If you want to make some list more unique, like if name "Alert" -# was detected as a list name, please set -# -# o JA_LIST_MAKE_UNIQUE to match the list name, like "Alert". -# After that the list name will be converted to HOST-LIST format. -# -# Sendmail plus type method for list subscription -# -# If you can use sendmail type PLUS addressing capabilities, you may -# not be interested in this module, because you have an alternative -# way to handle mailing list messages. The extra information after -# "+" is available to procmail scripts via `$ARG' pseudo variable -# when procmail is the LDA. Let's suppose you want to subscribe to -# procmail mailing list and want to save all messages to folder -# list.procmail, then you'd subscribe with address: -# -# login+list.procmail@site.com -# -# If your email host doe snot provide the plus addressing then it the -# traditiona approach have been to add a piece of recipe to -# `~/.procmailrc' to catch each list. But that's manual work for -# every list. When you use this subroutine, you no longer need to -# write separate mailing list recipes to your `~/.procmailrc' every -# time you subscribe to a new mailing list. The detection of a new -# list will happen automatically. -# -# What you need to know before using this module -# -# There is lot of heuristics going on in this module and one thing -# that you must note: -# -# If 'To:' domain is same as `From/Sender:/Reply-to:' domain -# then it is considered a mailing list message. -# -# This causes certain messages to be treated as mailing list messages. -# The module can't possibly know that the following is not from -# mailing list, because it doesn't know "what is mailing list", only -# "how it probably looks like it". This is definitedly categorized as -# mailing list message, because `From' and even `Reply-to' has the same -# domain `foo.bar.net' as in `To'. -# -# To: support@foo.bar.net -# From: message@foo.bar.net -# Reply-to: support@foo.bar.net -# Subject: Vmail See message to Eric -# -# You must prevent checking messages like this by surrounding call -# to this subroutine with a check statement: -# -# # Do not check these messages -# -# noList = "From.*(foo.bar.net|support.my.com)" -# -# :0 -# *$ ! $noList -# { -# INCLUDERC = $RC_LIST -# # ... save messsag by examining variable LIST (which see) -# } -# -# Ask for help -# -# If you find mailing lists that this subroutine does not detect, but -# which could have been detected by looking the headers in standard -# way, please send a email to maintainer. There may be cases where it -# is impossible to detect the mailing list and in those cases you -# just has to carve a new entry to your `~/.procmailrc'. -# When you keep your procmail log running, you may see message -# -# *** potential list *** -# -# Which is an indication that some new recipe could be added to -# to this subroutine to detect that mailing list. If the message -# you received _was_ from a mailing list, please send all the headers -# to the maintainer so that support can be added. -# -# Further reading -# -# You can search for mailing list that interests you at: -# -# http://www.lsoft.com/lists/listref.html -# -# Python based mailing list manager; the mailman: -# -# http://www.list.org/ -# -# Code note: Errors-To -# -# Bill Houle sent interesting headers which caused to add -# more heuristic than was feasible to solve the list detection. -# From the below headers it is practically impossible to derive the -# original list name. So, the list name is artificially constructed -# by combining Reply-To's LOGIN with Errors-To field's first host -# name -# -# Reply-To: news@doodle.foo.net -# Errors-To: bounced@doodle.foo.net -# -# The list name formed is "news-doodle". So, If you happen to see -# an odd name like this which doesn't remind the original list -# name, it may be due to poor headers that have no clue about -# the real name. No problem, check below how you would convert -# this name to better mailbox name. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will followign extra module, which must have been installed. -# -# o pm-javar.rc -# -# Variable JA_LIST_FROM_TO_IGNORE -# -# This is regexp of sender addresses to ignore so that the if To and -# From are identical, it is not considered a list messages. This is -# typical for system generated messages that take form: -# -# From: root@host (Cron Daemon) -# To: root@host -# -# Variable JA_LIST_SAVE -# -# If set to "yes" then the list name information detected is saved to -# separate header. The `LIST_DETECTED' is the original grabbed word from -# the headers and the 'LIST' is the final name after possible -# list name conversions. According to RFC the X- can be user for -# user headers. -# -# X-List-Detected: $LIST_DETECTED mapped to $LIST -# -# Variable JA_LIST_KILL_POSTFIX -# -# If grabbed `LIST' match this regexp at the end of list name, then -# the postfix match will be removed. It is traditional that many -# list names are like list1-info, list2-beta, list3-L and ut would -# be preferable to see names like list1, list2 and list3. The -# default value will ditch "-(info|beta|L)". -# -# Variable JA_LIST_KILL_PREFIX -# -# Just like the postfix variable. If this string is matched at the -# beginning of the LIST, it is removed. -# -# Variable JA_LIST_DISREGARD_EMAIL -# -# In some cases this list detection recipe "thinks" that the address -# picked is the list sender. You may have a dedicated address where -# all you mailing list mails arrive and you have named it like -# mailing-list@me.here.at, which will effectively trigger: Ah, -# you have -list in email address, so this message must be from -# mailing list name 'mailing'. Of course it is not and you have to -# disallow the heuristics to make such assumption by defining a -# regexp that rejects a possible choice. For the above example, you -# would define: -# -# JA_LIST_DISREGARD_EMAIL = "posting-list@me.here.at" -# -# If you have several such addresses, just add them to the -# variable separating with normal regular expression "|" OR -# statement. -# -# Variable JA_LIST_HEADER_REGEXP -# -# This is *optional* variable, which you can set to match regexp of -# the mailing list domain address if it slipped through the tests -# in this module. There are some lists that send messages that don't -# carry enough information in headers to determine their list status. -# If you narrow the group by setting JA_LIST_HEADER_REGEXP, then for -# example lists like these, that identify themselves only through -# two headers, can be found: -# -# Reply-To: dispatch-faq@cnet.com -# From: CNET Digital Dispatch <dispatch@cnet.com> -# -# For that list you would set -# -# JA_LIST_HEADER_REGEXP = "(@cnet\.com)" -# -# Don't worry. all the other list detection recipes has already -# been tried, so this is last test that are carried out and variable -# JA_LIST_HEADER_REGEXP helps eliminating possible mishist -# -# You don't need set this variable to include all mailing list -# domains. Only to those ones that were not trapped. The default -# value for this is: -# -# "(amazon\.com|bookpool\.com)" -# -# Variable JA_LIST_MAKE_UNIQUE -# -# If you're subscribed to many mailing lists, that simply tell that -# they are *news* or *newsletter*, it will be impossible to -# differiantiate A *news* from B *news*. This variable holds regular -# expression that, if matched, prepend the first host name to the -# beginning of list name, thus making the list unique: -# -# news@some.com --> some-news -# news@here.com --> here-news -# -# The default value matches lists that contain word *news*, but you -# may need to set this to more matches. -# -# Variable JA_LIST_CONVERSION -# -# Note: before using this feature, make sure your `LINEBUF' -# is big enough, say 4096 or otherwise the variable's content -# is truncated. -# -# Many times the grabbed `LIST' name is not what you would like to -# use for your mailbox name. You want to make the name perhaps -# more shorter, more descriptive or categorize the messages according -# to hierarchy. Let's say that you have subscribed to following mailing -# lists: -# -# LIST LIST name Description of mailing list -# (as grabbed) you want -# ------------------------------------------------------------- -# jde java.jde Java Development Env -# java java.lang Java programming -# FLAMENCO flamenco Flamenco music -# tango-l tango Argentine Tango dancing -# tm-en-help tm-en Emacs TM mime package mailing list -# w3-beta w3 Emacs WWW mailing list -# -# First, remember that the variable `JA_LIST_KILL_POSTFIX' is first -# applied, so the actual `LIST' appears as follows: -# -# jde, java, FLAMENCO, tango, tm-en, w3 -# -# Ok, now we apply the conversion table by defining it as follows. -# The grabbed LIST name is first, then comes space(s), new name -# _and_ terminating colon. Repeat this for each list you want to -# convert. -# -# LIST CONVERSION[,LIST CONVERSION ...] -# -# This gives us table below: notice that entries tango-l, w3-beta -# were not included, because the `JA_LIST_KILL_POSTFIX' already got -# rid of the postfixes. Also note how the uppercase match FLAMENCO is -# converted to more suitable lowercase mailbox name. After you have -# set up this variable you can start saving messages to folders. -# -# JA_LIST_CONVERSION = "\ -# jde java.jde,\ -# java java.lang,\ -# FLAMENCO flamenco,\ -# " -# -# The list conversion is done with pure procmail means, so it is very -# fast. It also means that the conversion is limited to FROM-STRING -# TO-STRING syntax. No wild cards or regular expressions are allowed. -# -# If you consider using an external process, like `sed' or `perl' -# to convert the grabbed list name to something else (when -# `JA_LIST_CONVERSION' method was not enough); think again. For -# each incoming mailing list message you launch external process. -# It is not unusual to receive 700 messages from various mailing -# lists a day, it can be imagined how much load any external -# process would add to the server. Use the grabbed mailing list -# name and `JA_LIST_CONVERSION' table if you care about system -# load. -# -# If you have many mailing lists that use uppercase names, it may be -# tedious to add each mailing list name to `JA_LIST_CONVERSION'. -# Possible alternative is to use very efficient `tr' program -# to convert characters to lowercase. Again; think twice, -# because any extra process could be avoided if `JA_LIST_CONVERSION' -# was used. -# -# :0 -# * ! LIST ?? ^^^^ -# { -# :0 D # still uppercase list name? -# * LIST ?? [A-Z] -# { -# LIST = `echo $LIST | tr A-Z a-z` -# } -# -# :0 : -# list.$LIST -# } -# -# List name is not always the same -# -# One important thing to keep in mind is that when mailing list -# manager sends out list messages, the headers may change. -# This means that the list name grabbed previously changes too. -# This is unfortunate, but it sometimes happens. Let's see an example. -# I was previously receiving messages from Cygwin mailing list named -# `gnu-win32' -# -# To: <gnu-win32@cygnus.com>, "Foo Bar" <foo@example.com> -# -# However, one day that same list was grabbed under name "cygwin", due -# to new header -# -# Mailing-List: contact cygwin-help@sourceware.cygnus.com; run by ezmlm -# Now I had two list names that both should be going to the same -# mailbox. No worries, just add new entry to the translate -# table to convert the new list name to mailbox name: -# -# JA_LIST_CONVERSION = "\ -# gnu-win32 cygwin32,\ -# cygwin cygwin32,\ -# " -# -# Example: basic installation -# -# Here is recipe to save all your mailing list to separate folders. -# If you subscribe to new lists or unsubscribe to lists, you don't -# need to change anything. The grabbed list name will appear -# in variable `LIST' -# -# RC_LIST = $PMSRC/pm-jalist.rc # name the subroutine -# -# ... -# -# # Handle all mailing lists with one subroutine and recipe -# # following it. Set also JA_LIST_CONVERSION before -# # calling this subroutine to cnvert the found list names. -# -# INCLUDERC = $RC_LIST -# imap = # Kill var. Set to "/" to enable -# -# :0 # if list name was grabbed -# * LIST ?? [a-z] -# { -# dummy = "Saving mailing list: $LIST" -# -# :0 w: -# ${imap+".INBOX."}list.$LIST$imap -# } -# -# What's that IMAP thing there, you may wonder. Normally -# procmail delivers to standard mailbox, so the name is -# something like '$MAILDIR/list.abc'. For IMAP, the delivery -# must happen using principle "one file, one message", so -# procmail must deliver to a directory. That's what the added -# `$imap' is there for. It is also customary that IMAP folders -# are prefixed with ".INBOX", so the actual name becomes -# `$MAILDIR/.INBOX.list.abc'. For IMAP there should also -# be proper `MAILDIR=$HOME/Maildir' setting. -# -# Change Log (none) -# -# [Not updated any more - See project's ChangeLog file] -# -# 1998-06-16 dattier@wwa.com (David W. Tamkin) in list.procmail -# Message-Id: <m0ym1M3-001HE1C@tekka.wwa.com> replied to my -# my first announcement of list detection module. I used to use -# `expr' to delete -(help|owner) suffixes in complicated cases, -# but David showed that procmail could do that also. -# -# Now this subroutine does not use shell anywhere and is therefore -# as lightweight as possible and suitable for heavy mailing lists. -# -# 1998-06-30 Teresa Nunes <icecream@alaska.net> reported that -# more list were not trapped. Added new rule to match servers -# that use "@lists." id. Added "estimation" rule. -# -# 1998-08-10 Teresa Nunes <icecream@alaska.net> reported that -# more list were not trapped and <Bill.Houle@sandiegoca.ncr.com> -# sent cases which he labelled "Probably nothing can be done for this -# and this...". Well, suprise to your both. All the examples could -# be detected and list name derived. -# -# 1998-11 and 199-12 Bill Houle <bhoule@sandiegoca.ncr.com> sent -# me numerous new mailing ist message headers that improved detecting -# new mailing lists format a great deal. Thank you very much. -# -# 1999-01 Bill Houle <bhoule@sandiegoca.ncr.com> Still kept -# subscribing to mailing list that were not triggered by this module :-) -# Thank Bill for the samples. -# -# 1999-04 Tony Lam <Tony.Lam@Eng.Sun.Com> suggested adding -# X-List-Detected header and storing the original grabbed word -# to LIST_DETECTED. He also suggested new Received: "for" header -# check for possible mailing list names that contains dash(-). - -# .................................................... &initialising ... - -dummy = " -======================================================================== -pm-jalist.rc: init:" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# .......................................................... &public ... -# tango-l, spam-list-d (discussion) - -# These pre/postfix regexps and they must _not_ contain leading slashes: -# -# "-(help|beta)" Wrong -# "(help|beta)" Right - -JA_LIST_KILL_PREFIX = ${JA_LIST_KILL_PREFIX:-"\ -(return|owner|info|beta|help|announce|users|subscribers)"} - -JA_LIST_KILL_POSTFIX = ${JA_LIST_KILL_POSTFIX:-"\ -(return|owner|info|beta|help|request|digest\ -|announce|users|subscribers|maint\ -|unjoin|join\ -|discuss\ -|errors\ -|on|off|[ld])"} - -# See installation - -JA_LIST_CONVERSION = ${JA_LIST_CONVERSION:-""} -JA_LIST_HEADER_REGEXP = ${JA_LIST_HEADER_REGEXP:-"\ -(amazon\.com|bookpool\.com)"} - -# If we detect plain list name line "news" "announce" or "daily", -# that is too general, because same name can come from several sites. - -JA_LIST_MAKE_UNIQUE = ${JA_LIST_MAKE_UNIQUE:-"\ -^^(news(letters?|[0-9]+)?\ -|talk(tous)?\ -|unjoin|join\ -|announce(ments?)?\ -|daily|scripts?\ -|modules?)\ -^^"} - -JA_LIST_DISREGARD_EMAIL = ${JA_LIST_DISREGARD_EMAIL:-""} - -# Messages that have identical From-To and match this regexp are ignored. - -JA_LIST_FROM_TO_IGNORE = ${JA_LIST_FROM_TO_IGNORE:-\ -"(root|postmaster|webmaster|abuse|spam)"} - -# returned value - -LIST_DETECTED # Kill variable -LIST # Kill variable - -# ........................................................... &check ... - -pfx = "( *<?(mailto:)?)?" -abc = "[^][<>(){}$WSPC?&,@\"\'=]" - -# THIS LINE: Emacs font-lock.el fix to close previous quote(") - - -# Words that are included in the list name, like "food-discuss" - -trigger = "(\ -[ld]\ -|admin\ -|announce\ -|apps\ -|beta\ -|digest\ -|discuss\ -|errors\ -|help\ -|info\ -|join\ -|maint\ -|off -|on -|owner\ -|return\ -|request\ -|subscribers\ -|unjoin\ -|users\ -)" - -from = "(X-From-Line:|X-From:|From:|From )" -from1 = "(X-From-Line:|X-From:|From:)" -to = "((Apparently-)?To:)" - -email = $abc+@$abc+ -agent = (owner|info|errors) - -rc_email = $PMSRC/pm-jaaddr.rc - -# .................................................... &setting-vars ... - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::::::: #FROM" - -# This variable is used as a hint to get a unique list name. -# If not set, then define sender name from $from. - -unique_from = "" - -sender_field = "" -sender_addr = "" -sender_addr2 = "" -sender_site = "" -sender_domain = "" -sender_sub1 = "" -sender_account = "" - -:0 -*$ $SUPREME^0 ^(Sender:|$from1)\/.* -*$ $SUPREME^0 ^From \/.* -{ - sender_field = $MATCH - - # Call subroutine - - save=$VERBOSE - - VERBOSE = "off" - INPUT = $MATCH - INCLUDERC = $rc_email - - VERBOSE=$save - - sender_addr = $ADDRESS # foo@a.b.com - sender_addr2 = $ACCOUNT@$DOMAIN # foo@b.com - - sender_account = $ACCOUNT # foo - sender_domain = $DOMAIN # b.com - sender_site = $SITE # a.b.com - sender_sub1 = $SUB1 - - unique_from = $sender_field -} - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::::::: #TO" - -to_field = "" -to_addr = "" -to_addr2 = "" -to_site = "" -to_account = "" -to_domain = "" -to_sub1 = "" - -:0 -* ^To:\/.* -{ - to_field = $MATCH - - saved = $VERBOSE - - VERBOSE = "off" - INPUT = $to_field - INCLUDERC = $rc_email - - VERBOSE = "$saved" - - to_addr = $ADDRESS - to_addr2 = $ACCOUNT@$DOMAIN - - to_account = $ACCOUNT - to_domain = $DOMAIN - to_site = $SITE - to_sub1 = $SUB1 -} - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::::: #REPLY" - -reply_field = "" -reply_addr = "" -reply_addr2 = "" -reply_account = "" -reply_site = "" -reply_domain = "" -reply_sub1 = "" - -:0 -* ^Reply-To:\/.* -{ - reply_field = $MATCH - - saved = $VERBOSE - - VERBOSE = "off" - INPUT = $reply_field - INCLUDERC = $rc_email - - VERBOSE = "$saved" - - reply_addr = $ADDRESS - reply_addr2 = $ACCOUNT@$DOMAIN - - reply_account = $ACCOUNT - reply_domain = $DOMAIN - reply_site = $SITE - reply_sub1 = $SUB1 -} - -cc_field = "" -cc_addr = "" -cc_addr2 = "" -cc_account = "" -cc_site = "" -cc_domain = "" -cc_sub1 = "" - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::::: #CC" - -:0 -* ^CC: \/[^,]+ -{ - cc_field = $MATCH - - saved = $VERBOSE - - VERBOSE = "off" - INPUT = $cc_field - INCLUDERC = $rc_email - - VERBOSE = "$saved" - - cc_addr = $ADDRESS - cc_addr2 = $ACCOUNT@$DOMAIN - - cc_account = $ACCOUNT - cc_domain = $DOMAIN - cc_site = $SITE - cc_sub1 = $SUB1 -} - -# ....................................................... &microsoft ... - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::: #MICROSOFT" - -# Microsoft mailing lists -# -# From BackOfficeEditor_004060@news.newswire.microsoft.com -# From: "Microsoft TechNet" <MicrosoftTechNet_004@news.newswire.microsoft.com> - -:0* LIST ?? ^^^^ -*$ ^$from.*@news.*.microsoft -{ - :0 - *$ ^$from.*$pfx+\/$abc+_$d+@ - *$ MATCH ?? ()\/$a+ - { - LIST = $MATCH - } -} - -# ................................................. &targetted-catch ... - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::: #LSV" - -# X-LSV-ListID: SPAM-L - -:0 -* LIST ?? ^^^^ -*$ ^X-LSV-ListID:$s+\/$abc+ -{ - LIST = $MATCH -} - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::: #List-Id" - -# -- The first supreme matches both these cases -# -# List-Id: A user list for the exim MTA <exim-users.exim.org> -# List-ID: <java.mysql.com> - -# -- The second supreme mathes this -# -# List-ID: <mailto:java-subscribe@lists.mysql.com> -# List-Id: gnome-print-list.gnome.org - - -dummy = "pm-jalist.rc: List-ID" - -:0 -* LIST ?? ^^^^ -*$ $SUPREME^0 ^List-ID:.*<\/$abc+ -*$ $SUPREME^0 ^List-ID:.*$pfx\/$abc+> -*$ $SUPREME^0 ^List-ID:$s*\/$abc+ -{ - LIST = $MATCH -} - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::: #List-* " - -# More similar headers that can be used ... -# -# Precedence: bulk -# List-Help: <mailto:java-help@lists.mysql.com> -# List-Unsubscribe: <mailto:java-unsubscribe-posting-list=mailandnews.com@lists.mysql.com> -# List-Post: <mailto:java@lists.mysql.com> -# List-Subscribe: <mailto:java-subscribe@lists.mysql.com> -# -# Precedence: list -# List-Help: <mailto:sympa@mandrivalinux.org?subject=help> -# List-Subscribe: <mailto:sympa@mandrivalinux.org?subject=subscribe% -# 20cooker> -# List-Unsubscribe: -# <mailto:sympa@mandrivalinux.org?subject=unsubscribe%20cooker> -# List-Post: <mailto:cooker@mandrivalinux.org> -# List-Owner: <mailto:cooker-request@mandrivalinux.org> - -dummy = "pm-jalist.rc: Other List-* headers" - -:0 -* LIST ?? ^^^^ -*$ $SUPREME^0 ^List-Post:.*<\/$abc+ -*$ $SUPREME^0 ^List-Post:.*$pfx\/$abc+> -*$ $SUPREME^0 ^List-(Un)?Subscribe:.*$pfx\/$abc+> -{ - LIST = $MATCH -} - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::: Mailman" - -# X-Mailman-Version: 1.0 -# Precedence: bulk -# List-Id: LeoCAD Development List <leocad-devel.gerf.org> -# X-Loop: docwhat@gerf.org - -:0 -* ! -* LIST ?? ^^^^ -* ^X-Mailman-Version: -* ^List-Id:[^<]+<\/[^>]+ -{ - dummy = "pm-jalist.rc: Mailman MATCH is $MATCH" - LIST = `echo $MATCH | sed 's/\./@/'` - dummy = "$is: Mailman LIST is $LIST" -} - -# ..................................................... mailing-list ... -# X-Mailing-List: <procmail@informatik.rwth-aachen.de> archive/latest/17987 -# X-Mailing-List: <info-bbdb@xemacs.org> archive/latest/954 -# X-Mailing-List: <efs-help@cuckoo.hpl.hp.com> archive/latest/119 -# X-Mailing-List: <xemacs-beta@xemacs.org> -# Mailing-List: contact jde-help@sunsite.auc.dk; run by ezmlm -# Mailing-List: contact pgp-users-help@joshua.rivertown.net; run by ezmlm -# X-Mailing-List: <procmail@informatik.rwth-aachen.de> archive/latest/22876 - - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: X-Mailing-List1" - -dummy = "pm-jalist.rc: X-Mailing-List AGENT-" - -:0 -* LIST ?? ^^^^ -*$ ^(X-)?Mailing-List:$pfx$agent-\/$abc+@ -{ - LIST = $MATCH -} - -dummy = "pm-jalist.rc: X-Mailing-List non-greedy match" - -:0 -* LIST ?? ^^^^ -*$ ^(X-)?Mailing-List:${pfx}\/$abc+@ -{ - LIST = $MATCH -} - -dummy = "pm-jalist.rc: X-Mailing-List greedy match" - -:0 -* LIST ?? ^^^^ -*$ ^(X-)?Mailing-list:.*${pfx}\/$abc+@ -{ - LIST = $MATCH -} - -# .................................................... &list-headers ... - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::: list-* [$LIST]" - -# A great of good set of headers to pick list name from -# -# List-Software: Lyris Server version 2.54, <http://www.lyris.net> -# List-Subscribe: <mailto:subscribe-perl-win32-users@lyris.activestate.com> -# List-Owner: <mailto:owner-perl-win32-users@lyris.activestate.com> -# List-Help: <mailto:help@lyris.activestate.com> -# X-List-Host: ActiveState Tool Corp. <http://www.activestate.com> -# Reply-To: "Christopher Maujean (Volt Computer)" <a-chrism@microsoft.com> -# Sender: perl-win32-users-admin@lyris.activestate.com -# Precedence: bulk -# X-Lyris-To: [foo@example.com] -# X-Lyris-MemberID: 45971 -# X-Lyris-MessageID: 32936 -# X-listname: perl-win32-users -# X-ListMember: [foo@example.com] - -:0 -* LIST ?? ^^^^ -*$ ^X-Listname:$s+\/$abc+ -{ - LIST = $MATCH -} - -:0 -* LIST ?? ^^^^ -*$ ^List-Owner:$pfx$agent-\/$abc+@ -{ - LIST = $MATCH -} - -# List-Unsubscribe: <mailto:leave-jscript-146465L@ls.activeserverpages.com> -# List-Unsubscribe: unsubscribe network-computing-newsletter - -:0 -* LIST ?? ^^^^ -*$ $SUPREME^0 ^List-Unsubscribe: +unsubscribe$pfx\/$abc+ -*$ $SUPREME^0 ^List-Unsubscribe:$pfx\/$abc+ -{ - - LIST = $MATCH - - :0 - * ^List-Unsubscribe:\/.* - { - unique_from = $MATCH - } - - # Check if there is Reply-To and narrow "leave-jscript-146465L" to - # "jscript" by searching common match. - - :0 - *$ $SUPREME^0 ^Reply-To:.*[<]\/$abc+ - *$ $SUPREME^0 ^Reply-To:.*$pfx\/$abc+ - { - replyToListName = $MATCH - - dummy = "pm-jalist.rc: is replyToListName included in List-Unsubscribe?" - - :0 - *$ LIST ?? $replyToListName - { - LIST = $replyToListName - } - } -} - -# ........................................................ &triggers ... - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::: TO #TRIGGER" - -# Just impossible to know that this is list....without -discuss keyword - -# From list-relay@mlist.ucsd.edu Fri Jan 22 20:13:07 1999 -# Sender: foo@bar.com -# From: foo@bar.com -# To: <fhs-discuss@ucsd.edu> - -:0 -* LIST ?? ^^^^ -*$ ^To:$pfx\/$abc+-$trigger@ -{ - LIST = $MATCH - unique_from = $to_field -} - -# ...................................................... envelope-to ... -# X-Envelope-to: tango-L@mitvma.mit.edu - -dummy = "pm-jalist.rc: TRY X-Envelope-to" - -:0 -* LIST ?? ^^^^ -*$ ^X-Envelope-to:${pfx}\/$abc+ -{ - LIST = $MATCH -} - -# ........................................................... sender ... -# Sender: Discussion of Any Aspect of the Argentine Tango -# <TANGO-L@MITVMA.MIT.EDU> -# Sender: Open discussion of TI Graphing Calculators -# <CALC-TI@LISTS.PPP.TI.COM> -# Sender: owner-ding@hpc.uh.edu -# Sender: Flamenco discussion group <FLAMENCO@LISTSERV.TEMPLE.EDU> -# Sender: owner-ntemacs-users@cs.washington.edu - -# ((((( NOTE ))))) -# This would match -# -# Sender: owner-announce@perl.org --> LIST = "announce" -# -# Which is prevented with JA_LIST_KILL_POSTFIX test -# -# The SUPREME will match first Sender field, then any field that has -# agent properties like owner- ... - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: Sender" - -:0 -* LIST ?? ^^^^ -*$ $SUPREME^0 ^Sender:$pfx$agent-\/$abc+ -*$ $SUPREME^0 ^[-a-z]+:$pfx$agent-\/$abc+ -*$ ! MATCH ?? ^^$JA_LIST_KILL_POSTFIX^^ -{ - LIST = $MATCH - - :0 - *$ ^Sender:\/.* - { - unique_from = $MATCH - } -} - -dummy = "pm-jalist.rc: TRY sender1a" - -:0 -* LIST ?? ^^^^ -*$ ^Sender:.*${pfx}\/$abc+-L\> -{ - LIST = $MATCH -} - -dummy = "pm-jalist.rc: TRY sender1b" - -:0 -* LIST ?? ^^^^ -*$ ^Sender:.*${pfx}\/$abc+@listserv -{ - LIST = $MATCH -} - -# Sender: semi-gnus-en-owner@meadow.scphys.kyoto-u.ac.jp - -dummy = "pm-jalist.rc: sender postfix words in list name" - -:0 -* LIST ?? ^^^^ -*$ ^Sender:${pfx}\/$abc+-$agent -{ - LIST = $MATCH -} - -# Reply-To: "AIP Public" <public@lists.association.org> -# Sender: public-admin@lists.association.org - -dummy = "pm-jalist.rc: sender lists.domain" - -:0 -* LIST ?? ^^^^ -*$ ^Sender:.*\/${abc}+@lists\. -{ - LIST = $MATCH -} - -# ............................................................. From ... - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: From-Owner 1" - -:0 -* LIST ?? ^^^^ -*$ ^$from.*${pfx}\/$abc+-$agent -{ - LIST = $MATCH -} - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: From-Owner 2" - -:0 -* LIST ?? ^^^^ -*$ ^$from.*$pfx\/$agent-$abc+@ -{ - LIST = $MATCH -} - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: From-Owner 3 TRIGGER" - -# To: Planet IT Members:; -# Subject: Join Planet IT's New Systems-Management Technology Center -# From: Planet IT Announcements <cmpnet-announcements@lists.cmpnet.com> -# Errors-To: anchovy+cmp-planetit010899-1@mx.lodo.infobeat.com - -:0 -* LIST ?? ^^^^ -*$ $SUPREME^0 ^$from.*$pfx.*\/${abc}+-$trigger@ -*$ $SUPREME^0 ^$from.*$pfx.*\/${trigger}-$abc+@ -{ - LIST = $MATCH -} - -# We can't do anything automatic to detect this list. User must -# set JA_LIST_HEADER_REGEXP to match @motleyfool.com, then the -# FoolWatch: from Subject line it taken. - -# From: foolexpress@motleyfool.com -# Received: (qmail 1528 invoked by uid 536); 17 Dec 1998 02:31:49 -0000 -# Message-ID: <19981217023149.1527.qmail@mail3.motleyfool.com> -# Date: 16 Dec 1998 21:31:49 -0500 -# Subject: FoolWatch: Downsizing Tidal Wave? and Rule Breaker on Amazing Amazon -# Subject: Fool Watch: -# To: foo@bar.com - -dummy = "pm-jalist.rc: TRY FromLogin 2" - -:0 -* LIST ?? ^^^^ -*$ $SUPREME^0 ^Subject: +\/$abc$abc$abc$abc+: -*$ $SUPREME^0 ^Subject: $abc$abc$abc$abc+ +\/$abc$abc$abc$abc+: -*$ MATCH ?? ()\/[^:]+ -*$ $JA_LIST_HEADER_REGEXP -{ - LIST = $MATCH -} - -# This is tough. We pick the host names from the From address and try to -# see if those exist in the Subject line. SIDEWALK can be found -# -# The regexp ^Subject:.* +\/$abc$abc$abc$abc+: makes sure there is -# some list name with colon. Simple "re:" won't do, but "Alert:" does. - -# From: talktous@sandiego.sidewalk.com -# To: <foo@bar.com> -# Subject: Sidewalk Ticket Alert: Handel's "Messiah," Jingle Ball - -dummy = "pm-jalist.rc: TRY From-Subject 1" - -:0 # host 1 after @ -* LIST ?? ^^^^ -*$ ^Subject:.* +\/$abc$abc$abc$abc+: -*$ ^$from.*@\/$abc+ -*$ ^Subject:.*$\MATCH -{ - tmp = $MATCH - - :0 - *$ ^$from.*\/$S+@.*$tmp - *$ MATCH ?? ()\/[^@]+ - { - LIST = $MATCH - - :0 - *$ ^()\/$from.*@.*$tmp - { - unique_from = $MATCH - } - } -} - -dummy = "pm-jalist.rc: TRY From-Subject 2" - -:0 # host 2 after @ -* LIST ?? ^^^^ -*$ ^Subject:.* +\/$a$a$a$a+: -*$ ^$from.*@$a+\.\/$a+\.$a+ -*$ MATCH ?? ()\/$a+ -*$ ^Subject:.*$\MATCH -{ - - # We can use this "sidewalk", because it's sub-domain and UNIQUE - # would pick. We want something outside... - - tmp = $MATCH - - # Get the login. find the correct FROM that contains TMP, then extract - # the login - - :0 - *$ ^$from.*\/$S+@.*$tmp - *$ MATCH ?? ()\/[^@]+ - { - LIST = $MATCH - - :0 - *$ ^()\/$from.*@.*$tmp - { - unique_from = $MATCH - } - } -} - -dummy = "pm-jalist.rc: TRY From-Subject 3 words" - -# Try to match three same words from both SUBJECT and FROM: -# -# To: foo@bar.com -# Subject: Silicon Alley Daily for Monday, January 4, 1999 -# From: Silicon Alley Daily <daily@sar.infobeat.com> -# Errors-To: daily-errors+1.0.92574.foo#bar.com@bounce.sar.infobeat.com -# -# Notice that here are 2 common words -# -# Subject: Silicon Alley Reporter Net TV Show @ 4 p.m. -# From: Silicon Alley Daily <daily@sar.infobeat.com> -# -# Ignore messages that come from daemon, like -# -# From: Mail Delivery System <Mailer-Daemon@example.org> -# Subject: Mail delivery failed: returning message to sender - -:0 -* LIST ?? ^^^^ -*$ ! $JA_FROM_DAEMON -*$ ! $JA_FROM_MAILER -*$ ^Subject: +\/$S+ +$S+ -*$ ^$from1\/$s*$\MATCH.* -*$ ^Subject: +\/$S+ +$S+ .* -{ - tmp = $MATCH # save "Silicon alley Daily" - status = "read-more" - - :0 # Record the correct FROM line - *$ ^()\/$from.*$tmp.* - { - unique_from = $MATCH - } - - # Now make list name. Note that first "]" character must end reading - # words - # - # Subject: [this list] - - dummy = " *** WORD 1" - - :0 - *$ tmp ?? ^^()\/$S+ - { - part = $MATCH - - :0 - * part ?? ()\/[a-zA-Z0-9_-]+ - { - LIST = $MATCH - } - - :0 - *$ part ?? \]^^ - { - status = "stop" - } - } - - dummy = " *** WORD 2" - - :0 - * status ?? read-more - *$ tmp ?? ^^$S+ +\/$S+ - { - part = $MATCH - - :0 - * part ?? ()\/[a-zA-Z0-9_-]+ - { - LIST = $LIST-$MATCH - } - - :0 - *$ part ?? \]^^ - { - status = "stop" - } - } - - dummy = " *** WORD 3" - - :0 - * status ?? read-more - *$ tmp ?? ^^$S+ +$S+ +\/$S+ - { - part = $MATCH - - :0 - * part ?? ()\/[a-zA-Z0-9_-]+ - { - LIST = $LIST-$MATCH - } - } -} - -# ................................................ FromLogin-Subject ... - -# Check if LOGIN is found from SUBJECT -# -# From: newsletter@x10.com -# To: <login@some.com> -# Subject: X-10 Newsletter: FREE Sticka Switches - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: From-Login" - -:0 -* LIST ?? ^^^^ -*$ ^$from.*${pfx}\/$abc+ -*$ ^Subject:.*$MATCH: -{ - LIST = $MATCH -} - -# ....................................................... subscriber ... - -# To: "internet-subscribers" <foo@bar.com> -# From: <internet-editor@amazon.com> -# Subject: Amazon.com Delivers Internet - -:0 -* LIST ?? ^^^^ -*$ ^To:.*\/($abc.*subscriber|subscriber.*$abc) -*$ $JA_LIST_HEADER_REGEXP -{ - LIST = $MATCH -} - -# ........................................................... X-list ... -# X-Listserver: ListSTAR v1.1 by StarNine Technologies, a Quarterdeck Company -# X-List-Subscribe: <mailto:FAQ-Maintainers@consensus.com?subject=subscribe> -# X-List-Help: <mailto:FAQ-Maintainers@consensus.com?subject=help> -# List-Subscribe: <mailto:updatemail-on@lists.funnytown.com> - -# The list name can't be deternined by $trigger, but we can -# estimate that if -# -# Sender = To, then it's list -# OR -# Reply-To = To -# -# Reply-To: Alpha K9s <ALPHAK9S@APPLE.EASE.LSOFT.COM> -# Sender: Alpha K9s <ALPHAK9S@APPLE.EASE.LSOFT.COM> -# From: "Mark A. Winters" <wintdavi@PANIX.COM> -# To: ALPHAK9S@APPLE.EASE.LSOFT.COM - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: Using heuristics" - -# ....................................................... sender ... - -dummy = "pm-jalist.rc: ****** Checking Sender" - -:0 -* LIST ?? ^^^^ -* sender_addr ?? [a-z] -* to_addr ?? [a-z] -{ - dummy = "pm-jalist.rc: to_addr $to_addr ?? sender_addr $sender_addr" - - # We try first with exact matches, then with only the top level domain - # - # addr = site.this.com - # addr2 = this.com - - :0 - *$ $SUPREME^0 to_addr ?? ()\/$\sender_addr - *$ $SUPREME^0 to_addr ?? ()\/$\sender_addr2 - *$ $SUPREME^0 to_addr2 ?? ()\/$\sender_addr - *$ $SUPREME^0 to_addr2 ?? ()\/$\sender_addr2 - *$ MATCH ?? ()\/$abc+@ - { - :0 - *$ ! sender_addr ?? $JA_LIST_FROM_TO_IGNORE - { - dummy = "pm-jalist.rc: Sender is identical to To." - unique_from = $to_addr2 - LIST = $MATCH - } - } - - # To: humor@NewHumor.com - # Sender: ListManager@NewHumor.com - # - # But, it must not be person-to-person message, that's why - # JA_LIST_HEADER_REGEXP addition. - - dummy = "pm-jalist.rc: sender_addr [$sender_addr] ?? to_site [$to_site] [$to_addr]" - - :0 E - *$ $JA_LIST_HEADER_REGEXP - *$ sender_addr ?? $\to_site - *$ to_addr ?? ()\/$abc+ - { - dummy = "pm-jalist.rc: Sender address matched To domain." - LIST = $MATCH - } -} - -# ..................................................... reply-to ... - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: Reply-to" - -:0 -* LIST ?? ^^^^ -* ^Reply-To:\/.* -*$ to_addr ?? ()\/$abc+ -{ - - # ................................. Reply-To identical to To ... - # To: web-consultants@just4u.com - # Reply-To: web-consultants@just4u.com - - dummy = "pm-jalist.rc: Check if Reply-To identical to To." - dummy = "pm-jalist.rc: [$to_addr] ?? [$reply_addr]" - - :0 - *$ $SUPREME^0 to_addr ?? ()\/$\reply_addr - *$ $SUPREME^0 to_addr ?? ()\/$\reply_addr2 - *$ $SUPREME^0 to_addr2 ?? ()\/$\reply_addr - *$ $SUPREME^0 to_addr3 ?? ()\/$\reply_addr2 - *$ MATCH ?? ()\/$abc+@ - { - unique_from = $to_addr2 - LIST = $MATCH - } - - # ............................... Reply-To identical to From ... - - dummy = "pm-jalist.rc: Check if Reply-To identical to From." - dummy = "pm-jalist.rc: [$sender_addr] ?? [$reply_addr]" - - :0 E - *$ sender_addr ?? $\reply_addr - *$ MATCH ?? ()\/$abc+@ - *$ $JA_LIST_HEADER_REGEXP - { - dummy = "pm-jalist.rc: MAYBE LIST, Reply-To is identical to From address." - LIST = $MATCH - } - - # Hm, not identical addresses; but partially. - # - # Reply-To: dispatch-faq@cnet.com - # From: CNET Digital Dispatch <dispatch@cnet.com> - - dummy = "pm-jalist.rc: SENDER/REPLY acc [$sender_account] ?? [$reply_account]" - :0 E - *$ $SUPREME^0 sender_account ?? ()\/$reply_account - *$ $SUPREME^0 reply_account ?? ()\/$sender_account - *$ $JA_LIST_HEADER_REGEXP - { - LIST = $MATCH - } - - # Well: howabout site names then? - # - # From: TripMiles <sender@que.thetrip.com> - # Reply-to: feedback@thetrip.com - - dummy = "pm-jalist.rc: SENDER/REPLY domain [$sender_domain] ?? [$reply_adomain]" - - :0 E - *$ $SUPREME^0 sender_domain ?? ()\/$\reply_domain - *$ $JA_LIST_HEADER_REGEXP - { - LIST = $reply_sub1-$reply_account - } -} - -# ...................................................... Error-To ... - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: Errors-to" - -:0 -* LIST ?? ^^^^ -*$ ^Errors-To:.*\/$email -* MATCH ?? @()\/.* -{ - errors_domain = $MATCH - - # Hmmm The address is not identical, but maybe there is Errors-To - # Header that we could use for tracking a list context ? - # - # To: list-member@foo.com - # Reply-To: news@fusion.nww.com - # Errors-To: bounced@fusion.nww.com - - dummy = "pm-jalist.rc: Errors-To [$errors_domain] reply_addr [$reply_addr]" - - :0 - * ! reply_addr ?? ^^^^ - *$ reply_addr ?? $\errors_domain - { - unique_from = $reply_addr - - :0 - *$ reply_addr ?? ()\/$abc+ - { - LIST = $MATCH - } - } - - dummy = "pm-jalist.rc: Errors-To [$errors_domain] reply_addr [$sender_addr]" - - :0 E - * ! sender_addr ?? ^^^^ - *$ sender_addr ?? $\errors_domain - { - unique_from = $sender_addr - - :0 - *$ sender_addr ?? ()\/$abc+ - { - LIST = $MATCH - } - } - - dummy = "pm-jalist.rc: Errors-To [$errors_domain] to_addr [$to_addr]" - - :0 E - * ! to_addr ?? ^^^^ - *$ to_addr ?? $\errors_domain - { - unique_from = $to_addr - - :0 - *$ to_addr ?? ()\/$abc+ - { - LIST = $MATCH - } - } -} - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: From-newsletter" - -# From: newsletter@x10.com -# Subject: X-10 Buyer's Alert: Super-Saver Weekend Deals - up to 60% OFF! - -:0 E -*$ ^$from:.*newsletter@ -{ - LIST = "newsletter" - - :0 - *$ ^()\/$from:.*newsletter@.* - { - unique_from = $MATCH - } -} - -# ................................................. named LIST in CC ... - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: TO-CC mailing List" - -# Somebody is replying direct, but also sending to list with CC: -# -# To: Foo Bar <foo@bar.com> -# Cc: procmail mailing list <procmail@informatik.rwth-aachen.de> -# -# Also find -# -# JAVAL-L <foo@bar.com> - -:0 -* LIST ?? ^^^^ -*$ ^(To|CC):\//*(.*mailing$s+list|\<$S+-L\>).* -*$ MATCH ?? ()\/[^$WSPC<]+@ -{ - LIST = $MATCH -} - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: TO-CC postfix match" - -# Try to find POSTFIX address somewhere in header -# To:foo@example.com -# Cc: winNT Emacs list <foo-users@cs.washington.edu> - -:0 -* LIST ?? ^^^^ -*$ ()[<, ]\/$abc+-$trigger@ -{ - LIST = $MATCH -} - -# ..................................................... X-ListMember ... -# some lists are announce only and they contain "null". Pick name from -# X-ListMember field -# -# To: ora-news@list.ora.com -# From: Ora-News <null@list.ora.com> -# Reply-To: <null@list.ora.com> -# X-ListMember: me@here.com [ora-news@list.ora.com] - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: X-ListMember" - -dummy = "pm-jalist.rc: check SENDER ?? TO_FIELD [$sender] ?? [$to_field] " - -# See if DOMAIN if same in both From and To -# See if ACCOUNT is found from FROM field - -:0 -* LIST ?? ^^^^ -* X-ListMember -*$ ^To:.*@\/$abc+ -*$ ^$from.*$MATCH -*$ ^To:.*$pfx\/$abc+ -*$ ^$from.*$MATCH -{ - LIST = $MATCH -} - -# ...................................................... &ListServer ... -# From: ListServer@wrox.com -# Message-Id: <199812301439.IAA13867@neuman.interaccess.com> -# Date: 30 Dec 1998 08:37:27 -0600 -# Subject: Wrox Press Newsletter, 12/29/98 -# To: foo@bar.com - -:0 -* LIST ?? ^^^^ -*$ ^$from1.*ListServer@\/[^.]+ -{ - LIST = $MATCH # grab server - - :0 # Grab fist word too - *$ ^Subject: $LIST +\/$S+ - { - LIST = $LIST-$MATCH - } -} - -# .......................................................... &digest ... - -# From foo@bar.com -# From: sans@clark.net -# To: foo@bar.com -# Subject: SANS Digest Vol 2, No. 11 - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: DIGEST" - -# The \/$from.* is just for logging purposes - -:0 -* LIST ?? ^^^^ -* ! ^Subject:.*re: -* ^()\/$from.* -* ^Subject: +\/.*digest () -*$ MATCH ?? ()\/$abc+ +digest -*$ MATCH ?? ()\/$abc+ -*$ ^$from.*$MATCH@ -{ - LIST = $MATCH - - # The $from can match multiple from fields, like - # - # From foo@bar.com - # From: sans@clark.net - # - # And we want to force reading UNIQUE from "From:", otherwise the - # $from would take the "From ". See Unique recipe and SUPREME. - - :0 - *$ ^()\/$from.*$MATCH.* - { - unique_from = $MATCH - } -} - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::: #NEWS" - -# From: sender@thetrip.com -# Reply-to: feedback@thetrip.com -# Subject: TheTrip.com Newsletter -# -# Sender: SERVERWATCH <SERVERWATCH@listserv.internet.com> -# From: SERVERWATCH <Serverwatchnews@internet.com> -# Subject: Serverwatch News - January 22, 1999 - -:0 -* LIST ?? ^^^^ -* ! ^Subject:.*(Re:|fwd) -*$ ^Subject:$s+\/$S+$s+news(letter)?.* -*$ ^Subject:$s+\/$S+ -{ - LIST = $MATCH -} - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::: #[LIST]" - -# This must be last, because relying on the [] syntax is last resort. -# Many users indicate the nature of message in the first word, like -# -# [off topic] -# [bug] -# -# And those are not list names. But then again this is: -# -# Message-Id: <199903031849.NAA19835@defender.perl.org> -# From: TPI News Pumpking <pudge@perl.org> -# To: TPI News List <daily-news@perl.org> -# Subject: [TPI News] March 03, 1999 -# Sender: owner-announce@perl.org -# Precedence: bulk -# Reply-To: news@perl.org -# X-Debug: List=(announce@perl.org) - -x = $abc -word = "($x$x$x$x?$x?$x?$x?$x?$x?$x?)" # maximum size of the word - -:0 -* LIST ?? ^^^^ -*$ ^Subject: +\[\/$word($s+$word)?\] -*$ $JA_LIST_HEADER_REGEXP -{ - tmp = $MATCH - - :0 - *$ tmp ?? ()\/$x+ - { - LIST = $MATCH - } - - :0 # second word - *$ tmp ?? $x$s+\/$x+ - { - LIST = "$LIST-$MATCH" - } -} - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::: @LIST.COM" - -# To: <webprog@list.cgibook.com> - -:0 -* LIST ?? ^^^^ -*$ ()\/$abc+@list\.* -* MATCH ?? ()\/[^@]+ -{ - LIST = $MATCH -} - -dummy = "pm-jalist.rc: ::::::::::::::::::::::::::::::::: FOR list-name" - -# Suggestion by Tony Lam <Tony.Lam@Eng.Sun.COM> -# -# To: nm-interest@foo.com, nm-consulting@foo.com -# -# 1. if header matches the following, extract the full email -# address from the match: -# -# for <[a-z0-9]+-[a-z0-9]+.*>; -# -# 2. if the extracted email address is also found in any of the -# To/Cc, extract the portion before @ as the name of alias -# -# (3. BTW, if step 2 fails, the mesage is very likely an ube) -# - -:0 -* LIST ?? ^^^^ -*$ for($SPCL)+[<]()\/[a-z0-9]+-[a-z0-9]$S+@ -{ - tmp = $MATCH - - :0 - *$ (To|CC):\/.*$MATCH - { - unique_from = $MATCH - LIST = $tmp - } -} - -# ...................................................... experiments ... -# Many times domain name has server "list" if it's running mailing list -# Try to catch some of them if previous ones failed. - -dummy = "pm-jalist.rc: :::::::::::::::::::::::: Last try [$LIST]" - -:0 -* LIST ?? ^^^^ -{ - :0 - * ()\/list server.* - { - dummy = "pm-jalist.rc: ==== potential list ==== $MATCH" - } - - :0 E - *$ ()\/(From|X-From-Line|Sender:|CC:|To:).*\.lists?.*\ - |(From|X-From-Line|Sender:|CC:|To:).* list$S*@.* - { - dummy = "pm-jalist.rc: ==== potential list ==== $NL $MATCH" - } - - :0 E - * ()\/(From|Sender:|CC:).*(Majordomo|listserv).* - { - dummy = "pm-jalist.rc: ==== potential list ==== $NL $MATCH" - } - - :0 E - * ()\/Errors-To:.* - { - dummy = "pm-jalist.rc: ==== potential list ==== $MATCH" - } - - :0 E - *$ ()\/^Reply-To:(.*\<list|@$abc+list).* - { - dummy = "pm-jalist.rc: ==== potential list ==== $MATCH" - - - # We can safely conver this to list name - # Reply-To: "The Radicati Group, Inc." <list@radicati.com> - - :0 - *$ ^Reply-To.*list@\/$a+ - { - LIST = list-$MATCH - } - } - - :0 E - * ()\/^Subject.*\<digest\> - { - dummy = "pm-jalist.rc: ==== potential list ==== $MATCH" - } - - :0 E - * ()\/Mailing-list:.* - { - dummy = "pm-jalist.rc: ==== potential list ==== $MATCH" - } -} - -# ............................................................ clean ... - -dummy = "pm-jalist.rc: Cleaning matched list: ($LIST)" - -:0 -* ! LIST ?? ^^^^ -{ - - :0 # delete "@" from the end of string - * LIST ?? @ - * LIST ?? ^^\/[^@]+ - { - LIST = $MATCH - } - - :0 # delete "mailto:" from the beginning of string - * LIST ?? mailto:\/.* - { - LIST = $MATCH - } - - # Remove numbers - # mailto:leave-jscript-146465L --> mailto:leave-jscript - # 1. Check if it has numbers at the end - # 2. Match everything until last - - # 3. Remove last - - - :0 - * LIST ?? ().*[-][0-9]+.^^ - * LIST ?? ()\/.*[-] - * MATCH ?? ()\/.*[^-] - { - LIST = $MATCH - } - - # ................................................. postfix deletion ... - - # The regexp says: - # 1) see if these keywords are there - # 2) Read everything up till last dash and store it to MATCH - # 3) Match up till not including final dash - - :0 - *$ LIST ?? ()-${JA_LIST_KILL_POSTFIX}^^ - * LIST ?? ^^\/.*- - * MATCH ?? ^^\/.*[^-] - { - LIST = $MATCH - } - - # .............................................. prefix deletion ... - - dummy = "pm-jalist.rc: prefix deletion" - - :0 - *$ LIST ?? ^^${JA_LIST_KILL_PREFIX}-\/.* - { - LIST = $MATCH - } - - # ....................................................... unique ... - - dummy = "pm-jalist.rc: make unique list name: $NL$NL $unique_from" - - :0 - *$ LIST ?? $JA_LIST_MAKE_UNIQUE - *$ $SUPREME^0 unique_from ?? ()\/$abc+@$abc+ - *$ $SUPREME^0 ^()\/$from.*${pfx}$abc+@$abc+ - { - host = $MATCH - save = $VERBOSE - VERBOSE = "off" - - INPUT = $host - INCLUDERC = $rc_email - - VERBOSE = "$save" - - # list.shopguidenews.com, we can't accept "list" as match, so we - # use "shopguidenews" - - :0 - * SUB1 ?? [a-z] - { - LIST = $SUB1-$LIST - } - - :0 E - { - LIST = $host-$LIST - } - } - - # ............................................. converting list name ... - - dummy = "pm-jalist.rc: :::::::::::::::::::::::: List conversion" - - LIST_DETECTED = $LIST - - dummy = "pm-jalist.rc: Searching for conversion in array JA_LIST_CONVERSION" - dummy = $JA_LIST_CONVERSION - - :0 - *$ JA_LIST_CONVERSION ?? $LIST$s+\/[^$WSPC,]+ - { - LIST = $MATCH - } - - :0 - * JA_LIST_SAVE ?? yes - { - :0 fhw - | ${FORMAIL:-formail} \ - -I "X-List-Detected: $LIST_DETECTED mapped to $LIST" - } -} - -dummy = "pm-jalist.rc: end: grabbed list ($LIST)" - -# end of file pm-jalist.rc diff --git a/src/procmail/pm-jamime-decode.rc b/src/procmail/pm-jamime-decode.rc @@ -1,290 +0,0 @@ -# pm-jamime-decode.rc -- decode MIME body contents; quoted-printable, base64 -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Documentation -# -# The original father of the decoding scheme used here was -# presented by Peter Galbraith <galbraith@mixing.qc.dfo.ca> in -# procmail mailing list somewhere at the end of 1997. -# -# This subroutine supposes that the header has MIME header -# Content-Type: text/plain and performs quoted-printable or -# base64 decoding on the whole message. Note, that if you -# receive messages that have many mime attachments, then this -# recipe is not suitable for it. -# -# Procmail is *not* designed to handle mime attachments and this -# recipe only applies to whole _body_. -# -# The `pm-jamime-*.rc' is really stretching the limits and any -# serious work should be delegated to other tools. Alternatives: -# -# o A Perl MIME module which will allow you to manipulate MIME -# body parts rather elegantly. See -# http://www.perl.com/CPAN-local/authors/Eryq/ for MIME-tools. -# o mimedecode at ftp://ftp.dde.dk/pub/mimedecode.c -# -# Notes -# -# Perl or Python is not used, because both are CPU intensive. It -# would be too expansive for accounts or environments receiving -# hundreds of mails per day (like from several mailing lists). -# -# RFC 2047 gives possiblity to use MIME iso-8859-1 extensions -# for mail headers. -# -# Subject: Re: [PIC]: RSA =?iso-8859-1?Q?encryption=B7=B7?= -# Subject: =?iso-8859-1?Q?=5BEE=5D:TV_&_video_IC=B4s_!!?= -# -# There is also base64 possibility (although rare): -# -# Subject: =?iso-8859-1?B?zvLi5fI6ICAgICAgTVBMQUIzLjQw?= -# -# In worst possible case there is even multiple ISO encoded -# strings in subject. Yes, this is valid, the continued line -# includes spaces at front to keep it with original just like -# in `Received:' headers. This subroutine will not touch headers -# that have multiple ISO tags - procmail is too limited for that. -# -# Subject: AW: Re: AW: neue =3D?ISO-8859-1?Q?M=3DF6glichkeiten_=3D28was_=3D=C4hn?=3D -# =3D?ISO-8859-1?Q?lichkeiten_von_=3DDCbungen=3D29?=3D -# -# Required settings -# -# Variable `PMSRC' must point to source directory of procmail code. -# This subroutine will include -# -# o pm-javar.rc, pm-jamime.rc -# o Programs `$MIME_BIN', `$MIME_BIN_QP' and `$MIME_BIN_64' -# must have been installed (see pm-javar.rc). -# -# Call arguments (variables to set before calling) -# -# o `JA_MIME_DECODE_TREAT_SUBJECT', default "yes". Decode -# Subject header by removing mime. -# o `JA_MIME_DECODE_TREAT_FROM', default "no". Decode -# From header by removing mime. -# o `JA_MIME_DECODE_TREAT_BODY', default "no". Decode -# body of message by removing quoted-printable from a -# message that contains only one part. Messages with multiple -# parts are not handled. -# -# Return values -# -# o `PM_JAMIME_COMPLEX_SUBJECT' is set to "yes". -# This flag is set to indicate that some other program -# should handle the message. If Subject header contains ISO -# encoding several times, it cannot be handled by this module. -# -# Examples -# -# Instead of testing the existence of text/plain in the body, -# you can force decoding by settings JA_MIME_DECODE_REGEXP to -# ".*". -# -# RC_MIME_DECODE = $PMSRC/pm-jamime-decode.rc -# -# :0 -# * condition -# { -# JA_MIME_DECODE_REGEXP = ".*" -# } -# -# INCLUDERC = $RC_MIME_DECODE # call subroutine. -# -# -# Change Log (none) - - -dummy = " -======================================================================== -pm-jamime-decode.rc: init: -" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -:0 -* ! MIME_VER ?? [0-9] -{ - INCLUDERC = $PMSRC/pm-jamime.rc -} - -# .......................................................... &public ... -# User configurable sections - -JA_MIME_DECODE_TREAT_SUBJECT = "yes" # Set to "no" to disable -JA_MIME_DECODE_TREAT_FROM = "no" # Set to "yes" to enable -JA_MIME_DECODE_TREAT_BODY = "no" # Set to "yes" to enable - -JA_MIME_DECODE_REGEXP = ${JA_MIME_DECODE_REGEXP:-\ -"^Content-Type: *text/plain"} - -# ........................................................... &do-it ... -# Run conversion if it was quoted printable. -# Also reflect correct MIME header - -JA_MIME_DECODE_HEADER = ${JA_MIME_DECODE_HEADER:-\ -"X-Mime-Header-Decoded"} - -dummy = "pm-jamime-decode.rc: handle quoted printable" - -PM_JAMIME_COMPLEX_SUBJECT # Return value if too complex subject - -jamimeHandledSubject = "no" - -# Kill variables -jamimeSubject -jamimeSubjectRest - -:0 -* JA_MIME_DECODE_TREAT_SUBJECT ?? yes -* ^Subject: \/.* -{ - jamimeSubject = $MATCH - jamimeISO = "\?iso-8859-[1-9]\?[QB]\?.+\?=" - - :0 - *$ jamimeSubject ?? $jamimeISO()\/.* - { - # ".*" is actually minimum match. See pm-doc.sf.net - jamimeSubjectRest = $MATCH - } - - :0 - *$ jamimeSubjectRest ?? $jamimeISO() - { - # This Subejct line contains ISO encoding several times. - # This is out of our league. Can't hanle it, so quit. - - jamimeSubject - JAMIME_COMPLEX_SUBJECT = "yes" - } -} - -:0 -* ! jamimeSubject ?? ^^^^ -{ - str = $jamimeSubject - decoder = $MIME_BIN_QP - type = "quoted-printable" - - :0 - * ^Subject:.*\?B\? - { - type = "base64" - decoder = $MIME_BIN_64 - } - - # NOTE "?" is not wildcard "as is" in sed. - - clean = \ - ` echo "$str" \ - | $SED \ - -e 's/^\(.*\)?\(iso\|ISO\)-\{0,1\}8859-[1-9]?[QB]?\(.*[^?]\)?=/\1\2/g' \ - -e 's/=0D//g' \ - -e 's/=0A//g' \ - -e 's/=B7//g' \ - -e 's/_/ /g' \ - | $decoder - ` - - handledSubject = "yes" - - :0 fhw - * ! clean ?? ^^^^ - | $FORMAIL \ - -i "Subject: $clean" \ - -I "${JA_MIME_DECODE_HEADER}-Subject: $type" -} - -# Too bad Procmail does not have subroutines. This recipe is -# identical to "Subject" check above. -# -# Note, that 'From' header is different from the 'Subject' header -# in respect to the ISO encoding. Look closely where '?=' ends: -# -# Subject: =?ISO-8859-1?Q?=C4hnlichkeiten_von_=DCbungen?= -# From: =?ISO-8859-1?Q?Holger_Hoffst=E4tte?= <holger@example.com> - -jamimeHandledFrom = "no" - -:0 -* JA_MIME_DECODE_TREAT_FROM ?? yes -*$ ^From: +()\/=\?iso-8859-[1-9]\?[QB]\?.+\?=.* -*$ ^From: +()\/.*=\?.+[>] -{ - str = $MATCH - decoder = $MIME_BIN_QP - type = "quoted-printable" - - :0 - * ^Subject:.*\?B\? - { - type = "base64" - decoder = $MIME_BIN_64 - } - - clean = \ - ` echo "$str" \ - | $SED \ - -e 's/=?\(iso\|ISO\)-\{0,1\}8859-[1-9]?[QB]?\(.*[^?]\)?=/\2/g' \ - -e 's/=0D//g' \ - -e 's/=0A//g' \ - -e 's/=B7//g' \ - | $decoder - ` - - jamimeHandledFrom = "yes" - - # Make sure there is <send@example.com> before replacing anything - - :0 fhw - * clean ?? [>] - | $FORMAIL \ - -i "From: $clean" \ - -i "${JA_MIME_DECODE_HEADER}-From: $type" -} - -# Touch only real mime messages and text/plain -# $MIME_BIN_QP does not handle separate MIME sections - -:0 -* JA_MIME_DECODE_TREAT_BODY ?? yes -*$ $JA_MIME_DECODE_REGEXP -{ - :0 fbw - * ^Content-Transfer-Encoding: *quoted-printable - | $MIME_BIN_QP - - :0 A fhw - | $FORMAIL -I "Content-Transfer-Encoding: 8bit" - - :0 fbw - * ^Content-Transfer-Encoding: *base64 - | $MIME_BIN_64 - - :0 A fhw - | $FORMAIL -I "Content-Transfer-Encoding: 8bit" -} - -dummy = "pm-jamime-decode.rc: end:" - -# End of file pm-jamime-decode.rc diff --git a/src/procmail/pm-jamime-kill.rc b/src/procmail/pm-jamime-kill.rc @@ -1,712 +0,0 @@ -# pm-jamime-kill.rc -- General MIME attachment killer (vcards, html) -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# Note: If you think this module can do miracles, it cannot. -# MIME messages are very complex in structure and all this module -# can do is to detect *simple* attachements. It cannot be used -# as - all purpose - all detecting - MIME attachement killer. -# But the part it can do, is done efficiently, because most of the -# things are accomplished using procmail and resource friendly -# `awk'. -# -# There are meny programs that add additional information to the -# messages. Microsoft's mail program is one which may include -# a 7k application/ms-tnef attachment to the end of -# message. Many other programs may do the same. This was the idea -# in 1997 when this module was written; to get rid of the extra -# cruft which should not land in the mailbox. -# -# This recipe works like this: If email's structure is -# -# --boundary -# message-text (maybe quoted-printable) -# --boundary -# some-unwanted-mime-attachment -# --boundary -# -# then the attachment is killed from the body. The message-text part -# is also decoded if it was quoted printable. This leaves clean text -# with no MIME anywhere. MIME headers have will be modified as needed -# due to conversion from multi part and possibly quoted printable to -# plain text and the final message looks like: -# -# message -# -# But if email's structure is anything else, like if there were 3 -# mime sections: -# -# --boundary -# message-text (maybe quoted-printable) -# --boundary -# some-attachment -# --boundary -# some-unwanted-mime-attachment -# --boundary -# -# then the "unwanted" part is emptyed by replacing with one empty -# line. The message structure stays the same, but the killed -# "some-unwanted-mime-attachment" part is labelled as text/plain -# so that the MUA (Mail User Agent; the email reader program) -# can decode the MIME message correctly. -# -# Applications for other mime attachments -# -# The following cases are ncluded on in this module. You need to -# separately the behavior before this module will start working. -# -# o Lotus Notes attachment. -# o Microsoft Express attachement. It sends a copy of message in HTML -# format. -# o Mozilla's Netscape attachement. It sends a copy of message in HTML. -# o `Vcard' attachments. -# o Openmail attachment. It sends 10-20 line base64 attachments -# WINMAIL.DAT. -# -# Example of lotus notes attachment -# -# Subject: message -# From: foo@bar.com -# X-Lotus-FromDomain: XXX COMPANIES -# Mime-Version: 1.0 -# Boundary="0__=cieg4oHxUNf2h3evyOXIsHTGDpFfaZilTDCFhpZSgsw" -# Content-Type: multipart/mixed; -# Boundary="0__=cieg4oHxUNf2h3evyOXIsHTGDpFfaZilTDCFhpZSgsw" -# -# --0__=cieg4oHxUNf2h3evyOXIsHTGDpFfaZilTDCFhpZSgsw -# Content-type: application/octet-stream; -# name="PIC10898.PCX" -# Content-transfer-encoding: base64 -# -# eJ8+IjsQAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEIgAcA -# b3NvZnQgTWFpbC5Ob3RlADEIAQ2ABAACAAAAAgACAAEEkAYAyAEAAAEAAAAQ -# -# <AND-THE-REST-OF-BASE64> -# -# --0__=cieg4oHxUNf2h3evyOXIsHTGDpFfaZilTDCFhpZSgsw-- -# -# Example of MS Explorer's ms-tnef message -# -# Subject: message -# From: foo@bar.com -# MIME-Version: 1.0 -# Content-Type: multipart/mixed; -# boundary="---- =_NextPart_000_01BD04D4.A5AC6B00" -# Lines: 158 -# -# ------ =_NextPart_000_01BD04D4.A5AC6B00 -# Content-Type: text/plain; charset="iso-8859-1" -# Content-Transfer-Encoding: quoted-printable -# -# <MESSAGE ITSELF IS HERE> -# -# ------ =_NextPart_000_01BD04D4.A5AC6B00 -# Content-Type: application/ms-tnef -# Content-Transfer-Encoding: base64 -# -# eJ8+IjsQAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEIgAcA -# b3NvZnQgTWFpbC5Ob3RlADEIAQ2ABAACAAAAAgACAAEEkAYAyAEAAAEAAAAQ -# -# <AND-THE-REST-OF-BASE64> -# -# ------ =_NextPart_000_01BD04D4.A5AC6B00-- -# -# Example of MS Express's HTML message -# -# MIME-Version: 1.0 -# Content-Type: multipart/alternative; -# boundary="----=_NextPart_000_003A_01BD16E2.C97E27B0" -# X-Mailer: Microsoft Outlook Express 4.72.2106.4 -# X-MimeOLE: Produced By Microsoft MimeOLE V4.72.2106.4 -# -# This is a multi-part message in MIME format. -# -# ------=_NextPart_000_003A_01BD16E2.C97E27B0 -# Content-Type: text/plain; -# charset="iso-8859-1" -# Content-Transfer-Encoding: quoted-printable -# -# <ACTUAL TEXT> -# -# ------=_NextPart_000_003A_01BD16E2.C97E27B0 -# Content-Type: text/html; -# charset="iso-8859-1" -# Content-Transfer-Encoding: quoted-printable -# -# <SAME IN HTML> -# ------=_NextPart_000_003A_01BD16E2.C97E27B0-- -# -# Example of Netscape's HTML attachment -# -# X-Mailer: Mozilla 4.04 [en] (X11; U; Linux 2.0.33 i686) -# MIME-Version: 1.0 -# Content-Type: multipart/alternative; -# boundary="------------69D9D579CF587DC8BB26C49C" -# -# -# --------------69D9D579CF587DC8BB26C49C -# Content-Type: text/plain; charset=us-ascii -# Content-Transfer-Encoding: 7bit -# -# <ACTUAL TEXT> -# -# --------------69D9D579CF587DC8BB26C49C -# Content-Type: text/html; charset=us-ascii -# Content-Transfer-Encoding: 7bit -# -# <SAME IN HTML> -# --------------69D9D579CF587DC8BB26C49C-- -# -# Example of Netscape's vcard attachment. -# -# Content-Type: text/x-vcard; charset=us-ascii; name="vcard.vcf" -# Content-Transfer-Encoding: 7bit -# Content-Description: Card for Laird Nelson -# Content-Disposition: attachment; filename="vcard.vcf" -# -# begin: vcard -# fn: Laird Nelson -# n: Nelson;Laird -# org: Perot Systems Corporation -# adr: 101 Main Street;;;Cambridge;MA;02142;USA -# email;internet: ljnelson@unix.amherst.edu -# title: Software Engineer -# tel;work: (617) 303-5059 -# tel;fax: (617) 303-5293 -# tel;home: (978) 741-3126 -# note;quoted-printable:Information is for reference only;=0D=0A= -# please do not abuse it. -# x-mozilla-cpt: ;0 -# x-mozilla-html: TRUE -# version: 2.1 -# end: vcard -# -# Required settings -# -# To handle base64 encoded messages, package called `metamail' must -# have been installed to system. It provides program `mimencode' -# which is used through variable $MIME_BIN (see pm-javar.rc). -# -# Variable $PMSRC must point to source directory of procmail code. -# This subroutine will include -# -# o pm-javar.rc -# o pm-jamime.rc -# -# Call arguments (variables to set before calling) -# -# First of all, this is primarily a framework recipe to kill any kind -# of attachment. If you do not set `JA_MIME_TYPE' before calling -# this recipe, recipe will try to determine the right value by itself. -# If the automatic detection fails you _need_ to preset the value -# of `JA_MIME_TYPE' beforehand. -# -# o `JA_MIME_TYPE' is a case sensitive AWK *REGEXP*. Always use -# *lowercase* letters in this regexp because the line is lowercased -# before match is made. This regexp determines if the kill -# recipe is applied to the message or not. Suggested default -# value: "text/html". If empty (not set), the heuristics -# tries to set it for MS explorer, MS express, Netscape, -# Lotus Notes etc. -# o `JA_MIME_KILL_RE', additional *REGEXP* to kill lines from the -# message. Value is case sensitive awk regexp and by default matches -# Lotus notes tag: name="XXX.PCX". -# o `JA_MIME_EXTRA_HEADER', name of header added to the message -# if the MIME portion was killed. Default value is -# "X-Mime-Type-Killed". -# -# It may be possible that some messages are malformed and that -# they do not contain proper "boundary" definition string in the -# header. There have been messages that have text/html -# attachments, but no proper Mime headers. For those cases there -# is additional variable that will kill all text up till -# matching line regardless of message content. -# -# o `JA_MIME_KILL2_RE' is set to "text/html|application/ms-tnef". -# Update this to match attchements you receive. Set variable to -# "" if you don't want to change the body of non-compliant MIME -# message. -# -# That variable is the last resort if the standard MIME detection -# failed. There must have been some problem in the sender's MUA that -# composed message. It's dangerous, so make sure you don't set it -# lightly. -# -# Possible conflict with the awk -# -# If you see an error message in the log file saying that awk failed: -# -# procmail: Executing awk, -# ... -# procmail: Error while writing to "awk" -# procmail: Rescue of unfiltered data succeeded -# -# it means that the system's standard `awk' doesn't support the -# variable passing syntax. Do the following test: -# -# % awk '{print VAR; exit}' VAR="value" /etc/passwd -# -# It should print "value". If not, then see if you have `gawk' or -# `mawk' in the system. Try whcih awk understands the variable passing -# syntax. The only change needed is to define variable AWK -# somewhere at the top of `~/.procmailrc'. -# -# AWK = "gawk" # Better than standard "awk" -# -# WARNING: In some systems the `gawk' is not real GNU awk, but a -# symlink to somewhere alse. E.g. in SunOs/Solaris you may find this -# setup, which is unsufficient. For Solaris, the GNU awk is available -# at http://www.blastwave.org -# -# $ which gawk -# $ gawk --version -# <syntax error> -# $ ls -l /usr/local/bin/gawk -# /usr/local/bin/gawk -> /usr/bin/nawk -# -# Warnings -# -# You should know that the variable `JA_MIME_KILL_RE' is used to wipe -# any lines that match that regexp. This is due to MIME structure -# where continuing header lines exist in the body: -# -# ------=_NextPart_000_003A_01BD16E2.C97E27B0 -# Content-Type: text/plain; -# charset="iso-8859-1" << kill this line too -# -# If you want to be absolutely sure that anything valuable won't be -# accidentally killed (like a code line in programming language scripts), -# you should set this variable to nonsense value that newer matches: -# -# JA_MIME_KILL_RE = "match_it_never_I_hope" -# -# Usage example: Customizing the attachment killing -# -# Suppose you receive new `application/ms' type attachment that the -# default settings doesn't cover. This is a new mime type and you -# have to instruct this module to kill it. Add this and similar -# tests for other mime types: -# -# myCustomMimeType = "application/ms" # must be all lowercase -# -# :0 -# *$ $myCustomMimeType -# { -# PM_JA_MIME_TYPE = $myCustomMimeType -# } -# -# INCLUDERC = $PMSRC/pm-jamime-kill.rc -# -# Usage example -# -# To kill text/html or pdf, postscript and others add something -# like this to `~/.procmailrc'. It demonstrates how the correct -# MIME types are detected: -# -# # ..................................................... -# # 1) Uncomment following line if your standard "awk" is broken -# -# # AWK = "gawk" -# -# # ..................................................... -# # 2) Set correct value for attachment killing -# -# :0 -# * ^X-Lotus-FromDomain: -# { -# # Kill Lotus notes .pcx attachments -# JA_MIME_TYPE = "application/octet-stream" -# } -# -# :0 -# * H ?? ^From:.*foo@example.com -# * B ?? ^Content-Type:.*text/html -# { -# # Kill html attachments -# JA_MIME_TYPE = "text/html" -# } -# -# # ..................................................... -# # 3) Call module -# -# INCLUDERC = $PMSRC/pm-jamime-kill.rc -# -# Change Log (none) - -# .................................................... &initialising ... - - -id = "pm-jamime-kill.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -:0 -* ! MIME_VER ?? [0-9] -{ - INCLUDERC = $PMSRC/pm-jamime.rc -} - -# .......................................................... &public ... -# User configurable sections - -# If linebuf is too small, then AWK scripts can't be called -JA_MIME_KILL_LINEBUF = ${JA_MIME_KILL_LINEBUF:-524280} - -JA_MIME_KILL_RE = ${JA_MIME_KILL_RE:-"\ -name=.*(pcx|PCX)|charset=|This is.*MIME"} - -JA_MIME_KILL2_RE = ${JA_MIME_KILL2_RE:-"\ -Content-Type: +(text/html|application/ms-tnef|x-vcard)"} - -# If set, this header will contain the MIME type ("text/html" etc.) -# which was killed -JA_MIME_EXTRA_HEADER = ${JA_MIME_EXTRA_HEADER:-"X-Mime-Type-Killed"} - -# .................................................... &set-defaults ... -# Set default value, unless user has set this previously. - -:0 -* JA_MIME_TYPE ?? ^^^^ -{ - dummy = "$id: automatic JA_MIME_TYPE detection" - - # The (safe) default value. Will be changed below - - JA_MIME_TYPE = "application/ms-tnef" - - :0 - * ^Content-Type:.*image/()\/(jpeg|tiff|png|gif|bmp) - { - JA_MIME_TYPE = "image/$MATCH" - } - - :0 E - * ^X-Lotus-FromDomain: - { - JA_MIME_TYPE = "application/octet-stream" - dummy = "$id: Type: Lotus Notes" - } - - :0 E - * ^X-Mailer: (Microsoft.*Express|mozilla) - { - JA_MIME_TYPE = "text/html" - dummy = "$id: Type: MS Express,Netscape" - } - - :0 E - * ^X-Mailer:.*mozilla - * B ?? begin:.*vcard - { - JA_MIME_TYPE = "text/x-vcard" - dummy = "$id: Type: Netscape vcard" - } - - :0 E - * B ?? application/x-openmail - { - JA_MIME_TYPE = "application/x-openmail" - dummy = "$id: Openmail attachment found" - } - - # Remove executables - - :0 E - * B ?? application/x-msdownload - * MIME_B_ATTACHMENT ?? \.(hqx|com|exe|pif) - { - JA_MIME_TYPE = "application/x-msdownload" - dummy = "$id: MS *.exe attachment found" - } -} - -# - If user set JA_MIME_KILL_RE, make sure that value is not empty, -# because awk doesn't like empty regexps -# - Subtitute the value with something that doesn't match. - -:0 -*$ JA_MIME_KILL_RE ?? ^^^^ -{ - JA_MIME_KILL_RE = "_do_not___match_" -} - -:0 # This must have value -*! LINEBUF ?? [0-9] -{ - LINEBUF = 8192 -} - -jaMimeKillLINEBUF = $LINEBUF # save old value - -# ........................................................... &do-it ... - -# Prevent calling sh -c here. This speeds up procmail - -jaMimeKillSHELLMETAS = $SHELLMETAS # save original value -jaMimeKillModified = "no" # Flag -jaMimeKillMsg # Kill variable -SHELLMETAS # kill variable - -dummy = "JA_MIME_TYPE [$JA_MIME_TYPE]" -dummy = "MIME_BOUNDARY [$MIME_BOUNDARY]" -dummy = "Check if running the kill recipe, SHELL= $SHELL" - -:0 -* ! JA_MIME_TYPE ?? ^^^^ -* ! MIME_BOUNDARY ?? ^^^^ -* H ?? ^Content-Type:.*multipart -*$ B ?? ^Content-Type:$s+$JA_MIME_TYPE -{ - # If there were only 3 mime tags, then then message is in format - # - # boundary-tag - # message - # boundary-tag - # unwanted-mime-part - # boundary-tag - # - # a) make sure count is 3 - # b) make sure we have the boundary string - - LINEBUF = $JA_MIME_KILL_LINEBUF - - :0 - * MIME_BOUNDARY_COUNT ?? ^^3^^ - { - dummy = "$NL$NL$id: exactly 3 boundary strings" - - # - AWK removes the mime boundary strings, so we must remember - # if the message had quoted printable. The variable MIME_B_QP - # contain the qp information. - # - # Program logic (effectively a state machine) - # - First blank line is header end. Print header verbatim. - # - Keep track of seen boundaries: 1, 2, 3 - # - When EAT (text/html) portion is found, kill text up - # till next boundary marker - # - # We need the "i" flag because awk quits before it has read - # all the input - - :0 fbw i - | $AWK \ - ' \ - /^[ \t]*$/ { \ - print; \ - header = 0; \ - } \ - \ - header { \ - print; \ - next; \ - } \ - \ - $0 ~ RE { \ - boundary++; \ - } \ - \ - { \ - if ( killUntil ) \ - { \ - if ( boundary < killUntil ) \ - { \ - next; \ - } \ - killUntil = 0; \ - } \ - \ - line = tolower($0); \ - \ - if ( ! found && match($0, EAT) > 0 ) \ - { \ - found++; \ - killUntil = boundary + 1; \ - } \ - \ - if ( match($0, RE) > 0 ) {next} \ - if ( match($0, KILL) > 0 ) {next} \ - if ( match($0, "^Content-") > 0 ) {next} \ - \ - print; \ - } \ - ' RE="$MIME_BOUNDARY" \ - EAT="^Content-Type:.*$JA_MIME_TYPE" \ - KILL="$JA_MIME_KILL_RE" - - # -- If AWK succeeded -- - # The body is no more multipart/mixed. Correct headers or - # the MUA may get confused - - :0 a - { - # Why Rewrite Mime-Version: - # - # Lotus notes adds the boundary string to this header, but - # because we have already removed all boundary strings from the - # body, we must clear this header. - # - # Call to replace Mime-Version header wipes the `boundary=` tag - - :0 fhw - | $FORMAIL \ - -I "Content-Type: text/plain" \ - -I "Mime-Version: $MIME_VER" - - jaMimeKillMsg = "$JA_MIME_TYPE" - jaMimeKillModified = "yes" # Yes, we changed body - - } - } - - # Note: 1997-12-30 - # - # - This works fine for ms-tnef, but it may be dangerous with - # Lotus notes, because it's attachment is a general - # "application/octec-stream". - # - Report me the problems if you encounter them with Lotus Notes. - # - - # There was more than 2 mime parts: just remove the base64 block. - # - # - raise suppress flag if we find mime. Also change the mime type. - # - set flag back to 0 when the ending tag is found - # - print the lines when flag is 0 - # - # The ms-tnef is now converted to: - # - # ------ NextPart_000_01BD04D4.A5AC6B00 - # Content-Type: text/plain; - # - # ------ NextPart_000_01BD04D4.A5AC6B00-- - # - - dummy = "$NL$NL$id: _not_ exactly 3 boundary strings" - - :0 fbw - * ! MIME_BOUNDARY_COUNT ?? ^^3^^ - | $AWK \ - ' { \ - line = tolower($0); \ - \ - if ( match(line, HDR) > 0 ) \ - { \ - flag = 1; \ - print "Content-Type: text/plain;"; \ - } \ - \ - if ( match($0, RE) ) \ - { \ - flag = 0; \ - } \ - \ - if ( flag == 0 ) \ - { \ - print; \ - } \ - } \ - ' RE="$MIME_BOUNDARY" HDR="$JA_MIME_TYPE" - - LINEBUF = $jaMimeKillLINEBUF -} - -# ..................................................... &invalid-mime ... -# This is last resort, if message looks like MIME, but it isn't -# because it doesn't have headers: -# -# MIME-Version: 1.0 -# Content-Type: multipart/alternative; boundary="...." - -dummy = "$NL$NL$id: last resort, kill up till regexp" - -# Non-mime compliant messages -# -# The only way to kill attachment is to use approximation. -# If we do not have the boundary string (i.e. this not mime), -# then apply this recipe. - -dummy = "$id: MIME_BOUNDARY $MIME_BOUNDARY" - -:0 -* MIME_BOUNDARY ?? ^^^^ -* JA_MIME_KILL2_RE ?? [a-z] -*$ B ?? $JA_MIME_KILL2_RE -{ - LINEBUF = $JA_MIME_KILL_LINEBUF - - # Well we could use SED here, but then there is a problem with - # "/" delimiter in sed. The awk solution accepts REGEXP as is - # as you don't have to play with funny quoting - # - # sed -e "'"/$regexp/q"'" - # - # or something like that... (the above is untested) - - :0 fbw - | $AWK \ - ' { \ - if ( match($0,RE) > 0 ) {exit} \ - print \ - } \ - ' RE="$JA_MIME_KILL2_RE" - - :0 A - { - jaMimeKillMsg = "Forced kill by JA_MIME_KILL2_RE" - jaMimeKillModified = "yes" - } - - LINEBUF = $jaMimeKillLINEBUF -} - -# ............................................................... &qp ... -# Run conversion if it was quoted printable. -# Also reflect correct MIME header - -dummy = "$id: handle quoted printable" - -:0 fhw -* jaMimeKillModified ?? yes -* ! jaMimeKillMsg ?? ^^^^ -* ! JA_MIME_EXTRA_HEADER ?? ^^^^ -| $FORMAIL -I "$JA_MIME_EXTRA_HEADER: $jaMimeKillMsg" - -:0 fbw -* jaMimeKillModified ?? yes -* MIME_B_QP ?? yes -* MIME_BIN_QP ?? [a-z] -| $MIME_BIN_QP - - # If the previous recipe succeeded, then fix the headers to indicate - # decoding. - - :0 A fhw - | $FORMAIL -I "Content-Transfer-Encoding: 8bit" - -SHELLMETAS = $jaMimeKillSHELLMETAS # Restore original value - -dummy = "$id: end:" - -# end of file pm-jamime-kill.rc diff --git a/src/procmail/pm-jamime-recode.rc b/src/procmail/pm-jamime-recode.rc @@ -1,185 +0,0 @@ -# pm-jamime-recode.rc -- re-encode MIME Header: Subject, From as quoted-printable -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Documentation -# -# This subroutine supposes that message has been handled by -# 'pm-jamime-decode.rc'. The purpose is to restore *Subject* and -# *From* headers back to quoted printable format so that -# messages can be savely saved through IMAP system which may not -# handle 8-bit messages. If message is stored directly to -# mailbox and the used Mail user Agent has no problems with -# dealing 8-bit characters, this module is not needed. -# -# An example where this subroutine could be applied: -# -# o Feed message to `pm-jamime-decode.rc' -# o Feed message `pm-jasubject.rc' (to clean multiple Re: Re: Fwd ..) -# o Restore From/Subject encodings with `pm-jamime-recode.rc' -# o Save message to mailbox -# -# Notes -# -# Perl or python is not used, because both are CPU intensive. -# It would be too expansive for accounts or environments -# receiving hundreds of mails per day (like from several mailing -# lists). -# -# Required settings -# -# Variable `PMSRC' must point to source directory of procmail code. -# This subroutine will include -# -# o pm-javar.rc -# o pm-jamime.rc -# o Program `$MIME_BIN_QP_E' -# must have been installed (see pm-javar.rc). -# o pm-jamine-decode.rc must have been called and message must -# contain headers `X-Mime-Header-Decoded-*' -# -# Call arguments (variables to set before calling) -# -# o `JA_MIME_RECODE_TREAT_SUBJECT', default "yes". Decode -# Subject header by removing mime. -# o `JA_MIME_RECODE_TREAT_FROM', default "no". Decode -# From header by removing mime. -# -# Return values -# -# (none) -# -# Examples -# -# To fix Subject header and then make it 7bit clean again. Note, -# this may not be exactly what you want. The pm-jamime-decode.rc -# file does a little more than From/Header handling (also modifies -# message body). Read documentation of each file before using -# following example -# -# INCLUDERC = $PMSRC/pm-jasubject.rc -# INCLUDERC = $PMSRC/pm-jamime-decode.rc -# INCLUDERC = $PMSRC/pm-jamime-recode.rc -# -# Change Log (none) - -dummy = " -======================================================================== -pm-jamime-recode.rc: init: -" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -:0 -* ! MIME_VER ?? [0-9] -{ - INCLUDERC = $PMSRC/pm-jamime.rc -} -# .......................................................... &public ... -# User configurable sections - -JA_MIME_RECODE_REGEXP = ${JA_MIME_RECODE_REGEXP:-\ -"^Content-Type: *text/plain"} - -JA_MIME_RECODE_TREAT_SUBJECT = "yes" # Set to "no" to disable -JA_MIME_RECODE_TREAT_FROM = "no" # Set to "yes" to enable - -# ........................................................... &do-it ... -# Run conversion if it was quoted printable. -# Also reflect correct MIME header - -# Must be same header than in pm-jamime-decode.rc -JA_MIME_RECODE_HEADER = "X-Mime-Header-Decoded" -JA_MIME_RECODE_HEADER_SUBJECT = ${JA_MIME_RECODE_HEADER}-Subject -JA_MIME_RECODE_HEADER_FROM = ${JA_MIME_RECODE_HEADER}-From - -# Hard coded, do not change. We DO not know what chacters are in there, -# so we just use this encoding stanza and hope for the best. - -JA_MIME_RECODE_CHARSET_BEG = "=?iso-8859-1-?Q?" -JA_MIME_RECODE_CHARSET_END = "?=" - -dummy = "pm-jamime-recode.rc: handle quoted printable" - -handledSubject = "no" - -:0 -* JA_MIME_RECODE_TREAT_SUBJECT ?? yes -*$ ^$JA_MIME_RECODE_HEADER_SUBJECT -* ^Subject: +\/.* -{ - str = $MATCH - bin = $MIME_BIN_QP_E - beg = $JA_MIME_RECODE_CHARSET_BEG - end = $JA_MIME_RECODE_CHARSET_END - - # NOTE: not all sed (SunOS) know \t shortcuts. - - new = \ - ` echo "$str" \ - | $bin \ - | ${SED:-sed} \ - -e "s/^\(.*\)$/$beg\\1$end/" \ - -e 's/ /_/g' \ - ` - - handledSubject = "yes" - - :0 fhw - * ! new ?? ^^^^ - | $FORMAIL \ - -I "Subject: $new" \ - -I "$JA_MIME_RECODE_HEADER_SUBJECT:" -} - -# This part is identical to above (Procmail does not have subroutines) - -handledFrom = "yes" - -:0 -* JA_MIME_RECODE_TREAT_FROM ?? yes -*$ ^$JA_MIME_RECODE_HEADER_FROM -* ^From: +\/.* -{ - str = $MATCH - bin = $MIME_BIN_QP_E - beg = $JA_MIME_RECODE_CHARSET_BEG - end = $JA_MIME_RECODE_CHARSET_END - - new = \ - ` echo "$str" \ - | $bin \ - | ${SED:-sed} \ - -e "s/^\(.*\)$/$beg\\1$end/" \ - -e 's/ /_/g' \ - ` - - handledFrom = "yes" - - :0 fhw - * ! new ?? ^^^^ - | $FORMAIL \ - -I "From: $new" \ - -I "$JA_MIME_RECODE_HEADER_FROM:" -} - -dummy = "pm-jamime-recode.rc: end:" - -# End of file pm-jamime-recode.rc diff --git a/src/procmail/pm-jamime-save.rc b/src/procmail/pm-jamime-save.rc @@ -1,486 +0,0 @@ -# pm-jamime-save.rc -- save message's MIME attachement (one file) to a file -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Documentation -# -# This module saves _one_ simple file attachment (MIME) from he -# message. The message must define following MIME headers. If -# "filename=" does not exists, then the message is ignored. -# -# Mime-Version: <version> -# Content-Type: <type> -# Content-Disposition: attachment; filename="file.txt" -# -# The last line can also be in separate line, provided that it -# is indented according to standard rules: -# -# Mime-Version: <version> -# Content-Type: <type> -# Content-Disposition: attachment; -# filename="file.txt" -# -# Procmail is not very suitable for saving MIME attachments and -# you should not think that this the right tool for you. -# If you receive anything more than 1 attachment, this recipe -# does nothing, because that's out of our league and you need some -# more heavy weight mime tools. E.g. Perl CPAN has MIME libraries. -# -# _Note_: when the attachment is in the body, it is simply written -# to a disk and the location in message is replaced with test: -# -# Extracted to file:/users/foo/junk/<YYYY-MM-DD-hhmm>.file.txt. -# -# The existing mime headers that surround the attachment are -# lect untouched, so don't try to press your Mail Agent's MIME buttons -# at that point. There is no such file in that spot -# if you set `JA_MIME_SAVE_DEL' to `yes'. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This -# subroutine includes library: -# -# o pm-javar.rc -# o pm-jamime.rc -# o pm-jamime-decode.rc -# o pm-jadate.rc (which will call other pm-jadate*.rc files) -# -# Call arguments (variables to set before calling) -# -# o `JA_MIME_SAVE_DIR', point this to directory where you -# want to store attachments. -# o `JA_MIME_SAVE_DECODE', set this to "yes", if you want that -# attachment is decoded before written to disk. This usually -# opens quoted printable or base64 encoding. -# o `JA_MIME_SAVE_DEL', set this to "yes", if you want to remove -# the attachment from the body of the message after it has -# been filed. Be vary careful if you use this option. If you -# keep backup cache of incoming mail, then you might try "yes". -# o `JA_MIME_SAVE_OVERWRITE', set this to "yes" if it's okay to -# overwrite to an existing filename found from attachment. -# If you get periodic attachments always with same name, then -# you would want to set this to yes. -# -# Core dump note -# -# Because procmail uses LINEBUF when filtering messages, a core -# dump may happen if the attachment being filtered is bigger than -# the LINEBUF. The current setting accepts 524K attachments, but if -# you expect to get bigger than that, you want to increase -# `JA_MIME_SAVE_LINEBUF'. -# -# Possible conflict with your awk -# -# Awk is used because it is much more system load friendly than perl. -# If you see an error message in the log file saying that awk failed: -# -# procmail: Executing awk, -# ... -# procmail: Error while writing to "awk" -# procmail: Rescue of unfiltered data succeeded -# -# it means that the system's standard awk doesn't support the -# variable passing syntax. To verify that this is the case, run -# following test: -# -# % awk '{print VAR; exit}' VAR="value" /etc/passwd -# -# The proper awk should print "value". If not, then see if you have -# `nawk' or `gawk' in your system, which should understand the -# variable passing syntax. To change the AWK, you need to set -# following variable somewhere at the top of your *.procmailrc* -# -# AWK = "gawk" # if that works better than standard "awk" -# -# Return values (none) -# -# Change Log (none) - -dummy = " -======================================================================== -pm-jamime-save.rc: init:" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -:0 -* ! MIME_VER ?? [0-9] -{ - INCLUDERC = $RC_MIME -} - -:0 -* ! YYYY ?? [0-9] -{ - INCLUDERC = $RC_DATE -} - -:0 # if has no value, set it -*$ ! LINEBUF ?? $d -{ - LINEBUF = 1024 -} - -jaMimeSaveLinebuf = $LINEBUF - -# .......................................................... &public ... -# User configurable sections - -JA_MIME_SAVE_DIR = ${JA_MIME_SAVE_DIR:-"$HOME"} -JA_MIME_SAVE_DECODE = ${JA_MIME_SAVE_DECODE:-"no"} -JA_MIME_SAVE_DEL = ${JA_MIME_SAVE_DEL:-"no"} -JA_MIME_SAVE_LINEBUF = ${JA_MIME_SAVE_LINEBUF:-524280} -JA_MIME_SAVE_OVERWRITE = ${JA_MIME_SAVE_OVERWRITE:-"no"} - -# ........................................................... &do-it ... - -dummy = "pm-jamime-save.rc: HEADER; $MIME_H_ATTACHMENT" - -:0 -* MIME_H_ATTACHMENT ?? [a-z] -{ - jaMimeSaveFile = $MIME_H_ATTACHMENT - - :0 - * JA_MIME_SAVE_DECODE ?? yes - { - # decode regardless of body content - JA_MIME_DECODE_REGEXP = ".*" - - INCLUDERC = $RC_MIME_DECODE - } - - # ..................................................... filename ... - - :0 - * JA_MIME_SAVE_OVERWRITE ?? no - *$ ? $IS_EXIST $JA_MIME_SAVE_DIR/$jaMimeSaveFile - { - # Kill variable - jaMimeSaveDate - - :0 - *$ YYYY ?? $d - { - jaMimeSaveDate = "$YYYY-$MM-$DD" - - :0 - *$ hh ?? $d - { - jaMimeSaveDate = "$jaMimeSaveDate-$hh$mm" - } - - jaMimeSaveFile = "$jaMimeSaveDate.$jaMimeSaveFile" - - # Still not unique? - - :0 - *$ ? $IS_EXIST $JA_MIME_SAVE_DIR/$jaMimeSaveFile - { - :0 fhw - | $FORMAIL -I "X-jaMimeSave-Error: (file exists) $jaMimeSaveFile" - - # kill variable to prevent next recipe from running - jaMimeSaveFile - } - } - } - - # .................................................... write out ... - - :0 - * jaMimeSaveFile ?? [a-z] - { - :0 bwc: # do not modify body - * JA_MIME_SAVE_DEL ?? no - | $CAT > $JA_MIME_SAVE_DIR/$jaMimeSaveFile - - # Write out the attachment and replace body - # with reference to the file. - - :0 E - { - :0 - *$ LINEBUF ?? ^^([5-9]$d$d$d$d$d|$d$d$d$d$d$d$d)^^ - { - # User has set bigger linebuf than our default - } - :0 E - { - LINEBUF = $JA_MIME_SAVE_LINEBUF - } - - :0 fbw: - | ( $CAT > $JA_MIME_SAVE_DIR/$jaMimeSaveFile; echo "Saved to $JA_MIME_SAVE_DIR/$jaMimeSaveFile" ) - - LINEBUF = $jaMimeSaveLinebuf - } - } -} - -dummy = "pm-jamime-save.rc: BODY check" - -:0 E -* MIME_B_ATTACHMENT ?? [a-z] -* MIME_B_ATTACHMENT_FILE_COUNT ?? ^^1^^ -{ - dummy = "pm-jamime-save.rc: BODY ENTERED: only some limited operations." - jaMimeSaveFile = $MIME_B_ATTACHMENT - - # Try to locate the header where the content type is defined for - # file attachment. Note: there is no typo in the regexp, the - # caret(^) matches newline. - # - # Content-Type: application/octet-stream - # Content-Disposition: attachment; filename="file.txt" - # Content-Transfer-Encoding: 7bit - - dummy = "pm-jamime-save.rc: Check contentType BODY 1" - - :0 - *$ B ?? ^Content-Type:$s+\/.*\ - ^Content-Disposition:.*($MIME_B_ATTACHMENT\ - |^$s+.*$MIME_B_ATTACHMENT) - * MATCH ?? \/.* - { - contentType = $MATCH - } - - dummy = "pm-jamime-save.rc: Check contentType BODY 2" - - :0 E - *$ B ?? ^Content-Type:$s+\/.*\ - ^Content-Transfer-Encoding:.*\ - ^Content-Disposition:.*($MIME_B_ATTACHMENT\ - |^$s+.*$MIME_B_ATTACHMENT) - * MATCH ?? \/.* - { - contentType = $MATCH - - # The last "Content-Disposition" match allows two cases - # - # 1. Content-Disposition: attachment; filename="file.txt" - # - # 2. Content-Disposition: attachment; - # filename="file.txt" - - :0 - *$ B ?? ^Content-Type:.*\ - ^Content-Transfer-Encoding:$s\/.*\ - ^Content-Disposition:.*($MIME_B_ATTACHMENT\ - |^$s+.*$MIME_B_ATTACHMENT) - * MATCH ?? \/.* - { - contentEncoding = $MATCH - } - } - - # We expect that the headers come in this order. - # If they don't, then we can't know the encoding. - # We don't even try anything else: Procmail is not the right tool - # for complete MIME handling. - - dummy = "pm-jamime-save.rc: Check contentEncoding BODY" - - :0 - * contentEncoding ?? ^^^^ - *$ B ?? ^Content-Type:.*\ - ^Content-Disposition:.*\ - ^Content-Transfer-Encoding:$s+\/.* - { - contentEncoding = $MATCH - } - - :0 E - * contentEncoding ?? ^^^^ - *$ B ?? ^Content-Type:.*\ - ^Content-Transfer-Encoding:$s+\/.* - { - contentEncoding = $MATCH - } - - :0 - * contentEncoding ?? ^^^^ - *$ B ?? ^Content-Type:.*\ - ^Content-Transfer-Encoding:$s+\/.* - { - contentEncoding = $MATCH - } - - # ............................................... fix mixed-part ... - # In most typical message, sender "says" something in text/plain and - # then adds an atatchement - # - # But, due to order of the MIME headers we may have picked the - # text/plain. Change it to application/octet-stream if found. - # - # Mime-Version: 1.0 - # Content-Type: multipart/mixed; boundary="----------118D218634724256" - # - # ------------118D218634724256 - # Content-Type: text/plain; charset=us-ascii - # Content-Transfer-Encoding: 7bit - # - # - # ------------118D218634724256 - # Content-Type: application/octet-stream; name="Ass_rake.dbf" - # Content-Transfer-Encoding: base64 - # Content-Disposition: attachment; filename="Ass_rake.dbf" - - dummy = "pm-jamime-save.rc: Check contentType ($contentType) text/plain => application" - - :0 - * contentType ?? text/ - *$ B ?? ^Content-Type:$s+\/application.* - { - contentType = $MATCH - - dummy = "pm-jamime-save.rc: finding Transfer-Encoding for application/*" - - :0 - *$ B ?? ^Content-Type:$s+application.*\ - ^Content-Transfer-Encoding:$s\/.* - { - contentEncoding = $MATCH - } - } - - # ............................................... check filename ... - # Change filename if there is already that file - - dummy = "pm-jamime-save.rc: check filename" - - # Kill variable - jaMimeSaveDate - - :0 - *$ YYYY ?? $d - { - jaMimeSaveDate = "$YYYY-$MM-$DD" - - :0 - *$ hh ?? $d - { - jaMimeSaveDate = "$jaMimeSaveDate-$hh$mm" - } - - jaMimeSaveFile = "$jaMimeSaveDate.$jaMimeSaveFile" - - # Still not unique? - - :0 - *$ ? $IS_EXIST $JA_MIME_SAVE_DIR/$jaMimeSaveFile - { - :0 fhw - | $FORMAIL -I "X-jaMimeSave-Error: (file exists) $jaMimeSaveFile" - - # kill variable to prevent next recipe from running - jaMimeSaveFile - } - } - - # ........................................................ &save ... - - # 1) Locate the positions where the attachment starts - # 2) When found, start looking for empty line which ends the mime - # headers. GO is set to 1, when attachment starts - # 3) Attachment ends when mime boundary is hit. Actually - # it ended one line before that, which was a empty line. - - jaMimeSaveShellmetas = $SHELLMETAS - LINEBUF = $JA_MIME_SAVE_LINEBUF - SHELLMETAS - - :0 fbw - * MIME_BOUNDARY_COUNT ?? [1-9] - * jaMimeSaveFile ?? [a-z] - | $AWK \ - ' BEGIN { found = 0; go = 0 } \ - { \ - if ( match($0, MATCH) > 0 ) \ - { \ - found++; \ - } \ - if ( found && match($0, "^[ \t]*$") ) \ - { \ - go = 1; \ - next; \ - } \ - if ( match($0, MIME) > 0 ) \ - { \ - go = 0; \ - } \ - if ( go ) \ - { \ - if ( DELETE == "yes") \ - { \ - if ( urlFlag == 0 ) \ - { \ - urlFlag = 1; \ - printf "\nextracted to file:%s\n\n", FILE; \ - } \ - } \ - else \ - { \ - print; \ - } \ - print $0 >> FILE; \ - next; \ - } \ - print; \ - } \ - ' DELETE="$JA_MIME_SAVE_DEL" \ - MIME="$MIME_BOUNDARY" \ - COUNT="$MIME_BOUNDARY_COUNT" \ - MATCH="Disposition:.*$MIME_B_ATTACHMENT" \ - FILE="$JA_MIME_SAVE_DIR/$jaMimeSaveFile" - - LINEBUF = $jaMimeSaveLinebuf - SHELLMETAS = $jaMimeSaveShellmetas - - # ....................................................... decode ... - dummy = "pm-jamime-save.rc: Encoding($contentEncoding) of $jaMimeSaveFile" - - :0 - *$ jaMimeSaveFile ?? $a - *$ contentEncoding ?? $a - { - jaMimeSaveFile2 = "$jaMimeSaveFile.raw"; - - :0 wc - * contentEncoding ?? base64 - | $CAT $JA_MIME_SAVE_DIR/$jaMimeSaveFile \ - | $MIME_BIN_64 > $JA_MIME_SAVE_DIR/$jaMimeSaveFile2 \ - && $MV $JA_MIME_SAVE_DIR/$jaMimeSaveFile2 \ - $JA_MIME_SAVE_DIR/$jaMimeSaveFile - - :0 Ewc - * contentEncoding ?? quoted-printable - | $CAT $JA_MIME_SAVE_DIR/$jaMimeSaveFile \ - | $MIME_BIN_QP > $JA_MIME_SAVE_DIR/$jaMimeSaveFile2 \ - && $MV $JA_MIME_SAVE_DIR/$jaMimeSaveFile2 \ - $JA_MIME_SAVE_DIR/$jaMimeSaveFile - - } -} - -dummy = "pm-jamime-save.rc: end:" - -# End of file pm-jamime-save.rc diff --git a/src/procmail/pm-jamime.rc b/src/procmail/pm-jamime.rc @@ -1,245 +0,0 @@ -# pm-jamime.rc -- subroutine to read mime boundary etc. variables -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Documentation -# -# This includerc reads MIME boundary string from the message -# if it exists. The boundary string is typically found from -# Content-Type header. -# -# Mime-Version: 1.0 -# Content-Type: multipart/mixed; boundary=9i9nmIyA2yEADZbW -# -# In addition it will define few other mime variables. See the -# returned values. You use these variables later in your MIME -# message processing. -# -# Mime Notes -# -# 1998-07-28 Brett Glass <brett@lariat.org> reported in PM-L that -# there was security exploit in long attachment filenames: -# http://www.xray.mpe.mpg.de/mailing-lists/procmail/1998-07/msg00248.html -# -# And here is the url to the matter: -# -# http://www.sjmercury.com/business/microsoft/docs/security0728.htm -# -# -# When you use this module to detect mime messages, you can check the -# filename length with recipe: -# -# # Recipe after calling $RC_MIME, this module, -# -# re = ".........." # regexp with 10 matches -# too_long = "$re$re$re$re" # allow 40 characters maximum -# -# :0 -# *$ $SUPREME^0 MIME_H_ATTACHMENT ?? $re -# *$ $SUPREME^0 MIME_B_ATTACHMENT ?? $re -# { -# dummy = "** Dangerously long mime attachment filename" -# dummy = "** $MIME_H_ATTACHMENT $MIME_B_ATTACHMENT" -# -# :0 : -# /var/spool/mail/MimeDanger -# } -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include -# -# o pm-javar.rc -# -# Call arguments (variables to set before calling) -# -# (none) -# -# Return values -# -# o Variable MIME is set to "yes" or "no" if messages has mime version -# string -# o MIME_VER contains the mime version string from the header. -# o MIME_TYPE contains the Content-Type from the header. -# o MIME_CTE contains Content-Transfer-Encoding from the header. -# o MIME_H_QP is "yes" if Content-Transfer-Encoding: quoted-printable -# is in the header. -# o MIME_B_QP is "yes" if Content-Transfer-Encoding: quoted-printable -# is found from the body. -# o MIME_BOUNDARY contains the boundary string, which is used to -# differentiate mime sections in the body. -# o MIME_BOUNDARY_COUNT is the number of boundary strings found -# from the body. The value is 3 if there is two mime sections, -# and 4 if 3 etc. MIME_BOUNDARY_COUNT -1 = count of sections. -# o MIME_H_ATTACHMENT, contains the filename if there was attachement -# filename in the header. Content-Disposition: attachment; -# filename="..." -# o MIME_B_ATTACHMENT. `body' file attachment. Note however that -# this is the match of first string in the body. There may be -# several attachments. MIME_B_ATTACHMENT_FILE_COUNT tells you -# how many filenames are in the body. -# -# Usage example -# -# INCLUDERC = $PMSRC/pm-jamime.rc -# -# Change Log (none) - -# ............................................................ &code ... - - -dummy = " -======================================================================== -pm-jamime.rc: init:" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ..................................................... &output-vars ... -# output variables - -MIME = "no" # set default value -MIME_H_QP = "no" -MIME_B_QP = "no" - -MIME_VER -MIME_CTE -MIME_TYPE -MIME_BOUNDARY -MIME_BOUNDARY_COUNT - -# ........................................................... &do-it ... -# The WSPC ?? ( ) is there just double checking that we REALLY read -# the pm-javar.rc. We must not set any MIME variables if that wasn't -# read. - -:0 -* ^Mime-Version: *\/[0-9.]+ -* WSPC ?? [ ] -{ - MIME = "yes" - MIME_VER = $MATCH - - :0 - * ^Content-Type: +\/.* - { - MIME_TYPE = $MATCH - } - - :0 - *$ ^Content-Transfer-Encoding:$s+\/.* - { - MIME_CTE = $MATCH - - :0 - * MIME_CTE ?? quoted-printable - { - MIME_H_QP = "yes" - } - } - - :0 - *$ B ?? ^Content-Transfer-Encoding:$s+quoted-printable - { - MIME_B_QP = "yes" - } - - # What is the MIME tag in this message? - # - # Content-Type: multipart/mixed; - # boundary="---- =_NextPart_000_01BD04D4.A5AC6B00" - # - # Note that in the text, this string may not be excatly like this, - # Eg. in my messages there was "--" prepended to the tag. - # - - :0 - * boundary *= *\"\/[^\";]+ - { - MIME_BOUNDARY = $MATCH - } - - # Hm, the boundary string was not surrounded by double quotes. - # Search this kind of boundary string then: - # - # Content-Type: multipart/mixed; boundary=9i9nmIyA2yEADZbW - - :0 E - * boundary *= *\/[^\";]+ - { - # " Don't mind this, a dummy double quote to help Emacs - # to end starting quote below. Otherwise syntax colour - # highlighting would go beserk. - - MIME_BOUNDARY = $MATCH - } - - dummy = "pm-jamime.rc: Do we have the boundary string?" - - :0 - *! MIME_BOUNDARY ?? ^^^^ - { - # Count how many mime sections there are in the message. - # MIME_BOUNDARY_COUNT -1 = count of mime sections. - - :0 - *$ B ?? 1^1 $\MIME_BOUNDARY - { } - - MIME_BOUNDARY_COUNT = $= - } - - # Mime-Version: 1.0 (generated by tm-edit 7.106) - # Content-Type: application/octet-stream - # Content-Disposition: attachment; filename="file.txt" - # Content-Transfer-Encoding: 7bit - # - # Note: the second regexp assumes "filename=file.txt" - - mimeAttachementRegexp1 = "filename$s*=$s*[\"']\/[^\"\']+" - mimeAttachementRegexp2 = "filename$s*=$s*\/.*" - - :0 - *$ H ?? ^Content-Disposition:.*attachment$s*;$s*\/.* - *$ $SUPREME^0 MATCH ?? $mimeAttachementRegexp1 - *$ $SUPREME^0 MATCH ?? $mimeAttachementRegexp2 - { - MIME_H_ATTACHMENT = $MATCH - } - - :0 E - *$ B ?? ^Content-Disposition:.*attachment$s*;$s*\/.* - *$ $SUPREME^0 MATCH ?? $mimeAttachementRegexp1 - *$ $SUPREME^0 MATCH ?? $mimeAttachementRegexp2 - { - MIME_B_ATTACHMENT = $MATCH - - :0 - *$ B ?? 1^1 ^Content-Disposition:.*attachment.*filename - { } - - MIME_B_ATTACHMENT_FILE_COUNT = $= - - } -} - -dummy = "pm-jamime.rc: end:" - -# pm-jamime-tag.rc ends here diff --git a/src/procmail/pm-janetmind.rc b/src/procmail/pm-janetmind.rc @@ -1,214 +0,0 @@ -# pm-janetmind.rc -- handle http://minder.netmind.com/ messages -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# ** THIS MODULE IS OBSOLETE. THE NETMIND SERVICE NO LONGER EXISTS ** -# -# http://minder.netmind.com/ -# -# ...Netmind, or The URL-minder is a free, automatic Web-surfing robot -# that keeps track of changes to Web pages that are important to you. -# When the URL-minder detects changes in any of the Web pages you -# have registered, it sends you e-mail. an effective way to test if -# the address is known to Internet. You could use this information to -# see if some automated reply to a address can be sent. -# -# -# In another words, if you're interested in some URL; say an FAQ page -# and any updates to them, you can tell Netmind to monitor the page -# changes for you and it send a message back every time page changes. -# -# This recipe "pretty formats" the announcement sent by Netmind -# by stripping the message to bare minimum. You usually aren't interested -# in 4k message which includes "Note from our sponsors", "Try the free -# online demo" etc. The things saved from the announcement message are: -# -# o The changed url, which is moved to subject -# o Cancellation url pointer -# o url to the lists of your monitored urls -# o your id number -# -# [Note] -# -# Please let Netmind send you one "pure" message first so that you -# have a huch what it originally looks like. Then plug int his module -# and see how the original message is reduced. -# -# [Thank you] -# -# The Doctor What <docwhat@holtje-christian-isdn.mis.tandem.com> -# 1998-03-12 send me a patch, where a)body message is more informative -# b) URL is now included in the body for auto-click browsers c) -# mime headers were removed. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include -# -# o pm-javar.rc -# o If you se variable JA_NETMIND_SUBJECT to "yes", then the changed -# url http pointer is put to subject line. -# -# Usage example -# -# INCLUDERC = $PMSRC/pm-janetmind.rc # reformat the message -# -# :0: # drop to folder -# * netmind -# url.mbox -# -# Change Log (none) - -# .................................................... &initialising ... - - - -id = "pm-janetmind.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - - -# Are we allowed to change the Subject? - -JA_NETMIND_SUBJECT = ${JA_NETMIND_SUBJECT:-"no"} - -# ........................................................... &do-it ... -# catch both "From" and "From:" header lines - -:0 -* ^From.*netmind\. -{ - # ............................................... change subject ... - # Get the changed page and put it into subject line: you see immediate - # what page has changed when you browse your mailbox summary. - - subject = "" - - :0 - *$ ^Subject:\/.* - *$ MATCH ?? ()\/$a.* - { - subject = $MATCH - } - - - :0 - *$ 1^1 B ?? new changes in:$SPCL+\/.* - *$ 1^1 B ?? changed page, +visit:($)\/.* - *$ MATCH ?? ()\/$a.* - { - - TheUrl = $MATCH - - :0 fhw - * JA_NETMIND_SUBJECT ?? yes - | $FORMAIL -I "Subject: $MATCH" - - } - - # .................................................. change body ... - # The message from URL-minder is roughly 4k and lot of the information - # is useless. There is "note from out sponsor", how to stop requesting - # messages etc. - - # To retrieve the password - - pass = "" - - :0 - * B ?? ()\/http.*netmind.*responder.* - { - pass = $MATCH - } - - # To update your account visit - - update = "" - - :0 - *$ B ?? ().*update.*account.*($)\/.* - { - update = $MATCH - } - - - # Save the cancel information - - cancel = "" - - :0 - *$ B ?? ^To$s+cancel.*this.*($)\/.* - { - cancel = $MATCH - } - - # Save "NetMind List" pointer: list of monitored urls - - cancelAll = "" - - :0 - *$ B ?? ^To$s+cancel.*all.*($)\/.* - { - cancelAll = $MATCH - } - - # .......................................................... body ... - # modify the body only if we got enough matches - - dummy = "$id: changing message contents" - - :0 - * update ?? [a-z] - * cancel ?? [a-z] - * cancelAll ?? [a-z] - { - - # Remove the mime headers, the message is no longer MIME. - - :0 fhw - | $FORMAIL -I "Content-Type:" -I "Mime-Version:" - - # Avoid multiple echo commands and put message into one string - - msg = "Subject : $subject${NL}Changed : $TheUrl${NL}Update : $update" - msg = "$msg${NL}${NL}Cancel this: $cancel${NL}Cancel all : $cancelAll" - - :0 fbw - | echo "$msg$NL" - - } - :0 E #else statement - { - dummy = "$id: $JA_MSG_ERROR the message format has changed" - dummy = "$id: $JA_MSG_ERROR send copy to maintainer of the module" - } - -} - -dummy = "$id: end:" - -# end of file pm-jadate.rc diff --git a/src/procmail/pm-janslookup.rc b/src/procmail/pm-janslookup.rc @@ -1,395 +0,0 @@ -# pm-janslookup.rc -- run nslookup on variable INPUT -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This subroutine runs `nslookup' on given INPUT address. This may be -# an effective way to test if the address is known to Internet. You -# could use this information to determine if some automated reply to -# a address can be sent. The know truth is that you can't validate -# whole email address -# -# to_someone@foo.com -# -# but you can validate "foo.com"; that's the closest you get. -# -# [Warning: If you don't use cache feature...] -# -# Do not however use this module to regularly check _all_ incoming -# from addresses with this subroutine for possible bogus UBE -# addresses, because calling nslookup -# -# o may be slow, building to connection and querying the results -# may take several seconds. (some times, usually it's quote fast) -# o consumes quite a lot resources. -# -# You can however check _some_ messages that are likely UBE to verify -# your doubts. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include -# -# o pm-javar.rc -# o pm-jaaddr.rc -# -# Call arguments (variables to set before calling) -# -# o INPUT, the address (only strict domain part) which is checked. -# Eg. "this.domain.com". See examples for more. -# If this string contains "@" character, then additional -# subroutine pm-jaaddr.rc is called to extraxt the domain name -# INPUT = "John Doe <foo@site.com>" --> INPUT = "site.com" -# o JA_NSLOOKUP_CACHE, filename. If exists, cache is used and updated. -# o JA_NSLOOKUP_FORCE, if "yes", then cache is not used but a forced -# nslookup is performed. -# o JA_NSLOOKUP_OPT, is currently empty, but you could see if you -# you want to use "-querytype=MX". However this option may give -# you response: "No mail exchanger (MX) records available", -# which is flagged as nslookup failure. -# o JA_NSLOOKUP_SERVER, optional, the server to user for nslookup -# -# If the cache file can be read: -# -# o Each entry has format "address.com ns-error". The error -# indication is added to the line if the nslookup failed when -# address was checked. Otherwise line contains "address.com". -# o The cache is always checked first. If there is no entry matching -# the current address, only then is nslookup called and new entry -# added to cache. -# -# Return values -# -# o Variable ERROR will be set to "yes" if nslookup failed or -# to "no" if nslookup succeeded. It can also contain "maybe" if -# nslookup returned "No address (A) records available" -# o ERROR_MATCH contains one line lookup failure reason. -# -# Following conditions trigger "maybe" and no "ns-error" is written -# into the cache. -# -# o "No address (A) records available for xxx" -# -# Usage example -# -# If you are going to check some header field, like From:, please -# explode the content with pm-jaaddr.rc first. Suppose you have -# string: -# -# "From: foo@ingrid.sps.mot.com (Yoshiaki foo)" -# -# You have to derive the address from string and pass the site name: -# Read From: field and address from it. -# -# PMSRC = $HOME/pm -# RC_NSLOOKUP = $PMSRC/pm-janslookup.rc # name the subroutine -# -# :0 -# * MAYBE_UBE ?? yes -# * ^From:\/.* -# { -# INPUT = $MATCH -# INCLUDERC = $RC_NSLOOKUP # to nslookup -# -# :0 -# * ERROR ?? yes -# { -# # Hm, nslookup failed, can't send anything back to this -# # address -# } -# } -# -# Second example, check if the address is reachable before sending reply -# -# INPUT = `$FORMAIL -rt -x To:` -# INCLUDERC = $RC_NSLOOKUP -# -# :0 -# * ERROR ?? no -# { -# # okay, at least site address seems to be reachable -# } -# -# -# Change Log (none) - -# .................................................... &initialising ... - - -dummy = " -======================================================================== -pm-janslookup.rc: init: INPUT = $INPUT" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# If user gave string that had Email, explode it automatically -# INPUT = "John doe <foo@site.com>" --> "site.com" - -:0 -* INPUT ?? @ -{ - INCLUDERC = $PMSRC/pm-jaaddr.rc # - explode INPUT string - INPUT = $SITE # - the address is only fed -} - -# ...................................................... &input-vars ... -# o INPUT contains the address to check -# o JA_NSLOOKUP_CACHE is optional - -# Set to empty "" if you don't wan't to use cache in some particular -# cases - -JA_NSLOOKUP_CACHE = ${JA_NSLOOKUP_CACHE:-"$HOME/.nslookup.cache"} - -# other options - -JA_NSLOOKUP_FORCE = ${JA_NSLOOKUP_FORCE:-"no"} -JA_NSLOOKUP_OPT = ${JA_NSLOOKUP_OPT:-"-querytype=MX"} -JA_NSLOOKUP_SERVER = ${JA_NSLOOKUP_SERVER:-""} - -NSLOOKUP = ${NSLOOKUP:-"nslookup"} # Add `-silent' in Linux -TOUCH = ${TOUCH:-"touch"} # binary to create cache file - -# ..................................................... &output-vars ... -# output variables - -ERROR = "yes" -ERROR_MATCH - -# ........................................................... &do-it ... -# ErrorWord is not really ment for user configurable, but -# as you can see, it is coded that way in case you would like to -# use some other error word. - -ErrorWord = ${ErrorWord:-"nlookup-error"} -dummy = "pm-janslookup.rc: do the work" - -# The string must have one dot somewhere, otherwise it is not a domain - -:0 -*$ INPUT ?? $NSPC+\.$NSPC+ -{ - topDomain = "xxx-dummy-regexp" - cache = "no" - entry = "no" - - :0 - * INPUT ?? ()\/[^.]+\.[^.]+^^ - { - topDomain = $MATCH # xxx.foo.com --> foo.com - } - - # If variable is not empty, suppose that user wants to use cache - - :0 - * ! JA_NSLOOKUP_CACHE ?? ^^^^ - * JA_NSLOOKUP_FORCE ?? no - { - cache = "yes" - - :0 hwic # Create file if it doesn't exist. - * ! ? $IS_EXIST $JA_NSLOOKUP_CACHE - | $TOUCH $JA_NSLOOKUP_CACHE - } - - dummy = "pm-janslookup.rc: Test if cache is in use" - - :0 - * cache ?? yes - *$ ? $IS_READABLE $JA_NSLOOKUP_CACHE - { - # Convert regexp to "safe" format, escapeping regexp - # metacharacters. See pm-tips.txt - - regexp = "$\INPUT" - - :0 # kill leading "()" - * regexp ?? ^^\(\)\/.* - { - regexp = "$MATCH" - } - - # b) search hostname and SPACE like in: "this.site.com nlookup-error" - # a) or "this.site.com" - - line = `$EGREP "^$regexp( | *$)" $JA_NSLOOKUP_CACHE` - - :0 # was this address in cache? - *$ line ?? $INPUT - { - entry = "yes" - } - - dummy = "pm-janslookup.rc: Test if cache line does _not_ include $ErrorWord" - - :0 - * entry ?? yes - *$ ! line ?? $ErrorWord - { - ERROR = "no" - } - } - - # Cache is not used OR there was no line in the cache - - dummy = "pm-janslookup.rc: Test if we call nslookup" - - :0 - * entry ?? no - { - stat = `$NSLOOKUP $JA_NSLOOKUP_OPT "$INPUT" $JA_NSLOOKUP_SERVER` - - # If nslookup succeeds, at least HP-UX 9/10, ULTRIX and SUN - # return some of these choices upon success: - # - # Non-authoritative answer: - # Name: uta.fi - # - # Or - # - # Non-authoritative answer: - # geocities.com preference = 0, mail exchanger = ... - # - # Or - # - # Name: foo.com - # Address: 209.54.94.60 - # - # Or - # - # Authoritative answers can be found from: - # foo.com - # origin = xx.foo.com - # - # Or - # Non-authoritative answer: - # foo.com mail exchanger = 0 mx1.foo.com. - # - # Or ^($)$topDomain - # - # This needs some explaining. When procmail captures - # the `nslookup' command it does it wrong for some unknown reason - # for some mail hosts. The captured output is: - # - # procmail: Assigning "stat=Name Server: zeus.tele.nokia.fi - # Address: 131.228.134.50 - # - # umd.umich.edu - # origin = tiamat.umd.umich.edu - # mail addr = hostmaster.tiamat.umd.umich.edu - # serial = 970727 - # refresh = 28800 (8 hours) - # retry = 14400 (4 hours) - # expire = 2419200 (28 days) - # minimum ttl = 14400 (4 hours)" - # - # notice? The line "Authoritative answers can be found from:" - # is not there while it is if I run the same command is - # run from command line. - - # |Authoritative answers can be found from:($).* - - :0 - * stat ?? ()\/No +address.*available.* - { - # *** No address information is available for ... - ERROR_MATCH = $MATCH - ERROR = "yes" - } - - :0 E - *$ stat ?? ()\/answer:($)(Name:)? *$INPUT\ - |(Name: *$INPUT)|from:($) +$topDomain\ - |($) *$topDomain - { - ERROR = "no" - } - - # ............................................. Linux/Cygwin ... - # Win32/Cygwin nslookup returns this answer - - # prompt> nslookup -querytype=MX cs2.tpu.fi - # - # Non-authoritative answer: - # Server: nsX.koti.tpo.fi - # Address: 212.63.10.250 - # - # cs2.tpu.fi MX preference = 0, mail exchanger = xxx.tpu.fi - # cs2.tpu.fi MX preference = 10, mail exchanger = yyy.tpu.fi - # cs2.tpu.fi MX preference = 20, mail exchanger = zzz.funet.fi - # - # fi nameserver = HYDRA.HELSINKI.fi - # fi nameserver = NS-SE.ELISA.NET - # fi nameserver = PRIFI.FICORA.fi - # fi nameserver = NS1-FIN.GLOBAL.SONERA.fi - # fi nameserver = T.NS.VERIO.NET - # fi nameserver = NS.UU.NET - # xxx.tpu.fi internet address = 193.167.70.45 - # yyy.tpu.fi internet address = 193.167.70.20 - # mail.funet.fi internet address = 193.166.0.98 - # mail.funet.fi internet address = 193.166.0.97 - # HYDRA.HELSINKI.fi internet address = 128.214.4.29 - # PRIFI.FICORA.fi internet address = 193.229.4.44 - - dummy="Win32/Cygwin nslookup check" - - :0 - *$ stat ?? internet address = .*$topDomain - { - ERROR = "no" - } - - # .................................................. message ... - - msg = "" - - :0 - * ERROR ?? yes - { - msg = $ErrorWord - } - - :0 - * ERROR ?? maybe - { - msg = "maybe" - } - - # .............................................. write cache ... - - dummy = "pm-janslookup.rc: Test if '$INPUT' should be added to cache" - - :0 hwic: - * cache ?? yes - | echo "$INPUT $msg" >> $JA_NSLOOKUP_CACHE - - } -} - -:0 E -{ - dummy = "pm-janslookup.rc: $JA_MSG_ERROR invalid INPUT" -} - -dummy = "pm-janslookup.rc: end: input: $INPUT error: $ERROR" - -# end of file pm-janslokup.rc diff --git a/src/procmail/pm-jaorig.rc b/src/procmail/pm-jaorig.rc @@ -1,273 +0,0 @@ -# pm-jaorig.rc -- Extract embedded original message (simple recipe) -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Documentation -# -# This subroutine digs embedded message from the body and replaces -# current message with it. Copy the message to folder before calling -# this subroutine if you need original. -# -# NOTE: This is _simple_ tool and the sole purpose is to derive -# simple embedded messages. Write full fledged perl script if you -# want better extracting features. The used AWK inside this procmail -# recipe will fail to find 30% of the cases, mostly due to non-standard -# way of including the message. The recognized formats are as follows. -# Anything that differs from these are ignored or incorrectly parsed. -# -# o Message is embedded left flushed "as is". With full headers or -# Minimum of `From:' `Subject' `Received' -# o The embedded message is quoted with `>' with optional _one_ -# space. -# -# Where you would use this module -# -# If you're subscribed to mailing lists that regularly sent copies of -# original message to the list, like forwarding spam to SPAM-L -# mailing list at http://bounce.to/dmuth, then you'd like to -# extract the original embedded message which you can then feed to -# your UBE filter to test if the shield holds. -# -# <spam-l-request@peach.ease.lsoft.com> -# subscribe SPAM-L <First name> <Last name> -# -# This recipe takes simplistic approach and tries it's best to -# extract embedded message. Idea for this recipe comes from Era -# Eriksson's posting "recipe to turn list postings back into original -# spam" 1998-06-25 in Procmail mailing list. -# -# o Body must contain headers -# o Remove all `>' quotations. -# o extract everything to the end of message. (There are no means -# to get rid of the attached signatures that ot forwarding poster -# or list server may have attached. -# -# How the message is extracted -# -# When this recipe ends, the current message has been modified so that -# it _is_ _the_ _original_ _message_. Like if you would receive: -# -# HEADER-1 # The poster -# body-1 # his comments -# HEADER-2 # The original embedded message -# body-2 -# body-1 # And poster's signature or mailing list footer -# -# The message now looks like -# -# HEADER-2 -# body-2 -# body-1 -# -# And you can save this as original message or feed it to your -# UBE filter and test if it detects it. -# -# Code note: procmail or awk core dump -# -# For some reason procmail kept dumping core I write the code in -# more nicer format like below, but if I made it compact, then it -# didn't dump core. Go figure. I'm not pleased that I had to sacrafice -# clarity, but there was no other way. -# -# [The good style] [The forced compact style] -# if () if () { statement } -# { -# statement -# } -# -# I have no explanation why this -# happens, the same AWK code would work just fine most of the cases and -# then came this message `x' and caused dumping the code, if I feed -# some other message, I didn't get core dump. Total mystery to me. -# Don't let the log message fool you, this had nothing to do -# regexp "^[> ]*From:.*[a-zA-Z]". If I deletd one line from AWK -# script, it worked ok, if I added it back the core dump happened with -# that message `x' -# -# procmail: Assigning "pfx=[> ]*" -# procmail: No match on "^[> ]*From:.*[a-zA-Z]" -# Segmentation fault (core dumped) -# -# Required settings -# -# PMSRC must point to source directory of procmail includerc code. -# This subroutine needs module(s): -# -# o pm-javar.rc -# -# Call arguments (variables to set before calling) -# -# (none) -# -# Usage Example -# -# Let's assume that you want to feed all forwarded UBE that is -# posted to spam-l mailing list to your filter and see if it needs -# improving by checking the logs later. The forwarded UBE to the list -# is labelled "SPAM:" in the subject line. -# -# $RC_LIST = $PMSRC/pm-jalist.rc # mailing list detector -# $RC_ORIG = $PMSRC/pm-jaorig.rc # extract original -# $RC_UBE = $PMSRC/pm-jaube.rc # UBE filter -# -# ... -# -# INCLUDERC = $RC_LIST # defines variable `LIST' -# -# :0 -# * ! LIST ^^^^ -# { -# :0 # spam-l mailing list -# * LIST ?? spam -# * Subject: +SPAM: -# { -# INCLUDERC = $RC_ORIG # Change it to UBE message -# -# # Ok, next feed it to filter, set some variables first -# # Log = Short log; What filters were applied to message -# # mbx = If message was trapped, save it here -# -# JA_UBE_LOG = "$PMSRC/pm-ube.log" -# JA_UBE_MBOX = "junk.ube.ok.mbox" -# -# INCLUDERC = $RC_UBE -# -# :0 : # If comes here, filter failed -# junk.ube.nok.mbx -# } -# -# :0 : # save normal list messages -# list.$LIST -# } -# -# -# -# Change Log (none) - - -# ............................................................ &init ... - - -id = "pm-jaorig.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# .......................................................... &detect ... - -pfx = "[> ]*" - -:0 -*$ B ?? ^${pfx}From:.*$a -*$ B ?? ^${pfx}Subject:.*$a -*$ B ?? ^${pfx}Received: +from -{ - - # Remove all original headers from the message, - # AWK will shift up the headers in the body - - :0 fhw - | echo "" - - - :0 # make sure LINEBUF has value or procmail dumps core - *$ ! LINEBUF ?? $d - { - LINEBUF = 8192 - } - - # Set bigger LINEBUF. Otherwise procmail/awk may dump core when - # a big message is handled. - - savedLinebuf = $LINEBUF - LINEBUF = 524280 - - savedShell = $SHELLMETAS - SHELLMETAS - - # How it works: - # - # *) Because AWK can't do multi line matches, we have to use two flags: - # `prevHead' is set to 1 as soon as header line is detected. - # _BUT_ in order to start header, it must follow with next - # header immediately. The `head' is set to 1 only if previous - # line was header. - # - # --> when `head' is raised, then main starts printing the message - # - # *) do case insensitive match and filter out certain lines. - # - # *) `Received:' Header is immediate indication of message. - # - # *) Remove `>' quotation - # - # *) Print embedded message - # - # variable `end' is set as soon as there is end of headers. - # we fix continued non-header start lines by preceding them - # with two spaces. (Forwarded message to spam-l was all left - # flushed, thus breaking the proper RFC header continuation) - # Var `end' tells when we must not fix lines any more. - # - - :0 fhbw - | $AWK \ - ' \ - /^[>]* ?([A-Z][-a-zA-Z]+:|^From )/ \ - { if( prevHead && !head) {print prev; head=1} } \ - \ - { \ - str = tolower($0); \ - if ( match(str, "forwarded message") > 0) { next } \ - if ( match(str, "received: +from|return-path:")>0) { head = 1 } \ - \ - if ( head == 1 ) \ - { \ - sub("^[>]",""); \ - if ( match($0,"^[ ]*$") ) { end = 1 } \ - if ( !end ) { sub("^ +","")} \ - if ( !end && match($0,"[A-Z][-a-zA-Z]+:|^From ") < 1) \ - { $0 = " " $0; } \ - print; \ - } \ - \ - prevHead = 0; \ - if ( match($0, "^[>]* ?([A-Z][-a-zA-Z]+:|^From )") > 0 ) \ - { prevHead = 1; prev = $0; } \ - } \ - ' - - LINEBUF = $savedLinebuf - SHELLMETAS = $savedShell - - # Add a From_ line if it doesn't have one. - - :0 fhw - *$ ! ^^From$s+ - | $FORMAIL - -} - -dummy = "$id: end:" - -# End of file pm-jaorig.rc diff --git a/src/procmail/pm-japing.rc b/src/procmail/pm-japing.rc @@ -1,125 +0,0 @@ -# pm-japing.rc -- reply shortly to message "Subject: ping"; account ok -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# When I'm on remote site and I don't seem to get throught -# with telnet or even with Unix ping(1), I want to know if the -# at least the mail server is up. I can send a ping message and the -# auto responder will reply immediately. -# -# Sometimes, when you send a message to a person, it would be nice, -# if you could test that the destination address is valid, before -# sending a message to a black hole. If the receiver had ping -# service running; like this, then you would know that you spelled the -# the right address. (after wondering two weeks; why you don't get -# response). Nowadays `finger(1)' command seems to be blocked many times. -# -# This recipe answers to simple ping message like this: -# -# To: you@site.com -# Subject: ping -# -# Recipe sends a short message back to the sender. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include -# -# o pm-javar.rc -# o pm-jastore.rc -# -# Call arguments (variables to set before calling) -# -# (see Usage) -# -# Usage example -# -# JA_PING_MBOX = $HOME/Mail/spool/ping.spool -# INCLUDERC = $PMSRC/pm-japing.rc -# -# Change Log (none) - - -# .................................................... &initializing ... - - -id = "pm-japing.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ........................................................... &input ... - -JA_PING_MBOX = ${JA_PING_MBOX:-"junk.ping"} -JA_PING_XLOOP = ${JA_PING_XLOOP:-"$LOGNAME ping"} - -# ............................................................ &code ... - -dummy = "$id: start:" - -:0 -*$ ^Subject:$s*ping$s*$ -*$ ! ^X-Loop: $JA_PING_XLOOP -*$ ! $JA_FROM_DAEMON -{ - :0 fhw - | $FORMAIL -rt -A "X-Loop: $JA_PING_XLOOP" - - # Remember, Don't send back anything that would be vital to attacker. - # It doesn't matter if the `uptime` or other scripts fail, the reply - # is sent anyway. - # - # Record this ping request - # - # 'a' Makes sure Formail succeeded and could create reply address. - # HOST is your Mail delively host; the same where your programs - # will run. - - :0 ahwc - | ( $CAT -; \ - uptime; \ - echo "[$HOST] User count: "; who | wc -l; \ - echo "Unread mail count:"; $GREP '^From ' $DEFAULT |wc -l; \ - ) | $SENDMAIL - - MBOX = $JA_PING_MBOX - INCLUDERC = $PMSRC/pm-jastore.rc -} - - -# When pinging yourself -# the reply message comes back to you as "Re: ping" - -:0 -*$ ^Subject:.*\<ping\>$s*$ -{ - MBOX = $JA_PING_MBOX - INCLUDERC = $PMSRC/pm-jastore.rc -} - -dummy = "$id: end:" - -# end of pm-japing.rc diff --git a/src/procmail/pm-japop3.rc b/src/procmail/pm-japop3.rc @@ -1,415 +0,0 @@ -# pm-japop3.rc -- Remotedly download messages by mail command request -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# Ahem, that `pop3' is just to draw your attention. This module has -# nothing to do with pop3. The idea may resemble it though. This -# module listens pop3 requests, and when it gets one, it sends -# the whole mailbox content as separate forwarded messages to the -# account from where you sent the request. -# -# This is kinda "empty my mailbox in account X and send the messages -# to account Y" -# -# You might have permanent forwarding on in account X, but if that -# is your secondary account, you can ask what messages has been arrived -# there with this recipe. -# -# After you have configured your magic pop3 command, which is your -# password, simply send a message to account X, and this module -# initiates emptying the mailbox. Here is an example: -# -# Subject: pOp3-send [mailbox] [kill] -# -# o `mailbox', is optional folder name which you want to process. -# it is $DEFAULT if not given in subject. Use *absolute* path if -# you specify one. -# o if word `kill' is found, the mailbox will be emptied after -# forwarding. If the word is not found, messages are preserved. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include -# -# o pm-javar.rc -# o pm-japop3.rc # Phew! We include ourself, we are recursive. -# -# Call arguments (variables to set before calling) -# -# o `JA_POP3_SUBJECT_CMD' is your personal access command string. -# If this is the first word in the subject line, forwarding starts. -# This string is case sensitive. -# o `JA_POP3_TMP' is the file where mailbox is moved before starting -# to forward the messages. Do not put to point to your $HOME, -# becaus that may exceed the quota. -# o `JA_POP3_TO_MUST_MATCH' must contain regexp that match the email -# addresses where the pop3 messages are allowed to send. BE SURE -# TO DEFINE this. If you have account X,Y,Z where you want to receive -# pop3 messages, set this regexp to match those site's email addresses. -# o `JA_POP3_LOGFILE' is the log where you can see how the forked -# procmail processes send each pop3 mail. You may want to set this -# to different location than your default `$LOGFILE'. -# -# Return value -# -# `STATUS' will contain mailbox name if valid pop3 request was received. -# You may wish to save the pop3 requests to separate folder. See example -# below. -# -# Example usage -# -# You install this same setup for each site where you have account. This -# is the account X, from where you want to empty the mailboxes. -# -# RC_POP3 = $PMSRC/pm-japop3.rc -# -# .. somewhere in your .procmailrc .. -# -# JA_POP3_SUBJECT_CMD = myPoPcmd -# INCLUDERC = $RC_POP3 -# -# # Save all pop3 requests to folder -# -# :0 : -# * STATUS ?? [a-z] -# mail.pop3-req.mbox -# -# -# In account Y, from where you send the pop3 requests. Following code stores -# the received messages to separate folder -# -# # The MATCH will contain the host name from where the messages -# # were moved -# -# :0 : -# *$ X-Loop-Fwd:.*\.rc +\/$NSPC+ -# mail.fwd.$MATCH.mbox -# -# Change Log (none) - -# ............................................................ &init ... - -id = "pm-japop3.rc" -dummy = " -======================================================================== -$id: init: -" - -dummy = "$id: FORKED PROCESS: $JA_POP3_CHILD $JA_POP3_FWD_TO -DEFAULT [$DEFAULT] $NL$NL" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# .......................................................... &public ... - -JA_POP3_TMP = ${JA_POP3_TMP:-"$TMPDIR/$LOGNAME.pop3"} -JA_POP3_SUBJECT_CMD = ${JA_POP3_SUBJECT_CMD:-"XyZ-yourPop3-cmd"} -JA_POP3_TO_MUST_MATCH = ${JA_POP3_TO_MUST_MATCH:-"Allowed-address-regexp"} -JA_POP3_LOGFILE = ${JA_POP3_LOGFILE:-"$LOGFILE"} - - -# Do not set this to "sendmail -oi -t" - -JA_POP3_SENDMAIL = ${JA_POP3_SENDMAIL:-"sendmail"} # /usr/lib/ - -# Script to call to handle each piece of forwarded mail. - -JA_POP3_RC = ${JA_POP3_RC:-"$PMSRC/pm-japop3.rc"} # don't touch - -# ......................................................... &private ... - -# Don't change or define these variables anywhere! These are passed -# to child process from this module when forking new procmail copy. - -JA_POP3_CHILD = ${JA_POP3_CHILD:-"not-child"} -JA_POP3_FWD_TO = ${JA_POP3_FWD_TO:-""} - -# ..................................................... &output-vars ... - -STATUS - -# .............................................. start-pop3-transfer ... - -:0 D -* JA_POP3_CHILD ?? not-child -*$ ^Subject: $JA_POP3_SUBJECT_CMD\/.* -{ - subject = $MATCH - - - # Set default values - - error = "" - kill = "" - mbox = "" - - mailbox = $DEFAULT - keyword = "forwarded to" - address = `$FORMAIL -rt -x To:` - - # - mark each message forwardable by adding X-Loop header. - - xloop = "X-Loop: $keyword $address from $HOST" - - # ................................................... &kill-flag ... - - :0 - * ^Subject:.* kill\> - { - kill = "yes" - } - - # ............................................... &other-mailbox ... - - dummy = "$id: Check /mailbox/ keyword in subject line" - - :0 - *$ subject ?? ()\/$NSPC+ - { - mailbox = $MATCH - } - - # ................................................. check-access ... - - :0 - *$ ! address ?? $JA_POP3_TO_MUST_MATCH - { - error = "Invalid destination [$address]" - } - - - # ............................................... &check-mailbox ... - - :0 - * error ?? ^^^^ - * mailbox ?? [a-z] - *$ ? $IS_READABLE $mailbox - { - mbox = $mailbox - } - - :0 e - { - error = "mailbox is not readable" - } - - # ............................................... &check-formail ... - - :0 fh w # Just check that formail is working ok - * error ?? ^^^^ - | $FORMAIL -I"X-Dummy-Test: xyz" - - :0 e - { - error = "formail [$FORMAIL] not working right" - } - - # ................................................. &check-child ... - - :0 - * error ?? ^^^^ - *$ ! ? $IS_EXIST $JA_POP3_RC - { - error = "child module does not exist" - } - - # ............................................. &prepare-mailbox ... - - japop3LOCKFILE = $LOCKFILE - lockFile = $JA_POP3_TMP$LOCKEXT - - - # ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~ &protect .~. - # We must not allow another request to arirve during this period - # for this same mailbox. Any new try must be ignored - - :0 - *$ ! $IS_EXIST $lockFile - { - - # Activate regional lockfile. no other file locks are needed - # from now on. - - LOCKFILE = $lockFile - - - :0 hwic # copy to temporary place - * error ?? ^^^^ - * mbox ?? [a-z] - | $CP $mbox $JA_POP3_TMP - - :0 e - { - error = "cp [$CP] failure" - } - - - :0 hwic # protect mailbox - * error ?? ^^^^ - | $CHMOD 600 $JA_POP3_TMP - - :0 e - { - error = "chmod [$CHMOD] protection failure" - } - - # ....................................................... &do-it ... - - dummy = "$id: Check if pop3 should be initiated." - - :0 - * error ?? ^^^^ - * CP ?? [a-z] - * CAT ?? [a-z] - *$ ! ^$xloop - { - STATUS = $mbox - - :0 - *$ ? $IS_READABLE $mbox - { - - dummy = "$id: child: $TIMEOUT $HOST $JA_POP3_RC" - dummy = "$id: SH [$SHELL]" - dummy = "$id: SENDMAIL [$SENDMAIL]" - dummy = "$id: FORMAIL [$FORMAIL]" - dummy = "$id: PROCMAIL [$PROCMAIL]" - dummy = "$id: HOME [$HOME]" - dummy = "$id: PATH [$PATH]" - - - # This may take some time, give enough rope - # 16 minutes maximum to process the mailbox - - japop3TIMEOUT = $TIMEOUT - TIMEOUT = 960 - - # - we're calling ourself, so we must pass the envinronment - # variables too so that called JA_POP3_RC script inherits - # the environment. - # - # - DEFAULT is set to /dev/null so that any failure in - # child won't put messages back to our mailbox. - # - # - FORMAIL options are: (-n 5), maximum 5 parallel processes - # (-d), ignore Content-Length header, (-s), split - # mailbox -- must be the last option. - # - - :0 a hwic - | $CAT $JA_POP3_TMP | \ - $FORMAIL \ - -A"$xloop" \ - -n5 \ - -d \ - -s \ - $PROCMAIL \ - VERBOSE="on" \ - LOGABSTRACT="all" \ - LOGFILE="$JA_POP3_LOGFILE" \ - DEFAULT="/dev/null" \ - SHELL="$SHELL" \ - HOME="$HOME" \ - PATH="$PATH" \ - PMSRC="$PMSRC" \ - FORMAIL="$FORMAIL" \ - SENDMAIL="$SENDMAIL" \ - JA_POP3_CHILD="child" \ - JA_POP3_FWD_TO="$address" \ - JA_POP3_TO_MUST_MATCH="$JA_POP3_TO_MUST_MATCH" \ - $JA_POP3_RC - - TIMEOUT = $japop3TIMEOUT - - :0 e # failed; cancel killing the mailbox - { - kill = "" - - :0 hwc - | ( $FORMAIL \ - -rt \ - -A "X-Loop: Error" \ - | echo "Sorry, $FORMAIL -s failed" \ - ) | $SENDMAIL - - } - - - :0 hwic: # Truncate the file - * kill ?? yes - | $CAT /dev/null > $mbox - - } - :0 E # ***************** else invalid request - { - :0 hwc - | ( $FORMAIL \ - -rt \ - -A "X-Loop: Error" \ - | echo "[$mbox] does not exist" \ - ) | $SENDMAIL - - } - } - - dummy = "$id: POP3 request handled." - - LOCKFILE = $japop3LOCKFILE - } - # ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~ &protect .~. - - -} - -# ........................................................ the-child ... - -# The individual messages are mailed back to this script, this -# is the "receiver" and handles forwarding, unless message is -# already forwarded. - - -dummy = "$id: Check if we're forwarding (pop3) messages: $JA_POP3_CHILD" -dummy = "$id: $JA_POP3_FWD_TO ?? $JA_POP3_TO_MUST_MATCH" - -:0 -* JA_POP3_CHILD ?? ^^child^^ -*$ JA_POP3_FWD_TO ?? $JA_POP3_TO_MUST_MATCH -{ - - :0 fhw # mark this message "forwarded" - | $FORMAIL -A "X-Loop-Fwd: pm-japop3.rc $HOST" - - # You can also only test the recipe if you set - # - # SENDMAIL = "tee -a $HOME/tmp/sent.mail" - - :0 - ! $JA_POP3_FWD_TO - -} - - - -dummy = "$id: end: STATUS = $STATUS" - -# End of pm-japop3.rc diff --git a/src/procmail/pm-jarandf.rc b/src/procmail/pm-jarandf.rc @@ -1,128 +0,0 @@ -# pm-jarandf.rc -- pick (rand)om line from (f)ile -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# Return random line or a line from a file. This subroutine uses -# shell command `awk' and possibly `wc' to be as small burden to the -# system as possible. -# -# Required settings -# -# You must have awk that supports VAR=value assignment syntax outside -# the code block: that is, in the input line. I know no awk that -# would not have this feature, but at least you know now what it takes. -# -# % awk '{print VAR; exit;}' VAR=1 /etc/passwd -# -# Try using GNU awk, if your standard awk didn't print 1 in above -# test. (Put this line to the top of your .procmailrc) -# -# AWK = "gawk" -# -# Call arguments (variables to set before calling) -# -# If intend to call this subroutine many times, then please calculate -# the number of lines beforehand and pass it to this subroutine. If -# the MAX is not set, then `wc' is called every time to find your the -# line count. -# -# o FILE, from what file to select. Make sure this exists; existence -# is not checked here. -# o [MAX] optional, number of lines in the FILE. -# -# Returned value -# -# variable LINE -# -# Example usage -# -# # Select random line from a file -# -# $RC_RANDF = $PMSRC/pm-jarand.rc -# $COOKIE = $HOME/txt/cookie.lst -# -# ...somewhere.. -# MAX=20 FILE=$COOKIE INCLUDERC=$RC_RANDF -# -# # LINE contains randomly read line -# -# Change Log: (none) - -# ............................................................ &init ... - -id = "pm-jarandf.rc" -dummy = " -======================================================================== -$id: init: -" - - -# ........................................................... &input ... - -# FILE; MAX; defined by user - -# ..................................................... &output-vars ... -# output variables - -LINE - -# ........................................................... &do-it ... -# Prevent calling sh -c here. Speeds up procmail. - -jarandfShellmetas = $SHELLMETAS -SHELLMETAS - -:0 -* FILE ?? [a-z] -{ - - # If max is not set beforehand - - :0 - * ! MAX ?? ^^[0-9]+^^ - { - # Awk can't know how many lines are in the file in advance, - # we must find it out. - - MAX = `wc -l $FILE` - } - - # It works like this: - # - When line number(NR) is 1, calculate random line - # - calculated line is same as current line number, print and exit. - - LINE = `$AWK \ - ' \ - function GetRand(i, j) \ - { \ - srand(); \ - return (i + int ( rand()*j )); \ - } \ - { \ - if ( NR == 1 ) { line = GetRand(1, max); } \ - if ( NR == line ) { print; exit; } \ - } \ - ' max=$MAX $FILE ` - -} - -SHELLMETAS = $jarandfShellmetas - -dummy = "$id: end:" - -# pm-store.rc ends here diff --git a/src/procmail/pm-jasrv-check.rc b/src/procmail/pm-jasrv-check.rc @@ -1,84 +0,0 @@ -# pm-jasrv-check.rc -- check FILE validity, subroutine for File Server -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This subroutine is part of the TPFS or MPFS file server. -# Check FILE for nonvalid filenames or other access problems. -# -# Input -# -# o JA_SRV_F_FILE_CASE_SENSITIVE, flag -# o FILE, filename to check. possibly converted to lowercase. -# -# Output -# -# o stat, set to "ok" if filename is acceptable. Otherwise contains -# brief error reason; -# -# -# Change Log (none) - -# ............................................................ &init ... - -id = "pm-jasrv-check.rc" -dummy = " -======================================================================== -$id: init: -" - - -stat = "ok" - - -# .................................................. &conversion ... -# Should we ignore spelling mistakes? File.txt --> file.txt - -:0 D -* JA_SRV_F_FILE_CASE_SENSITIVE ?? no -* FILE ?? [A-Z] -{ - FILE = `echo "$FILE" | $TR A-Z a-z` -} - -# ........................................................... &check ... -# Do not accept wildcard names, because -# -# % test -r file*txt -# -# would succeed, but there is no no such individual file - -:0 -* FILE ?? [][*?{}()<>&!'$;] -{ - stat = "invalid-characters" -} - - -# Check that filename does not have "../" security risk. -# Or dos styled "..\" -- perhaps for NT? - -:0 -* FILE ?? \.\.[/\] -{ - stat = "invalid-directory-access" -} - - -dummy = "$id: end: STAT = $stat" - -# Enf of pm-jasrv-check.rc diff --git a/src/procmail/pm-jasrv-daemon.rc b/src/procmail/pm-jasrv-daemon.rc @@ -1,118 +0,0 @@ -# pm-jasrv-daemon.rc -- server request check, subroutine for File Server -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This subroutine is part of the MPFS file server. -# Handle BOUNCES to mail server messages, eg if delivery failed -# due to maximum byte limit. -# -# 552 <foo@site.com>... Message is too large; 100000 bytes max -# -# Input -# -# (none) This recipe examines headers and body to see if it's daemon -# bounce. -# -# Output -# -# o stat, set to "daemon" if message was handled. -# -# Change Log (none) - -# ............................................................ &init ... - -id = "pm-jasrv-daemon.rc" -dummy = " -======================================================================== -$id: init: Check if this is bounced server message. -" - -stat = "" -msg = "" -subject = "" -to = "" - - -# Hm, We wouldn't even need the FROM_DAEMON test, because -# X-Loop is supposed to be unique. Because we expect to see bounce -# message the original message is included in the body, that's by "B ??" -# search. -# -# Handle only some daemon messages, notify the recipient about an error. - -dummy = "$id: The pm-javar.rc daemon status is: $JA_FROM_DAEMON" - -:0 -*$ $JA_FROM_DAEMON -*$ B ?? ^X-Loop: $JA_SRV_XLOOP -{ - :0 - * B ?? ^Subject:\/.* - { - subject = $MATCH; - } - - :0 - * B ?? ^To:\/.* - { - to = $MATCH - } - - :0 - *$ B ?? ()\/^$d+ .*Message is too large.* - { - msg = $MATCH - } - - :0 - * msg ?? [a-z] - { - stat = "daemon"; - - # Add new header telling that this bouce was auto-notified back - # to original reqeastor. - - :0 fhw - | $FORMAIL -I "X-Mpfs-daemon: [notified $to] $msg" - - - # make sure To has "@" character, otherwise picking of - # "To" from the body failed. - - :0 wc - * to ?? @ - | ( $FORMAIL \ - -rtk -p " >" \ - -I "To: $to" \ - -I "X-Loop: $JA_SRV_XLOOP " \ - -I "Subject: $msg" \ - ; \ -echo "Your account didn't accept the requested file. " ; \ -echo "Get server help file with 'send help' and see conversion types etc."; \ -echo "Or notify the File Server admin"; \ - ) | $SENDMAIL; \ - echo " [ja-srv; daemon $to; $msg;]" >> $JA_SRV_LOG; - - } - -} - -dummy = "$id: end: STATUS = $stat" - - -# End of pm-jasrv-daemon.rc diff --git a/src/procmail/pm-jasrv-err.rc b/src/procmail/pm-jasrv-err.rc @@ -1,101 +0,0 @@ -# pm-jasrv-err.rc -- send message, subroutine for File Server -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This module is part of the MPFS file server. -# Ssnd error notice: file didn't exist. -# -# Input -# -# o FILE, file or command that did ot exist. -# -# Output -# -# o fld, additional field to be added to the saved mbox log message -# -# Change Log (none) - -# ............................................................ &init ... - -id = "pm-jasrv-err.rc" -dummy = " -======================================================================== -$id: init: -" - -# File didn't exist, send notice. - -stat = "error-NotExist $FILE" - - -# ....................................................... record-log ... -# Theese are no-op. We just want to leave trace to the log file TO whom -# the message was sent. - -:0 -* ^To:\/.* -{ } - -:0 -* ^From\/.* -{ } - -# ................................................... Subject-notify ... - -header - -:0 -* JA_SRV_F_SUBJ_NOTIFY ?? yes -{ - header = "-ISubject: Re: $JA_SRV_SUBJECT [$stat]" -} - - -# ............................................................. send ... -# We use "c" to copy this request to out log mbox - - -dummy = "$id: HEADER: $header" - -:0 fbw -* header ?? [a-z] -| $FORMAIL ${header+"$header"} - - -:0 hwic: -| ( \ - $CAT - | $FORMAIL -I "From "; \ - echo "[srv-err] file `$FILE' does not exist."; \ - echo "The file may have been renamed or removed."; \ - echo "Please use 'send help'"; \ - ) | \ - $SENDMAIL ; \ - echo " [ja-srv; $stat; $to;]" \ - >> $JA_SRV_LOG; - -# ....................................................... extra-info ... -# We don't want user to see this because here is directory info -# This information is for ourself only. - -fld = "-A$JA_SRV_X_HEADER: $stat; $file; $JA_SRV_FROM" - - -dummy = "$id: end:" - - -# Enf of pm-jasrv-err.rc diff --git a/src/procmail/pm-jasrv-from.rc b/src/procmail/pm-jasrv-from.rc @@ -1,103 +0,0 @@ -# pm-jasrv-from.rc -- compose reply, subroutine for File Server -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This subroutine is part of the MPFS file server. -# Compose headers for reply message using `formail' -rt. -# -# Here is dry run example to test this module -# -# % procmail DEFAULT=/dev/null VERBOSE=on LOGABSTRACT=all \ -# FORMAIL=/opt/local/bin/formail \ -# JA_SRV_FORMAIL_FROM=me@here \ -# JA_SRV_CONTENT_TYPE=content-type \ -# JA_SRV_XLOOP=xloop \ -# $HOME/pm/pm-jasrv-from.rc \ -# < $HOME/any-sample.email -# -# Input -# -# o JA_SRV_FORMAIL_FROM, JA_SRV_XLOOP -# o JA_SRV_CONTENT_TYPE -# -# Output -# -# (none) -# -# Change Log (none) - -# ............................................................ &init ... - -id = "pm-jasrv-from.rc" -dummy = " -======================================================================== -$id: init: -" - - -# add initial headers. The MIME headers may -# very well change later on - -dummy = "$id: Preparing reply." - -# This a bit special. When we construct reply to user with formail -# -rt, the From address would include the address where your -# server is. That't usually fine. -# -# But if you have some virtual or `contact' address that you want -# poeple to use instead of the current address where are, then you -# want to rewrite the `From' field. Hm. You could also add Reply-To, -# but suppose you don't want to show the real address at all. -# -# If you set JA_SRV_FORMAIL_FROM variable, then the email address -# appears in From field. If you don't define the variable, a normal -# formail -rt is used. -# -# Adding "From:" automatically adds From_, get rid of it too -# -# NOTE: We must put something into `header'; because the above formail -# fails if the header contains only "". In here we duplicate the -# harmless call to "-aMessage-ID:" - -header = "-aMessage-ID:" - -:0 -* JA_SRV_FORMAIL_FROM ?? [a-z] -{ - header = "-AFrom: $JA_SRV_FORMAIL_FROM" -} - - -:0 fhw -| $FORMAIL -rt \ - -a Message-ID: \ - -A "Mime-Version: 1.0" \ - -A "Content-Type: $JA_SRV_CONTENT_TYPE" \ - -A "Content-Transfer-Encoding: 7bit" \ - -A "Precedence: bulk" \ - -A "X-Loop: $JA_SRV_XLOOP" \ - -I "From " \ - ${header+"$header"} - - -# test = `$CAT - >> $HOME/tmp/srv.tst` - - -dummy = "$id: end:" - -# Enf of pm-jasrv-from.rc diff --git a/src/procmail/pm-jasrv-msg.rc b/src/procmail/pm-jasrv-msg.rc @@ -1,77 +0,0 @@ -# pm-jasrv-msg.rc -- send message, subroutine for File Server -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This subroutine is part of the TPFS or MPFS file server. Run $CODE -# and return resutls to to user. Subroutine is meant to be used for -# informational messages. -# -# Input -# -# o code, code to run in shell -# o stat, status message for user -# -# Change Log (none) - -# ............................................................ &init ... - -id = "pm-jasrv-msg.rc" -dummy = " -======================================================================== -$id: init: -" - - - -head = "" - - -dummy = "$id: Check if subject notify is on " - -:0 -* JA_SRV_F_SUBJ_NOTIFY ?? yes -{ - header = "-ISubject: Re: $JA_SRV_SUBJECT [$stat]" -} - -:0 fhw -| $FORMAIL \ - ${header+"$header"} \ - -A "$JA_SRV_X_HEADER: $stat $FILE" -I "From " - - -:0 # Just for logging purposes, record TO in MATCH -* ^To:\/.* -{ } - -dummy = "$id: Running code [$code] and sending to [$MATCH]" - -:0 hwc: -| ( $CAT -; $code ) | \ - $SENDMAIL ; \ - echo " [ja-srv; $stat $FILE; $JA_SRV_FROM;]" \ - >> $JA_SRV_LOG; - -MBOX = $JA_SRV_MSG_MBOX -INCLUDERC = $JA_SRV_RC_MBOX - - -dummy = "$id: end:" - - -# Enf of pm-jasrv-msg.rc diff --git a/src/procmail/pm-jasrv-multi.rc b/src/procmail/pm-jasrv-multi.rc @@ -1,136 +0,0 @@ -# pm-jasrv-multi.rc -- send multipart MIME message, subroutine for FileSrv -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This subroutine is part of MPFS file server. Send out FILE as -# multipart MIME message. The message will always be base64 -# encoded before sending. -# -# Input -# -# o JA_SRV_MIME_MULTI_SEND, command to feed the composed and message -# which will handle sending it as multipart MIME. -# o JA_SRV_MULTIPART_THRESHOLD is the hunk size for slitting mail. -# o FILE, only filename part. Included in MIME headers. -# o file, absolute path to send -# -# Change Log (none) - -# ............................................................ &init ... - -id = "pm-jasrv-multi.rc" -dummy = " -======================================================================== -$id: init: -" - -fld = "" -ok = "no" -to = `$FORMAIL -rtzxTo:` # LOGFILE: To whom we're sending message - -# ........................................................ read file ... -# Read file and base64 encode it to BODY. Flag "yes" is everything is ok - -:0 fbw -| $CAT $file - -dummy = "$NL$id: Base64 encoding... $NL" - -:0 fbw -| $MIME_BIN_64_E - - :0 a - { - ok = "yes" - } - -# ............................................... error while base64 ... - - -:0 -* ok ?? no -{ - # Combine this message to previous field. See pm-tips.txt - - msg = "-AX-Error: $MIME_BIN_64_E failed. Notify server admin." - nl nl=${fld+"$NL"} fld="$fld${nl}$msg" - - # We might as well kill the body, because user - # doesn't want to receive binary (gzip) - - :0 fbw - | echo - - - :0 wc: $JA_SRV_LOG.$LOCKEXT - | $FORMAIL -I From ${fld+"$fld"} | $SENDMAIL; \ - echo " [ja-srv; $file; $JA_SRV_FROM;]" \ - >> $JA_SRV_LOG; - -} - -# ................................. base64 succeeded, send multipart ... - -:0 -* ! ok ?? no -{ - dummy = "$NL$NL$id: Sending multipart message:$NL $to$NL $file$NL" - - - type = "application/octet-stream" - coding = "base64" - comment = "This is MIME multipart. You must assemble every part$NL\ - together in sequential order. Then decode, cat BODY| mmencode -u > $FILE$NL" - - :0 fhw - | $FORMAIL \ - -I From \ - -I "Content-Type: $type" \ - -I "Content-Transfer-Encoding: $coding" \ - -I "Content-Disposition: attachment; filename=\"$FILE\"" \ - -I "Content-Description: $comment" - - :0 wc - | $JA_SRV_MIME_MULTI_SEND - - :0 a hwic: - | echo " [ja-srv; $type $file; $JA_SRV_FROM;]" \ - >> $JA_SRV_LOG; - - :0 E - { - dummy = "$NL$NL$id: $JA_MSG_ERROR ERROR While calling $JA_SRV_MIME_MULTI_SEND $NL" - - :0 hwic: - | echo " [ja-srv; SENDMAIL FAIL $type $file; $JA_SRV_FROM;]" \ - >> $JA_SRV_LOG; - } - -} - - - -# kill body contents before saving to log - -:0 fbwi -| echo - - -dummy = "$id: end:" - -# Enf of pm-jasrv-multi.rc diff --git a/src/procmail/pm-jasrv-req.rc b/src/procmail/pm-jasrv-req.rc @@ -1,85 +0,0 @@ -# pm-jasrv-req.rc -- server request check, subroutine for File Server -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This subroutine is part of the MPFS file server. -# Check if file server request is on the JA_SRV_SUBJECT and -# do case or incasensitive check. -# -# To Dry run this module use following skeleton. Substitute keywods -# as needed to reflect your system setup: -# -# % procmail DEFAULT=/dev/null VERBOSE=on LOGABSTRACT=all \ -# PMSRC=$HOME/txt JA_SRV_CMD_STRING=send \ -# JA_SRV_SUBJECT="send newbie_article.rtf noconv" \ -# txt/pm-jasrv-req.rc < ~/test.mail -# -# Input -# -# o JA_SRV_F_CMD_CASE_SENSITIVE; if "yes" then server request -# is case sensitive. -# o JA_SRV_FORMAIL_FROM. the email From field -# -# Output -# -# o stat, set to "ok" if request is accepted -# -# Change Log (none) - -# ............................................................ &init ... -# - no leading periods(.) are accepted in the filename -# - Invalid filename access "../" is tested later - -id = "pm-jasrv-req.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - - -regexp = "^^$s*$JA_SRV_CMD_STRING$s+$NSPC+" -subj = $JA_SRV_SUBJECT -stat = "" - - -dummy = "$NL$id: do we use case sensitive request keyword?$NL" - -:0 -* JA_SRV_F_CMD_CASE_SENSITIVE ?? yes -{ - flags = "D" -} - -dummy = "$NL$is: check if this is request $NL" - -:0 $flags -*$ subj ?? $regexp -{ - stat = "ok" -} - -dummy = "$id: end:" - - -# Enf of pm-jasrv-req.rc diff --git a/src/procmail/pm-jasrv-send.rc b/src/procmail/pm-jasrv-send.rc @@ -1,333 +0,0 @@ -# pm-jasrv-send.rc -- server request check, subroutine for File Server -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This subroutine is part of the MPFS file server. -# Send the requested file. You can dry-run test this module with -# following command: a) make sure that $HOME/test conatins any simple -# email message b) define FORMAIL if it isnot found from path. -# -# % procmail DEFAULT=/dev/null VERBOSE=on LOGABSTRACT=all \ -# PMSRC=$HOME/txt JA_SRV_LOG=/dev/null \ -# FORMAIL=/opt/local/bin/formail \ -# file=$HOME/test FILE=test WORD=WORD JA_SRV_FROM=foo@bar \ -# SENDMAIL="tee -a $HOME/test.send" txt/pm-jasrv-send.rc < ~/test -# -# Note: -# -# The MIME headers here selected previously were: -# -# Content-type: application/octet-stream -# Content-transfer-encoding: x-gzip64 -# -# But Defining own CTE such as x-gzip64 is strongly discouraged by -# the MIME RFC's. Most e-mail clients would be at a loss on how to -# handle these. Many would just bomb out and not even give you the -# opportunity to save it to a file. A more correct MIME type is this, -# which is now used: -# -# Content-type: application/x-gzip -# Content-transfer-encoding: base64 -# -# Input -# -# o `FILE' is the filename(chdir to directory is already done) -# `file' is _absolute_ filename -# `WORD' is next word from subject line after FILE word. -# o JA_SRV_CMD_STRING is flag -# o JA_SRV_F_SUBJ_NOTIFY is flag -# -# Output -# -# o FILE_ERROR is set to "yes" if file is not found. -# -# Change Log (none) - -# ............................................................ &init ... - - -id = "pm-jasrv-send.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* IS_READABLE ?? ^^^^ -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - - -stat = "" -FILE_ERROR = "" - -:0 -* FILE ?? [a-z0-9] -* file ?? [a-z0-9] -*$ ? $IS_READABLE $file -{ - stat = "$JA_SRV_CMD_STRING" - - # no header notify here, because this is ok situation, - # Some MUA's thread the sending according to Subject, - # so keep subject clean. (it already has Re:) - # - # In error situations, it's desirable to Subject line - # to tell the condition right away. - -# :0 fh -# * JA_SRV_F_SUBJ_NOTIFY ?? yes -# | $FORMAIL -I"Subject: Re: $JA_SRV_SUBJECT [$stat]" - - # ...................................................... gzip ... - # How should we send the file? - # - If FILE matches list of files in JA_SRV_XGZIP_REGXP - # then it is send in compresses base64 gzip format, because - # it's too big. - # - # There must be no "noconv" word request from the user - # - # - For other files, send it without conversions. - - dummy = "$NL$NL$id: Setting defaults and clearing variables $NL" - - comment = "regular file" - type = "$JA_SRV_CONTENT_TYPE" - coding = "$JA_SRV_CONTENT_ENCODING" - convert = "" - xgzip = "" - - # ........................................................ xgzip ... - - dummy = "$NL$NL$id: check that there is no noconv $NL" - - :0 - * JA_SRV_XGZIP_REGEXP ?? [a-z] - *$ FILE ?? $JA_SRV_XGZIP_REGEXP - * ! WORD ?? noconv - { - xgzip = "yes" - } - - dummy = "$NL$NL$id: Has user requested gzip: $WORD $NL" - - :0 - * WORD ?? ^^(gz|gzip)^^ - { - xgzip = "yes" - } - - dummy = "$NL$NL$id: Was xgzip YES? $NL" - - - :0 - * xgzip ?? yes - { - convert = "gzip-base64" - comment = "To decode, cat BODY| mmencode -u| gzip -d > $FILE$NL\ -If you don't have MIME capable MUA (Email agent) or if you don't have$NL\ -mmencode, you can request file without conversion with subject:$NL\ -'send $FILE noconv'" - type = "application/x-gzip" - stat = "$stat gzip" - coding = "base64" - } - - # But, do always "gzip" for these files, even if "noconv" - # was requested. - - dummy = "$NL$NL$id: Decide if we convert to base64 -- $FILE $NL" - - :0 - * JA_SRV_BASE64_ALWAYS ?? [a-z] - *$ FILE ?? $JA_SRV_BASE64_ALWAYS - { - xgzip # kill variable - convert = "base64" - comment = "To decode, cat BODY| mmencode -u > $FILE$NL" - type = "application/octet-stream" - stat = "$stat gzip" - coding = "base64" - - } - - # .................................................... MIME-TYPE ... - - :0 - * FILE ?? \.(doc|rtf)^^ - { - type = "application/winword" - } - - :0 - * FILE ?? \.zip^^ - { - type = "application/zip" - } - - :0 - * FILE ?? \.gz^^ - { - type = "application/gzip" - } - - - # ...................................................... headers ... - # Prevent calling shell layer (because there is ; in the command) - # This speeds up procmail - - saved = $SHELLMETAS - SHELLMETAS - - # Complete the MIME headers: user can download the file if he - # has mime aware MUA - - :0 fhw - | $FORMAIL \ - -I "Content-Type: $type" \ - -I "Content-Transfer-Encoding: $coding" \ - -I "Content-Disposition: attachment; filename=\"$FILE\"" \ - -I "Content-Description: $comment" - - SHELLMETAS = $saved - - - # ................................................. &sending ... - # pick the right sending method - - dummy = "$NL$NL$id: Sending $file $convert $NL" - - # See procmail tips page. We stack all headers to variable *f* - # and avoid calling multiple `formail' processes. - - fld # kill variable - - :0 - * convert ?? [a-z] - { - ok = "yes" - error = "no" - - :0 # insert file "as is" - * ! convert ?? gzip - { - :0 fbw - | $CAT $file - - :0 e - { - error = "yes" - } - } - - :0 - * convert ?? gzip - { - :0 fbw # gzip while insert - | $GZIP -9c $file - - :0 e - { - error = "yes" - } - } - - - :0 - * error ?? yes - { - # If previous command failed - # Add error message to separate header - - ok = "no" - fld = "-AX-Error: $GZIP failed, try with noconv." - } - - # ............................................... base64 ... - - :0 fbw - * convert ?? base64 - * ok ?? yes - | $MIME_BIN_64_E - - :0 E - * ok ?? yes - { - # Combine this message to previous field. See pm-tips.txt - - msg = "-AX-Error: $MIME_BIN_64_E failed. Try with noconv." - - nl - nl = ${fld+"$NL"} - - fld = "$fld${nl}$msg" - - comment = "" - - # We might as well kill the body, because user - # doesn't want to receive binary (gzip) - - :0 fbw - | echo - } - } - :0 E fb wi - | $CAT $file - - - # This is no-op as far as this recipe is concerned. - # If you need to examine logs, you will see the TO address - # where the message was sent in MATCH. - - :0 - * ^To:\/.* - { } - - dummy = "$id: programs: $FORMAIL $SENDMAIL" - dummy = "$NL$NL$id: Extra fields: $fld $NL" - - :0 fbw - * fld ?? [a-z] - | $FORMAIL ${fld+"$fld"} - - - :0 wc: $JA_SRV_LOG$LOCKEXT - | $FORMAIL -I "From " | $SENDMAIL; \ - echo " [ja-srv; $convert $FILE; $JA_SRV_FROM;]" \ - >> $JA_SRV_LOG; - - # kill body contents before saving to log - - :0 fb wi - | echo - - # Continue to the end - - fld = "-A$JA_SRV_X_HEADER: $stat; $JA_SRV_FILE_DIR/$FILE" - -} - -:0 E -{ - FILE_ERROR = "yes" -} - -dummy = "$id: end:" - -# Enf of pm-jasrv-send.rc diff --git a/src/procmail/pm-jasrv.rc b/src/procmail/pm-jasrv.rc @@ -1,704 +0,0 @@ -# pm-jasrv.rc -- MIME capable Procmail File server -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This is the MPFS (Mime Procmail File Server) and it can send MIME -# compliant messages with command -# -# "send <ITEM> [WORD1] [WORD2]" -# -# Usually only the ITEM arg is used, and the rest of the words are for -# special uses like password and preventing file encoding. A typical -# request looks like: -# -# Subject: send help # ask for file named 'help' -# -# Overview of features -# -# o MIME types gzip and text/plain are supported. -# o .gz .zip etc. files are sent out as base64 attachments -# o .gz .tar.gz files that exceed 100K are sent out as MIME multiparts -# o requires procmail 3.11+ and MATCH operator \/ -# o requires `mmencode' and `gzip' executables to be present in PATH. -# -# Install: server file directory -# -# You have to create a directory for the server where the files are kept. -# Usually I don't put the files there, but whenever I want to make a -# file available, I draw a hard or softlink to the real file. -# -# % mkdir $HOME/pm-server -# -# # Repeat this as needed for files you want to put available -# -# % cd $HOME/pm-server -# % ln -s $HOME/txt/interesting-file.txt interesting-file.txt -# -# You define the server directory by setting -# -# JA_SRV_FILE_DIR = $HOME/pm-server -# -# The short server log is written to file pointed by this variable: -# -# JA_SRV_LOG = $HOME/pm-server.log -# -# The incoming "send" requests are stored to mailbox pointed by -# following variable. The default value is /dev/null, but -# you may want to set it to ~/Mail/spool/log.srv.spool which can be -# used read as a newsgroup by Emacs Gnus [In Gnus create newsgroup with -# `G` `m' `nnml' `log.srv'] -# -# JA_SRV_MSG_MBOX -# -# Install: special files -# -# Tweak this variable to commands you want to allow shell to execute -# in server's directory. This tells when <ITEM> "ls" means command -# instead of file -# -# JA_SRV_SH_COMMAND = "^(ls|what)$" -# -# That means that request like this: -# -# Subject: send ls # run "ls" command and return results -# -# Be sure that the commands exist in your system. See man pages for -# more if you want to know what these commands do. Commands cannot -# take switches currently for security reasons. E.g. if you want to -# give access to "ls -la" listing, put a file "ls-la.txt" available -# in the directory, user can get it with "send ls-la.txt" -# -# ls -- list directory -# file -- print file type information. -# what -- prints all @(#) tags from files -# ident -- print all $ $ tags from files -# -# Install: file `help' -# -# Users want to get a help file with message "send help" and the -# `help' is just a file in your server directory. Be sure to supply it -# prior to any other files. You can always draw a link to a file if you -# don't want to name it that way (e.g. if you keep several server help -# files in a RCS tree) -# -# # draw symlink to `help' -# -# % ln -s $HOME/txt/srv-public-hlp.txt $HOME/server/help -# -# Basic usage in details -# -# The server accepts command in format -# -# "send <ITEM> [CMD|PASSWORD]" -# -# Where ITEM can be any name as long as it starts with [^ .]. The -# regexp says: Anything goes as long as FILE does _not_ start with -# space or period. This gives you quite a much freedom to construct -# filenames. if you want to hand out file: -# -# .procmailrc -# -# You can't. Instead make a link to point to plain "procmailrc" -# without the leading period. There is also additional checks -# against possible security threat "../" like below; user can't -# request such file. -# -# ../../../gotcha or dir/../../gotcha -# -# The filename cannot contain special characters like [*?<>{}()]. -# -# Advanced usage -# -# [conversions] -# -# If some of your files are big, it makes sense to send them in -# compressed base64 format; which in MIME world is called content-type -# gzip. You can set a regexp to enforce encoding for your big -# files before they are sent to user. The following setting will send -# all text files in compressed format to user. -# -# JA_SRV_XGZIP_REGEXP = "\.txt" -# -# When the message is composed a header is inserted into the message -# telling how the message is to be decoded, in case user doesn't have -# decent MUA that can handle the MIME type: -# -# X-comment: To decode, cat msg| mmencode -u| gzip -d > test.txt -# -# [noconv and gz] -# -# The `WORD1' parameter after the `FILE' is optional and user can -# override base64 encoding and request plain file if he uses word -# "noconv". -# -# Subject: send <FILE> [noconv|gzip] -# -# However, there are files where `noconv' must not be obeyed, like -# the compressed packages that you have put available in .zip, .gz, -# .tar.gz or .tgz (GNU tar) format. Following variable controls -# when file is always sent as base64: -# -# JA_SRV_BASE64_ALWAYS -# -# If the `WORD1' is "gz" or "gzip", then the gzip is explicitly -# requested, This may be desirable, because some of the text files in -# the server directory may be big and some accounts don't accept big -# messages. A typical bounce looks like: -# -# 552 <foo@site.com>... Message is too large; 100000 bytes max -# 554 <foo@site.com> Service unavailable -# -# These kind of file server bounce messages are handled in separate -# module which notifies the user that his account didn't accept the -# sent file. -# -# [case sensitivity] -# -# By default the request word ("send") and ITEM (filename) are not -# case sensitive, unless you set these flags: -# -# JA_SRV_F_CMD_CASE_SENSITIVE = "yes" -# JA_SRV_F_FILE_CASE_SENSITIVE = "yes" -# -# If values are "no", then these are identical commands: -# -# Subject: Send Help -# Subject SEND HELP -# -# Multi part mime messages -# -# If you want to deliver big files, you better be sure not to send -# them as a big file. That blocks the connection between every host -# along the path that the big file is transferred. The -# solution is to use MIME multi parts that can be assembled back in -# the receiving MUA. (In case you don't have multi part assembler -# receive Perl script to do it). -# -# MIME multiparts are sent out if -# -# o Filename matches JA_SRV_BASE64_ALWAYS, typically tar.gz, zip -# o Filesize is bigger than JA_SRV_MULTIPART_THRESHOLD, where -# default chunk size is 100K. -# -# When a file meets these criteria, it is read to the `BODY' of message -# and base64 encoded. This all happens in memory, so watch -# procmail logs to see if any problems with very big files. (>30Meg). -# Next, if the base64 conversion succeeded, the composed is handed -# to -# -# JA_SRV_MIME_MULTI_SEND -# -# Which does the actual delivery and splitting. The default program -# used is `splitmail'. Make sure you have it or substitute the -# program with some equivalent one. -# -# Stopping server -# -# Sometimes you're making rearrangements in you file directory or -# doing some other maintenance and you are unable to respond to `send' -# requests. You can stop the server by setting -# -# JA_SRV_IN_USE = "no" -# -# And when you want to enable the server again; just comment out the -# statement or assign `yes'. [The default is `yes']. When this -# variable is set to `no', the server sends a message from following -# variable as a response to any "send" request. -# -# JA_SRV_IN_USE_NO_MSG -# -# Using password to validate file requests -# -# You should be aware that this file server's implementation is public -# in nature. Anyone who asks for a file is allowed to get it. But it -# would be good if you could limit the access to documents with some -# simple way, like if you set up two file servers (see next chapter) -# where one is public and the other is interesting only to group of -# people. You can define a string that must be found in Subject field -# by setting the following variable -# -# JA_SRV_PASSWORD = ".*" # default -# -# The default value will match anything in the subject, thus making the -# server public. But if you set it like this -# -# JA_SRV_PASSWORD ".*123" -# -# Then string "123" must be there somewhere in the line, like here -# -# Subject: send <FILE> 123 -# -# Yes, "123" is actually a CMD definition, but it doesn't matter -# because there is no CMD 123. Subject now matches password and the -# server can be accessed. Of course the following is valid too. -# -# Subject: send <FILE> noconv 123 -# -# If the password was wrong, server won't tell it. The message just -# lands to your mailbox in that case and you can investigate who -# tried to access the restricted server. -# -# Changing server's command string (multiple servers) -# -# The default command string is "send", but you can change it and thus -# create multiple services. Here is one example, where you have set up -# two file servers where each has its own directory. -# -# # The public server -# -# JA_SRV_CMD_STRING = "send" -# JA_SRV_FILE_DIR = $HOME/server/public -# INCLUDERC = $HOME/procmail/pm-jasrv.rc -# -# # Company server, only interests fellow workers. -# # Here "xyz-send" is just magic server request string. -# # Notice case sensitivity settings. -# -# JA_SRV_F_CMD_CASE_SENSITIVE = "yes" -# JA_SRV_CMD_STRING = "xyz-send" -# JA_SRV_PASSWORD = ".*12qw" -# JA_SRV_FILE_DIR = $HOME/server/public/xyz-dir -# INCLUDERC = $HOME/procmail/pm-jasrv.rc -# -# Notes from the author -# -# [basic Mime type note] -# -# All basic files that you send must be US-ASCII, 7bit. At least that -# is the default MIME type used. See `JA_SRV_CONTENT_TYPE'. I once -# received following message back -# -# ----- Transcript of session follows ----- -# 554 <foo@bar>... Cannot send 8-bit data to 7-bit destination -# 501 <foo@bar>... Data format error -# -# because in the previous releases, the MIME type headers were not -# in the message saying that the content really was plain 7bit ascii. -# -# [Sending the file as is] -# -# Note, that the file is included "as is" without any extra -# *start-of-file* or *end-of-file* tags. This is possible, because -# the file is sent in MIME format. -# -# [Using one line log entry] -# -# It may look very spartan to print a single line log entry. You see -# messages like above in the file server log. Using one line entry -# instead of multi line announcements makes it possible to write a small -# perl tool to parse information from a single line. If you get many -# file server messages per day, it quicker to look at the single line -# entries too. -# -# [ja-srv1; sh file; Foo Bar <foo@site.com>;] -# [ja-srv1; send xxx-file.txt; Foo Bar <foo@site.com>;] -# | -# Server's request keywords (you may have multiple servers) -# -# [wish list] -# -# (*) MIME multipart message's mime headers may need some adjustments. -# -# (*) I rely on simple regexp to send out base64 or gzip files. -# The natural extension would be to use file size threshold: if file -# is bigger than N bytes, send it out with gzip. And further: if -# file is more than NN bytes, send it out as multi part MIME. -# -# (*) In fact there is a slight mime type errors: .zip files -# should be send as application/zip. If you have experience with the -# mime types, please contact me and help me to sort out proper -# mime headers. -# -# Required settings -# -# PMSRC must point to the source directory of procmail code. This -# subroutine will include many pm-jasrv-*.rc modules and other files -# from there. -# -# Please test the File Server in your environment before you start -# using it for every day. For example I had some weird local problem -# where PATH had /usr/contrib/bin/ where gzip was supposed to be, but -# in spite of my tries procmail didn't find it along the path. Don't -# ask why. I now use absolute binary name: -# -# GZIP = /usr/contrib/bin/gzip -# -# In addition, if your messages are not sent to recipient, but you -# get daemon message: -# -# ... Recipient names must be specified -# -# That's because you have setting SENDMAIL="sendmail"; which is not -# enough. It must be -# -# SENDMAIL = "sendmail -oi -t" -# -# Usage example -# -# This is my .procmailrc installation. Notice that the file server -# code is used only if you get "send" request. On the other hand, this -# double wrapping is not all necessary, you could as well rely on the -# File server's capability to detect SEND request. -# -# -# PMSRC = $HOME/pm # directory where the procmail rc files are -# RC_FSRV = $PMSRC/pm-jasrv.rc -# -# mySavedLOGFILE = $LOGFILE # record file server actions elsewhere -# LOGFILE = $PMSRC/pm-jasrv.log -# -# # Listen "send" requests. -# :0 -# * ^Subject: +send\> -# { -# JA_SRV_FILE_DIR = $HOME/fsrv # Where to get the files -# JA_SRV_LOG = $HOME/fsrv.log # Write log here -# INCLUDERC = $RC_FSRV # Use file server now -# } -# -# LOGFILE = $mySavedLOGFILE -# -# Change Log (none) - -# ............................................................ &init ... - -id = "pm-jasrv.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# Too many people forget that SENDMAIL definition must include flags -oi -t - -:0 -* ! SENDMAIL ?? (-) -{ - LOG = "(jasrv) ** ERROR: please make sure SENDMAIL contains flags -oi -t" - LOG = "(jasrv) ** ERROR: please see pm-javar.rc for SENDMAIL definition" - HOST # Quit immediately -} - -# .......................................................... &public ... -# Public variables. User configurable section. -# -# ** DO NOT MAKE MODIFICATIONS TO THIS FILE ** -# Copy variables to your ~/.procmailrc and make changes there. -# Recall the 'Installation example' - -# ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... . flags ... - -# Notify errors on returned Subject line? -# - Always adds message to the body too. - -JA_SRV_F_SUBJ_NOTIFY = ${JA_SRV_F_SUBJ_NOTIFY:-"yes"} - -# Should Command be case sensitive? How about file names? - -JA_SRV_F_CMD_CASE_SENSITIVE = ${JA_SRV_F_CMD_CASE_SENSITIVE:-"no"} -JA_SRV_F_FILE_CASE_SENSITIVE = ${JA_SRV_F_FILE_CASE_SENSITIVE:-"no"} - -# Should the initial "send" request be copied to folder "as is" - -JA_SRV_F_MBOX_REQUEST = ${JA_SRV_F_MBOX_REQUEST:-"yes"} - -# And how about our answer to the request? - -JA_SRV_F_MBOX_REQUEST_SENT = ${JA_SRV_F_MBOX_REQUEST_SENT:-"no"} - -# ... ... ... ... ... ... ... ... ... ... ... ... ... ... files-dirs ... - -JA_SRV_TMP_DIR = ${JA_SRV_TMP_DIR:-$TMPDIR} -JA_SRV_FILE_DIR = ${JA_SRV_FILE_DIR:-"$HOME/pm-server"} -JA_SRV_LOG = ${JA_SRV_LOG:-"$HOME/pm-srv.log"} -JA_SRV_MSG_MBOX = ${JA_SRV_MSG_MBOX:-"/dev/null"} - -# ... ... ... ... ... ... ... ... ... ... ... ... ... .. basic-config ... - -JA_SRV_CMD_STRING = ${JA_SRV_CMD_STRING:-"send"} -JA_SRV_PASSWORD = ${JA_SRV_PASSWORD:-".*"} - - -# From: header in OUTGOING MAIL -# -# - This is the "From:" header that is set when you send a reply -# - You may want to set this to different address than your regular -# login address. - -JA_SRV_FORMAIL_FROM = ${JA_SRV_FORMAIL_FROM:-""} - -JA_SRV_XGZIP_REGEXP = ${JA_SRV_XGZIP_REGEXP:-"dummy-regexp"} -JA_SRV_BASE64_ALWAYS = ${JA_SRV_BASE64_ALWAYS:-"\.(zip|tar|tgz|gz)$"} - -JA_SRV_X_HEADER = ${JA_SRV_X_HEADER:-"X-Mpfs-Info"} -JA_SRV_SH_COMMANDS = ${JA_SRV_SH_COMMANDS:-"^(ls|what|ident|file)$"} - -# ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. headers .. - -# Headers read from INCOMING MAIL -# -# We could do ${JA_SRV_FROM:-`$FORMAIL -xFrom:`} here, but -# this way we prevent calling extra formail processes. - -JA_SRV_SUBJECT = ${JA_SRV_SUBJECT:-""} -JA_SRV_FROM = ${JA_SRV_FROM:-""} - -:0 -* JA_SRV_SUBJECT ?? ^^^^ -* ^Subject:\/.* -{ - JA_SRV_SUBJECT = $MATCH -} - - -:0 -* JA_SRV_FROM ?? ^^^^ -* ^From:\/.* -{ - JA_SRV_FROM = $MATCH -} - -# ... ... ... ... ... ... ... ... ... ... ... ... ... .. maintenance .. - -JA_SRV_IN_USE = ${JA_SRV_IN_USE:-"yes"} -JA_SRV_IN_USE_NO_MSG = ${JA_SRV_IN_USE_NO_MSG:-\ -"File server is not functional at the moment due to maintenance."} - -# Could also be application/octet-stream for plain files - -JA_SRV_CONTENT_TYPE = ${JA_SRV_CONTENT_TYPE:-"text/plain; charset=US-ASCII"} -JA_SRV_CONTENT_ENCODING= ${JA_SRV_CONTENT_ENCODING:-"7bit"} - -# ................................................... multipart mime ... - -# If file is bigger than 100K, it is better that it is sent as mime multipart -# to save network connections. -# -# This applies to only files that match regexp JA_SRV_BASE64_ALWAYS - -JA_SRV_MULTIPART_THRESHOLD = ${JA_SRV_MULTIPART_THRESHOLD:-100000} - -# When the message has been composed, (file is in the body), it is -# handed to this program to do the actual mail split and sending. -# make sure you have this in your system. - -JA_SRV_MIME_MULTI_SEND = ${JA_SRV_MIME_MULTI_SEND:-"\ -splitmail -d -s $JA_SRV_MULTIPART_THRESHOLD"} - -# ..................................................... &subroutines ... -# You could replace any of these modules. -# if you change them and think the change would be useful for others too, -# send me an update or improvement. - -JA_SRV_RC_REQUEST = ${JA_SRV_RC_REQUEST:-$PMSRC/pm-jasrv-req.rc} -JA_SRV_RC_FROM = ${JA_SRV_RC_FROM:-$PMSRC/pm-jasrv-from.rc} -JA_SRV_RC_REPLY = ${JA_SRV_RC_REPLY:-$PMSRC/pm-jasrv-msg.rc} -JA_SRV_RC_CHECK = ${JA_SRV_RC_CHECK:-$PMSRC/pm-jasrv-check.rc} -JA_SRV_RC_SEND = ${JA_SRV_RC_SEND:-$PMSRC/pm-jasrv-send.rc} -JA_SRV_RC_SEND2 = ${JA_SRV_RC_SEND2:-$PMSRC/pm-jasrv-multi.rc} -JA_SRV_RC_SEND_ERR = ${JA_SRV_RC_SEND_ERR:-$PMSRC/pm-jasrv-err.rc} -JA_SRV_RC_DAEMON = ${JA_SRV_RC_DAEMON:-$PMSRC/pm-jasrv-daemon.rc} -JA_SRV_RC_MBOX = ${JA_SRV_RC_MBOX:-$PMSRC/pm-jastore.rc} - -# Please do _not_ change this variable; it is important the revision -# Number is shown there. And when you upgrade tp a new version, the -# variable has again the right version number. - -JA_SRV_XLOOP = ${JA_SRV_XLOOP:-\ -"Mime Procmail file server (MPFS $Revision: 2.9 $)\ -$JA_SRV_FORMAIL_FROM"} - -# .......................................................... &daemon ... - -INCLUDERC = $JA_SRV_RC_DAEMON # Is this bounce to FileServer msg? - -:0 # is stat is empty, everything is ok. -* stat ?? ^^^^ -{ - INCLUDERC = $JA_SRV_RC_REQUEST # Determine if we got request. -} - - -# ......................................................... &service ... - -:0 -* stat ?? ok -*$ ^Subject:.*$JA_SRV_PASSWORD -*$ ! ^X-Loop: $JA_SRV_XLOOP -{ - - # The nice thing is that the dummies show up in the VERBOSE log - # so you have a better clue where program is executing. - - dummy = "$NL$NL$id: copying original request to $JA_SRV_MSG_MBOX $NL" - - :0 c # Copy the original request - * JA_SRV_F_MBOX_REQUEST ?? yes - { - MBOX = $JA_SRV_MSG_MBOX - INCLUDERC = $JA_SRV_RC_MBOX - } - - INCLUDERC = $JA_SRV_RC_FROM # compose initial -rt reply - - # ......................................... &server-in-use-check ... - # Is the server up or down currently: If not; send message and quit. - - dummy = "$NL$NL$id: Is server down currently? $NL" - - :0 - * JA_SRV_IN_USE ?? no - { - stat = "NotInUse" - code = "echo \"$JA_SRV_IN_USE_NO_MSG\"" - INCLUDERC = $JA_SRV_RC_REPLY - } - - # "send THISFILE noconv" - # | | - # <FILE> WORD - # - - dummy = "$NL$NL$id: Subject: $JA_SRV_SUBJECT [reading the file] $NL" - FILE = "" - WORD = "" - - :0 - *$ JA_SRV_SUBJECT ?? $NSPC+$s+\/$NSPC+ - { - FILE = $MATCH - } - - :0 - *$ JA_SRV_SUBJECT ?? $NSPC+$s+$NSPC+$s+\/$NSPC+ - { - WORD = $MATCH - } - - # ....................................................... &check ... - - INCLUDERC = $JA_SRV_RC_CHECK - dummy = "$NL$NL$id: was $FILE a legal name $NL" - - :0 - * ! stat ?? ok - { - code = "echo \"$FILE is not acceptable\"" - INCLUDERC = $JA_SRV_RC_REPLY - } - - # ....................................................... &shell ... - - dummy = "$NL$NL$id: Check if FILE [$FILE] is allowed SHELL command $NL" - - :0 - * FILE ?? [a-z0-9] - *$ FILE ?? $JA_SRV_SH_COMMANDS - { - dummy = "$NL$NL$id: PATH used for shell command is [$PATH] $NL" - stat = "sh" - code = "$FILE * " - INCLUDERC = $JA_SRV_RC_REPLY - } - - # ........................................................ &send ... - - dummy = "$NL$NL$id: Test if file exists in server dir $NL" - - MAILDIR = $JA_SRV_FILE_DIR # chdir to the fileserver directory - file = $MAILDIR/$FILE # absolute filename - - :0 - * FILE ?? [a-z0-9] - *$ ? test -r $file - { - - dummy = "$NL$NL$id: Checking mime multipart $NL" - size = "" - - # only binary files are send out as multiparts. - # We call Perl only if we need the file size information - - :0 - * JA_SRV_BASE64_ALWAYS ?? [a-z] - *$ FILE ?? $JA_SRV_BASE64_ALWAYS - { - size = `$PERL -e 'print "", (stat shift @ARGV)[7]; exit' $file` - } - - # If we got the file size, (perl succeeded), and if the size is - # more than the threshold, send the file as MIME multipart. - # ELSE then send the file conventionally. - - :0 - * size ?? [0-9] - * JA_SRV_MULTIPART_THRESHOLD ?? [0-9] - *$ $size ^0 - *$ -$JA_SRV_MULTIPART_THRESHOLD ^0 - { - INCLUDERC = $JA_SRV_RC_SEND2 - } - - :0 E - { - INCLUDERC = $JA_SRV_RC_SEND - } - - } - :0 E - { - INCLUDERC = $JA_SRV_RC_SEND_ERR - } - - # ........................................................ &mbox ... - # Sink the "send FILE" msg - - dummy = "$NL$NL$id: Sinking request to $JA_SRV_MSG_MBOX $NL" - - :0 - * JA_SRV_F_MBOX_REQUEST_SENT ?? yes - { - # Do we have anything to report before sinking to folder? - # Add possible new fields ($fld) in one call. - - dummy = "$NL$NL$id: Anything to report in headers? $NL" - - :0 fhw - * ! fld ?? ^^^^ - | $FORMAIL ${fld+"$fld"} - - MBOX = $JA_SRV_MSG_MBOX - INCLUDERC = $JA_SRV_RC_MBOX - } - - # IF the answer was not filed (JA_SRV_F_MBOX_REQUEST_SENT == no) - # Then kill the message. - - :0 h - /dev/null -} - - -dummy = "$id: end:" - -# Enf of pm-jasrv1.rc diff --git a/src/procmail/pm-jastore.rc b/src/procmail/pm-jastore.rc @@ -1,139 +0,0 @@ -# pm-jastore.rc -- Store messagee to inbox or gzip inbox -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This subroutine stores the message to file pointed by `MBOX'. This -# subroutine is meant to be used with the the other general purpose -# includerc files. This makes it possible to have a centralized file -# storage handling for all your rc files. -# -# Regular user doesn't get much out of this rc unless he mixes both -# .gz and regular files in his .procmailrc -# -# R e p e a t: This module is basis for general purpose procmail -# rc plug-ins to strre message to mailbox pointed by some rc -# configuration variable. Normal user can simply say in his .procmailrc: -# -# :0: -# mail.private -# -# Required settings -# -# (none) -# -# Call arguments (variables to set before calling) -# -# `MBOX' must have been set to point to message storage. -# `MBOX_SUFFIX' is extension added to MBOX. Default is none. -# `MBOX_MH' if "yes" then deliver to MH mailbox with -# `MBOX_MH_CMD' which is "rcvstore" by default. -# -# o message is delivered to MH mailbox using `MBOX_MH_CMD' -# -# otherwise -# -# o If MBOX is `some.mbox' the message is stored as is. -# o If MBOX is `some.mbox.gz' the message is gzipped to folder. -# o If MBOX is `some-dir/.' then deliver as individual files -# -# Example usage -# -# $RC_MBOX = $PMSRC/pm-jastore.rc -# -# :0 -# * condition -# { -# MBOX = $HOME/Mail/spool/junk.mbox INCLUDERC = $RC_MBOX -# } -# -# Change Log: (none) - -# ............................................................ &init ... - -id = "pm-jastore.rc" -dummy = " -======================================================================== -$id: init: -" - - -# ........................................................... &do-it ... -# make sure you define MBOX before calling this module. - -:0 h -* MBOX ?? /dev/null -/dev/null - -:0 E -* MBOX ?? [a-z] -{ - - MBOX_SUFFIX = ${MBOX_SUFFIX:-""} - MBOX_MH = ${MBOX_MH:-"no"} - MBOX_MH_CMD = ${MBOX_MH_CMD:-"rcvstore"} - lock = "$MBOX$LOCKEXT" - - :0 fhw # Add possibly missing From_ line - * ! ^From + - | $FORMAIL - - dummy = "pm-jastore.rc: testing MH mbox" - - :0 - * MBOX_MH ?? yes - { - # Do we need lock for MH ? - - :0 w: $lock - | $MBOX_MH_CMD $MBOX - } - :0 E - { - - dummy = "pm-jastore.rc: testing compressed mbox" - - :0 w: $lock - * MBOX ?? \.gz - | $GZIP -9fc >> $MBOX - - # Whether it is regular mbox or directory, this - # will deliver the message to it - - :0 E - { - - dummy = "pm-jastore.rc: if empty MBOX_SUFFIX (ordinary mbox)" - - :0 : - * MBOX_SUFFIX ?? ^^^^ - $MBOX - - :0 E: - $MBOX$MBOX_SUFFIX - } - -} - -:0 E -{ - dummy = "pm-jastore.rc: ***** WARNING - MBOX variable is empty ******" -} - -dummy = "$id: end:" - -# pm-store.rc ends here diff --git a/src/procmail/pm-jasubject.rc b/src/procmail/pm-jasubject.rc @@ -1,573 +0,0 @@ -# pm-jasubject.rc -- Subject field cleaner and canonicalizer (Re:) -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# _NOTE:_ If you receive RFC 2047 encoded Subject headers like -# "Subject: =?ISO-8859-1?Q?=C4hnlichkeiten_von_=DCbungen?=", you -# must first decode it before using this subroutine. Feed the -# message to `pm-jamime-decode.rc' first. -# -# There are many different Email programs out there that add their -# own `reply' characters to the subject field. The most sad programs -# come usually from PC platform. Eg. Microsoft has gained a lot of -# bad reputation due to it's own standards. -# -# o MS Explorer can use localized reply strings, -# Eg `Vs:' or `vast:' seems to be Finnish `Vastaus'. -# o MS product Outlook (??) can be configured similarly. -# I have received swedish `Sv:' `-Svar' for `Svaring' (eng: reply) -# o MS mail uses `FW:' in forwarded mails. -# o Intelligent MUAs try to keep count of replies with -# `Re2:' or `Re[2]' -# o Japanese MUA Denshin 8 Go V321.1b7 has sent Re^2: -# o Some mua uses `Re>' -# o Lotus notes (in French version) uses `Ref:' -# o Some MS product sends `UQ:' -# o XXX uses `-reply' -# o Forwarding schemes: (fwd) [fwd] <fwd> fw: [FWD: [FWD:]] -# o Subject references: -subj subj- subj: -# -# There already is a de facto standard where message should contain -# only single `Re:' if message has been replied to (no matter how -# many times). This makes it possible to do efficient message -# threading by only using Subject and date fields. And grepping same -# subjects is lot easier than from this horrible mess. Note that -# all text is on one line, the subject has been broken only -# for visual reasons: -# -# Subject: re- Re^2: Re[32]: FW: Re: Re(15) Sv: Re[9]: -reply -# (fwd) [fwd] <fwd> fw: [FWD: [FWD:]] -# -subj subj: subj: subj- -# test -# -# This recipe standardizes any subject (like above) that has been -# replied to, to de facto format below. That is: "Any number of 'Re:' -# will be converted to *single* 'Re:' and any number of 'Fwd:' will be -# converted to *single* 'Fwd:'" -# -# Subject: Re: test (fwd) -# -# About In-Reply-To header -# -# If there is `In-Reply-to' header in the message, but there is -# not *Re:* in the subject line, one is added automatically. -# Some broken Mailers forget to add the *Re:* to the Subject -# line. -# -# Variable JA_SUBJECT_SAVE -# -# This is by default `yes' which causes the original subject to -# be saved under header field `X-Old-Subject'. If you don't want -# that extra header generated, set this variable to `no' -# -# Variable JA_SUBJECT_FWD_KILL -# -# This is by default `yes', which will kill extra forwarding -# indication words like (fwd) [fwd] <fwd> <f>. If you set this -# to `no', then all the forwarding words are preserved. The de -# facto forward format is: -# -# Subject: This subject (fwd) -# -# Code note -# -# This subroutine's intention is to make Subject more expressive -# by deleting redundant information. A simplistic approach has -# been taken where Subject consists of list of *words* whose -# each attribute can be either `ok' or `delete'. No attempt has -# been made to determine the structure of the Subject. You can -# see the algorithm better -# from an example: -# -# Re: New subject (was Re: Old subject) -# -# That should be treated syntactically like "New subject" and -# forgetting anything between parenthesis. This is however not -# respected and not even tried. The rule applied here is "One -# Re: is tolerated", so the subject won't change. It doesn't -# matter where "Re:" is. -# -# But here the subject is changed. The rule applied is: Delete -# all unwanted _words_ and then add one Re: to the beginning if OLD -# content had any Reply indications -# -# Re: New subject (was Re: Old subject) -# --> Re: New subject (was Old subject) -# -# IMPORTANT notice -# -# Please check that your `SHELL' variable setting in `~/procmailrc' -# is `sh' derivate, /bin/sh or /bin/bash. This module won't work with -# other shells. -# -# Awk usage note -# -# `awk' is a small, effective and much smaller than perl for little -# tasks. See the verbose log and make sure your awk understands -# VAR="value" passing syntax. Change it to `nawk' or `gawk' if they -# work better than your standard awk. -# -# AWK = "gawk" # you may need this, try also gawk -# -# Customizations -# -# Let's say Polish M$Outlook uses `ODP:' instead of -# standard `re:' and you want to handle that too: Then set: -# -# JA_SUBJECT_KILL = "odp:" # NOTE: all lowercase -# JA_SUBJECT_SAVE = "no" -# INCLUDERC = $PMSRC/pm-jasubject.rc -# -# You ca use `JA_SUBJECT_KILL' to delete any additional words from the -# subject line. E.g. if you have good news-reader, you don't need the -# mailing list prefixes that some mailing lists add to the beginning -# -# Subject: [LIST-xxx] the subject here -# -# to remove that list prefix, you simply match it -# -# JA_SUBJECT_KILL = "(list-xxx|list-yyy)" -# -# Important: The regexp must be _all_ lowercase, because when match -# happens, the words have been converted to lowercase. -# -# Example usage -# -# You need nothing special, just include this recipe -# before you save message to folder. -# -# INCLUDERC = $PMSRC/pm-jasubject.rc -# -# Debugging -# -# You can dry-run test this module with following command and watching -# output. Substitute variables as they are in your system. You feed -# the content of entire example mail where the Subject that needs -# correction is found. -# -# % procmail SHELL=/bin/sh AWK=gawk VERBOSE=on LOGABSTRACT=all \ -# DEFAULT=/dev/null LOGFILE=$(tty) \ -# JA_SUBJECT_KILL="(ace-users)" \ -# PMSRC=/path/to/install/dir \ -# /path/to/pm-jasubject.rc \ -# < ~/test.mail -# -# Thank you -# -# Thanks to <Tony.Lam@Eng.Sun.Com> for his creative -# improvement suggestions and sending code that this -# recipe didn't catch at first. -# -# Change Log (none) - -dummy = " -======================================================================== -pm-jasubject.rc: init: -" - -:0 -* ! WSPC ?? ( ) -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# .......................................................... &public ... - -# -- Put your own reply customization here: regexp is merged to -# default values. -# -- The regexp must be _all_ lowercase, because the matched -# word in the line is converted to lowercase before -# matching takes place. - -JA_SUBJECT_KILL = ${JA_SUBJECT_KILL:-""} - -# Set to "no" if you don't want to see `X-Old-Subject:' - -JA_SUBJECT_SAVE = ${JA_SUBJECT_SAVE:-"yes"} -JA_SUBJECT_FWD_KILL = ${JA_SUBJECT_FWD_KILL:-"yes"} - -# ........................................................... &check ... -# If the pm-javar.rc module was not loaded, then it would be -# disaster to call awk block. Make sure the $a and $AWK variables -# exist before doing anything. - -error = "no" - -:0 -* a ?? [a-z] -* AWK ?? [a-z] -{ } -:0 E # Else -{ - dummy = "pm-jasubject.rc: $JA_MSG_ERROR CONFIGURATION IS NOT CORRECT" - error = "yes" -} - -# .......................................................... &private ... - -subject = # Kill variable - -:0 -* ^Subject: *\/.* -{ - originalSubject = $MATCH - subject = $MATCH -} - -# These variables are not all caps, because they are not intended to be -# user configurable. Please email the author if this module if they are -# not enough for you. -# -# All characters in the regexp must be lowercase, because regexp is -# used in awk. Remember: -- Always parenthesize -- -# -# Notes: -# o Using regexp "re^[0-9]+:" to kill Re^2: doesn't work. We use -# regexp "re.[0-9]+:" -# o re(2) is matched by re[(][0-9]+[)]. Notice that there is not colon(:) -# o [[(<]fwd?[])>] matches things like (fwd) [fwd] <fwd> - -fwd = "" -fwdKill = 0 # AWK needs numeric True/False -fwdCount = "" -forwarded = "no" -savedLINEBUF = $LINEBUF -LINEBUF = 8192 # Need bigger value than default - -# All letters MUST BE LOWERCASE (for awk). No spaces anywhere in regexp - -fwdRegexp = ${fwdRegexp:-"(fwd?):|[[(<]fw?d?[])>]"} - -:0 -* JA_SUBJECT_FWD_KILL ?? yes -{ - fwd = $fwdRegexp - fwdKill = 1 - - :0 - *$ $fwdRegexp - { - forwarded = "yes" - } -} - -# All letters MUST BE LOWERCASE (for awk). No spaces anywhere in regexp - -replyTypes = ${replyTypes:-"\ -(re([0-9]+|.[0-9]+.|.[0-9]+):\ -|re[(][0-9]+[)]\ -|re-|re>|-reply|-svar\ -|(vs|vl|aw|fs|vast|sv|rv|ref|uq):\ -|-subj|subj-|subj:\ -)"} - -SubjectDoIt = "no" -UserRegexp = "" -wordKillRegexp = "$replyTypes" -dummy = "pm-jasubject.rc: Possibly adding JA_SUBJECT_KILL" - -# Has user given any additional keywords to kill? -# The variable must contains a-z - -dummy = "pm-jasubject.rc: :::::::::::::::::::::::::::::: #JA_SUBJECT_KILL" - -:0 -* ! subject ?? ^^^^ -*$ JA_SUBJECT_KILL ?? $a -{ - wordKillRegexp = "$replyTypes|$JA_SUBJECT_KILL" - - # Always remove words that user has defined - - :0 - *$ subject ?? $JA_SUBJECT_KILL - { - SubjectDoIt = "yes" - UserRegexp = "yes" - } -} - -# ....................................................... &forwarded ... - -dummy = "pm-jasubject.rc: :::::::::::::::::::::::::::::: #FWD" - -:0 -*$ fwdRegexp ?? [a-z] -{ - wordKillRegexp = "$wordKillRegexp|$fwdRegexp" - - :0 - * SubjectDoIt ?? no - *$ subject ?? ($fwdRegexp)\/.* - { - subject = $MATCH - fwdCount = "1" - - SubjectDoIt = "yes" - - :0 - *$ subject ?? ()\/($fwdRegexp).* - { - fwdCount = "2" - } - } -} - -# must parenthise, so that ".*" can be added to it - -wordKillRegexp = "($wordKillRegexp)|re:" - -# ........................................................ &de-facto ... -# We count because we want to know if we need to call awk or not. -# If there is only 1, then there is no point running external shell process, -# if there is at least two, then we need awk. -# -# In any case we need AWK if user has set mailing list kill words, like -# [this-list] - - -# *) grab first match. REPLY word count is then 1. In this case there is -# nothing more to kill -# *) Search second match, REPLY word count is 2 - - -dummy = "pm-jasubject.rc: :::::::::::::::::::::::::::::: #DE-FACTO" -replyCount = 0 - -:0 -*$ subject ?? re:\/.* -{ - subject = $MATCH - replyCount = 1 - - :0 - *$ subject ?? ()\/re:.* - { - replyCount = 2 - SubjectDoIt = "yes" - } -} - -# .................................................... &non-standard ... - -# Note: The "Re[0-9]+ " is special case. We can't pass it to AWK, because -# it doesn't see spaces, it couns only words, which are delimited by -# ^...$ - -dummy = "pm-jasubject.rc: :::::::::::::::::::::::::::::: #REPLY-TYPES " - -:0 -* SubjectDoIt ?? no -* subject ?? ()\/.* -*$ $SUPREME^0 subject ?? ($replyTypes)\/.* -*$ $SUPREME^0 subject ?? Re[0-9]+ \/.* -{ - subject = $MATCH - replyCount = 1 - - SubjectDoIt = "yes" - - :0 - *$ subject ?? ()\/($replyTypes).* - { - replyCount = 2 - } -} - -dummy = "pm-jasubject.rc: ::::::::::::::::::::::::::::: #DO-IT $SubjectDoIt" - -# Many foreign language is usually presented in encoded format -# (iso-8859-1). Furthermore, if pm-jamime-decode.rc was used to -# "open" the Subject line it will set a flag -# `PM_JAMIME_COMPLEX_SUBJECT' for messages that should not be -# touched (too complex). In those cases it the procmail's -# capabilities were reaached and the Subject line should be left -# as is. - -:0 -*$ $SUPREME ?? ^Subject:.*\?iso-8859-.\? -*$ $SUPREME ?? ! PM_JAMIME_COMPLEX_SUBJECT ?? ^^^^ -{ - SubjectDoIt = "no" -} - -:0 -* SubjectDoIt ?? no -{ - # Remove excess spaces between the "Subject" keyword and subject itself - - :0 fh w - *$ subject ?? $s$s+\/$NSPC.* - | $FORMAIL -I "Subject: $MATCH" - - # Some Emacs VM users reply emails without - # adding "Re: " in front of the subject (as VM default setting). - # Add one if needed. - - :0 fh w - * replyCount ?? 0 - * ^(In-Reply-To|References): - *$ subject ?? $s+\/.* - | $FORMAIL -I "Subject: Re: $MATCH" - - # Some users (of dtmail) forward emails without - # adding "fwd " in front of the subject - # Add one if needed. - - :0 E - * ^Message-ID: \<libSDtMail\..*\> - * fwdCount ?? 0 - * replyCount ?? 0 - * B ?? ^ ---[\-]+ Begin Forwarded Message --- - { - :0 fh w - *$ subject ?? $s+\/.* - | $FORMAIL -I "Subject: $MATCH (fwd)" - } -} - -:0 -* subject ?? ()\/.+ -* error ?? no -* SubjectDoIt ?? yes -{ - subject = $MATCH - - # Print log entry to show what regexp we're using. - # Grab the regexp from there for external testing or development. - - dummy = "pm-jasubject.rc: $SHELL $AWK is called with regexp: $NL\ - $wordKillRegexp $NL $fwdRegexp" - - # ......................................................... clean ... - - # The awk works this way: - # - split subject to individual words --> array LIST - # - convert every word to lowercase(str) before doing match - # because AWK is case sensitive - # - Add only valid words to "s" (string) and return "clean" subject. - # - # There is a special check in this program. Notice the 'lastpos'. - # It's purpose is to detect cases like this: - # - # [Fwd: Re: [jp] J-Pilot 0.99.8-pre2] Real subject here - # | - # lastpos - # - # The above subject is too complex to be treated like words, - # because it contains inner bracket which ends to lastpos. All - # of them must be removed. The word based match would treat it like: - # - # [Fwd: Re: [jp] J-Pilot 0.99.8-pre2] - # 1 2 3 4 5 - # - # 1. Looks like forwarding word. Removed - # 2. Looks like forwarding word. Removed - # 3. Looks good word - # 4. Looks good word; the ']' is not special - # - # And the result would be: - # - # J-Pilot 0.99.8-pre2] - - clean = `echo "$subject" | $AWK \ - ' { \ - max = split( $0, list, "[ \t]+" ); \ - lastpos = 0; \ - s = ""; \ - for( i = 1; i <= max; i++) \ - { \ - word = list[i]; \ - str = tolower( word ); \ - if ( FWD_KILL && match(str,FWD_RE) > 0 ) \ - { \ - fwd = 1; \ - } \ - if ( match(str,RE) < 1 && match(str, "^re[0-9]+$") < 1 ) \ - { \ - if ( s == "" ) \ - { \ - s = word; \ - } \ - else \ - { \ - s = s " " word; \ - } \ - } \ - if ( match(str,"^[^][]+[]]") > 0 ) \ - { \ - lastpos = i; \ - } \ - } \ - if ( lastpos ) \ - { \ - s = ""; \ - for( i = lastpos + 1; i <= max; i++) \ - { \ - s = s " " list[i]; \ - } \ - } \ - if ( match(s, "^ *$") ) \ - { \ - s = "(none)"; \ - } \ - if ( fwd ) \ - { \ - printf "%s (fwd)", s; \ - } \ - else \ - { \ - print s; \ - } \ - } \ - ' RE="$wordKillRegexp" FWD_RE="$fwdRegexp" FWD_KILL=$fwdKill ` - - # ................................................ update subject ... - - dummy = "pm-jasubject.rc: :::::::::::::::::::::::::::: #RESULT" - word = "" - - :0 - *$ replyCount ?? [1-9] - { - word = "Re: " - } - - # it makes sense replacing the Subject only if the word - # contains something - - :0 - * clean ?? [a-z] - { - - # Coording to RFs, all user defined additional fields - # must start with X- - - :0 fh w - * JA_SUBJECT_SAVE ?? yes - | $FORMAIL -I "X-Old-Subject: $originalSubject" - - :0 fh w - | $FORMAIL -I "Subject: $word$clean" - } -} - -LINEBUF = $savedLINEBUF -dummy = "pm-jasubject.rc: end: $word$clean" - -# End of pm-jasubject.rc diff --git a/src/procmail/pm-jatime.rc b/src/procmail/pm-jatime.rc @@ -1,127 +0,0 @@ -# pm-jatime.rc -- "hh:mm:ss" time parser from variable INPUT -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This includerc parses date from variable INPUT which has string -# -# "hh:mm:ss" -# -# Example input -# -# "Thu, 13 Nov 1997 11:43:23 +0200" -# -# Returned values -# -# hh = 2 digits -# mm = 2 digits -# ss = 2 digits -# -# Variable ERROR is set to "yes" if it couldn't recognize the INPUT -# and couldn't parse all hh, mm, ss variables. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include pm-javar.rc from there. -# -# Call arguments (variables to set before calling) -# -# INPUT = string-to-parse -# -# The INPUT can be anything as long as it contains NN:NN:NN -# -# Usage example -# -# Get the time of received message. The From_ header will always -# have the standard time stamp. -# -# PMSRC = $HOME/pm -# RC_DATE_TIME = $PMSRC/pm-jatime.rc -# -# :0 c -# * ^From +\/.* -# { -# INPUT = $MATCH -# # Turn off the logging while executing this part -# -# VERBOSE=off INCLUDERC = $RC_DATE_TIME VERBOSE=on -# -# :0 -# * ERROR ?? yes -# { -# # Should not ever happen, you have broken From_ -# } -# } -# -# Change Log (none) - -# .................................................... &initializing ... - -id = "pm-jatime.rc" -dummy = " -======================================================================== -$id: init: -" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# ..................................................... &output-vars ... -# output variables -# -hh mm ss -ERROR = "yes" # set default value - -# ........................................................... &do-it ... -# Check that input is something like: Thu, 13 Nov 1997 -# -dummy = "$id: Parse date like [Tue, 31 Dec 1997}" -dummy = "$id: INPUT = $INPUT" - -:0 -*$ INPUT ?? $s*\/$d$d:$d$d:$d$d -{ - - INPUT = $MATCH - - *$ INPUT ?? ^\/$d$d - { - hh = $MATCH - } - - :0 - *$ INPUT ?? ^$d$d:\/$d$d - { - mm = $MATCH - } - - - :0 - *$ INPUT ?? ^$d$d:$d$d:\/$d$d - { - ss = $MATCH - ERROR = "no" - } -} - -dummy = "$id: end:" - -# end of file pm-jadate.rc diff --git a/src/procmail/pm-jaube-keywords.rc b/src/procmail/pm-jaube-keywords.rc @@ -1,785 +0,0 @@ -# pm-jaube-keywords.rc -- Bare bones word list based UBE filter -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Warning -# -# Put all your UBE (aka spam) filters towards the _end_ of your -# ~/.procmailrc. The idea is that valid messages are filed -# first (mailing lists, your work and private mail, bounces) and only -# the uncategorized messages are checked. -# -# Now, if 50-70 % hit rate is good enough for your starting point, -# go ahead and read more. This file is supposed to be the last resort, -# if you really do not have any better tool to analyze messages. -# -# Overview of features -# -# o Word and phrase based matching -# o 50-70 % success rate. 90 % never achieved. That's a guarantee. -# o Extremely fast and a dream to CPU resources. Implemented in pure -# procmail and you can almost hear the humming sound of its -# regular expression engine shredding UBE messages to pieces. -# -# Description -# -# Are you sure you want use this word list based checking? -# -# Think twice before you use this subroutine. It knows nothing about -# the content your mail. "It's all UBE unless proven otherwise" is the -# motto. The brutal search tracks words and phrases to find an indication -# of mass posting and traces of Unsolicited Bulk Email (UBE aka spam). -# _Repeat:_ Read the first paragraph again before you consider putting -# this file into action. This filter WILL PASS through unwanted mail -# and it WILL catch good mail. This is rule based matching, so I suppose -# you know where you're putting your head with this. Ahem. Alerted? Good. -# -# The Story -# -# There was a man and mail account. The account had limited space, -# couldn't install any other programs because disk quota would have -# exceeded. System administrators weren't' interested in installing -# anything. The Mail server ran behind firewall and had OS that was -# never heard of - it couldn't run other programs. Or if it could, -# the Bad system administrator was too scared to install extra -# programs to the host MTA ran. No joy -- no means to stop incoming -# UBE -- Right? -# -# Wrong. There was procmail. The Bad system adminitrator didn't mention -# that `~/.procmailrc' was honored - just the the external programs -# we a no-no-no (Technical: the MDA host mounted user disks; the -# server ran on separate host and couldn't use any of the user -# compiled programs. Statically linked ones filled up the man's disk -# space). -# -# First line of defense, any defense would do. So, this rule based -# file was born. Nothing else was installed in that account and the -# happy word list based matching routine kept chewing mail, mail, -# mail. And the system administrator was happy - he nurtured the MTA -# host's CPU resources and noticed nothing alarming. All ticked like -# clockwork. -# -# Life began again. After 1000 mail bombards a day, the account was -# usable again. -# -# Motivation -# -# If you can, use the Bayesian filters and forget all rule based -# ones, word and phrase matching based ones; all static filters. On -# the other hand, if you want quick solution, even imperfect, until -# you have time to learn and setup other tools, this subroutine may -# be of interest. -# -# The best part. You can carry this single file anywhere where procmail -# lives. No other files are needed. Setup couldn't be simpler. -# -# About bouncing message back -# -# The general consensus is, that you should not send bounces. The UBE -# sender is not there, because the address is usually forged. Do not -# increase the network traffic. Instead save the messages to folders -# and periodically check their contents. It's not nice to be forced to -# apologize about bounces to a wrong destination. -# -# Code Note -# -# Procmail is picky about the whitespace in continuing lines, make sure -# there is _not_ a single spaces left after the continuation backslash. -# Use good editors or external programs to get rid of the white spaces. In -# Emacs you would add this line to your `~/.emacs' startup file: -# "(add-hook 'write-file-hooks 'delete-trailing-whitespace)" -# -# :0 -# * ^Subject:.*(regexp\ -# |and-more\ -# |and-more\ -# ) -# { -# # Process it -# } -# -# Why are the regexps put into this file and not to a separate regexp -# file? Good question. It is possible to check message's content with -# external process, like `grep', to see if any matches are found. -# This kind of methodology is covered in Procmail Tips section -# "Using grep with file lists to mach messages" at -# <http://pm-tips.sf.net>. The reason why all the regexp are maintained -# inside this file is: -# -# o Simplicity. One file - no extra configuration files or regexp -# databases. -# o Self standing. Does not call external processes, so it's a little -# faster than possible `grep' and `fgrep' solution. -# -# Required settings -# -# None. No dependencies to other procmail modules. -# -# Call arguments (variables to set before calling) -# -# o JA_UBE_KEYWORD_HEADER, if set, then the results are put to -# messages headers. By default this variable is not defined -# to save from external `formail' process call. -# Suggestion: "X-Spam-JaubeKwd"; without trailing colon. -# -# Return values -# -# o `ERROR_STATUS' is set to word "Bad" otherwise empty. -# o `ERROR' is set to short descriptive word that indicate which -# rule was matched. Values: *Header-FromKeywords*, -# *Header-SubjectKeywords* and *Body-Keywords* -# o `ERROR_MATCH' is set to some words that happened to trigger -# UBE catch rule. -# -# Usage example -# -# PMSRC = "/path/to/procmail/lib" -# # Exclude these addresses from tests -# VALID_FROM = "(my@address.example.com|word@here.example.com)" -# -# :0 -# *$ ! ^From:.*$VALID_FROM -# * ! FROM_DAEMON -# { -# INCLUDERC = $PMSRC/pm-jaube-keywords.rc -# -# # Variable "ERROR" is set if message was UBE -# -# :0 : -# * ! ERROR ?? ^^^^ -# junk.ube.spool -# } -# -# File layout -# -# The layout of this file is managed by Emacs packages tinyprocmal.el -# and tinytab.el for the 4 tab text placement. -# See project http://freshmeat.net/projects/emacs-tiny-tools/ -# -# Change Log -# -# None. - -dummy = " -======================================================================== -pm-jaube-keywords.rc: init:" - - -####################################################################### -# -# User configurable variables. Set these, before calling this -# module/subroutine. -# -####################################################################### - -# Set to a empty to suppress external shell call to `formail'. - -JA_UBE_KEYWORD_HEADER = ${JA_UBE_KEYWORD_HEADER:-"X-Spam-JaubeKwd"} - -####################################################################### -# -# Private variables. Do not touch -# -####################################################################### - -# Kill variables or set default values - -ERROR -ERROR_MATCH -ERROR_STATUS - -NL = " -" -LF = $NL # synonym, linefeed -CR = " " # Carriage return -TAB = " " # \t character, you won't see it. -WSPC = " $TAB" # whitespace in procmail: space + tab - -# These are the variables that you're likely to use in -# condition lines. Notice that there is Perl styles `s' variable -# for shorter name for most used SPC. - -SPC = "[$WSPC]" # Regexp space/tab -NSPC = "[^$WSPC]" # Negation, non-whitespace -CHAR = "[^ $TAB$NL$CR]" # A character - -# Whitespace with linefeed -# Note that in regexps, the character class is faster that OR. -# Refer to O'Reilly book "Mastering Regular Expressions" -# -# space + tab + dollar -# -# ( | |$) is slower than ([ ]|$) - -SPCL = "($SPC|$|$CR)" # space or tab; linefeed; Carriage return - -jaubeKwdLinebufOld = $LINEBUF -LINEBUF = 65535 # Increase - -jaubeKwdVerboseOld = $VERBOSE # don't write log for these variables -VERBOSE = off - -# German, Spanish and other languages - -jaubeLanguage="(\ -[a-z] (con|m[ae]s|para) [a-z]\ -|\<aloha\ -|\<bitte\>\ -|\<arbeitet\ -|\<bail[ae]\ -|\<damen\ -|\<ganz\ -|\<herren\ -|\<bestaetigung\ -|\<contenidos\ -|\<fabricamos\ -|\<freundlichen\ -|\<kontakte\ -|\<seguridad\ -|<\ihre\ -|\<jetzt\ -|\<keine?\>\ -|\<kontakt\ -|\<telefono\ -|\<tenga\ -|\<totalmente\ -|\<trabaj\ -|\<vacantes\ -)" - -# English words. These keywords must be strict, because they are used -# BOTH in header and body. - -jaubeKeywords="(\ -[0-9][0-9.]* +per +(month|year)\ -|\<18th\>\ -|\<accessor(y|ies)\ -|\<acne\>\ -|\<adult\>\ -|\<advertis\ -|\<adorn\ -|\<a+n+a+l\ -|\<aphrodi\ -|\<affordable\ -|\<at + no +charge\ -|\<babe\>\ -|bachelor\ -|\<be\>.*\<(again|strong)\ -|bedroom\ -|bewitch\ -|\<bitch(es)?\>\ -|\<biz\>\ -|\<blonde\>\ -|\<bodyguard\ -|\<bondage>\ -|\<boob([sy]|ed)?\>\ -|boyfriend\ -|\<breast\ -|\<brunette\ -|\<bucks\>\ -|business +on our\>.*\<site\>\ -|\<call +[+]?[0-9][0-9]\ -|\<call +(me|us)\>\ -|\<cash\>\ -|\<cable +tv\ -|calsium\ -|cartoon\ -|cartridge\ -|casino\ -|celebrit\ -|\<censor(ed)?\>\ -|\<cheap(er|est)?\>\ -|cholesterol\ -|C[|i]+a[|]*1is\ -|\<clinic\ -|\<click +here\ -|\<clits?\>\ -|\<cocaine\ -|\<cock\>\ -|\<congrat\ -|confiden(c|tial)\ -|confrontation\ -|consultation\ -|\<cutie\ -|\<credits?\>\ -|\<cum(shots?)?\>\ -|\<daughter\ -|\<(dating|escort) +service\ -|\<deal.*to.*\<you\ -|\<dear.*(user|owner)\ -|\<defensa\ -|\<delight\ -|\<dental\ -|depressant\ -|detective\ -|\<diabet\ -|\<dick\>\ -|\<dildo\>\ -|diploma\ -|discreet\ -|\<do +you +like\ -|\<doctor\ -|domestic\ -|download.*today\ -|dramatic\ -|drugs\ -|earnings\ -|\<eighteen\ -|erection\ -|eroti[ck]\ -|fair +exchange\ -|exchange +rate\ -|exquisite\ -|\<fags\>\ -|farmac[yo]\ -|fashion\ -|female\ -|financ(e|ial)\ -|filing.*quotes\ -|\<films?\>\ -|filthy\ -|fitness\ -|\<for .*your.*Needs\ -|\<f+u+c+k\ -|\<funds?\>\ -|\<g+a+y+\>\ -|get it for (just)?.*[$]\ -|get +perfect.*your\ -|get +(lucky|fucked)\ -|Get +the +best\ -|girls?\>\ -|get +(a|for)? *free\ -|\<granny\ -|greetings\ -|gouranga\ -|h+a+r+d+c+o+r+e\ -|herbalife\ -|(hi|hello|hey)[.!?]* +(people|lucky)\ -|\<hot\>\ -|\<honey\>\ -|horoscope\ -|hurry +(now|fast)\ -|\<job +offer\ -|\<husband\ -|\<illnes\ -|\<income\ -|\<in +bed\ -|\<invest(ment)?\>\ -|\<interest +rates\>?\ -|\<iraq\ -|just .*$d+.*days\ -|\<jude\>\ -|\<kenedy\ -|laboratory\ -|\<laden\>\ -|\<lad(y|ies)\>\ -|legislation\ -|lesbian\ -|\<libido\ -|lifestyle\ -|(limited|special|future)\>.*\<offer\ -|\<li+m+i+t+e+d.*time\ -|lingerie\ -|\<lo+l+i+t+a+\ -|\<lose +(some)? *(weight|pounds)\ -|losing +it +all\ -|\<low.*rate\ -|\<loan\ -|\<lott(o|ery)\>\ -|madam\ -|mafia\ -|manhood\ -|\<marine\<\ -|masturbat\ -|medic(a[lt]|in)\ -|mexican\ -|money\ -|mortgage\ -|movie\ -|\<new.*<(video|dvd|cd)s?\>\ -|nigeria\ -|nipple\ -|offer.*valid\ -|offshore\ -|<\oil\>\ -|oppurtun\ -|\<orgy\>\ -|\<our +(company|product)\ -|order +(soon|now|fast)\ -|pain killer\ -|paycheck\ -|paying\ -|\<partner\ -|\<pence\ -|\<penis\>\ -|\<pharmae?c\ -|\<poker\ -|\<prank\ -|\<pregnan\ -|\<p[0o]+rn\ -|\<polls?\>\ -|\<profit\>\ -|promotion\ -|prostitute\ -|\<puss(y|ies)\>\ -|\<rape\>\ -|\<rates +starting +at\ -|\<realestate\ -|refinance\ -|regalis\ -|(restaurant|food) +recipe\ -|\<rich\>\ -|robbery\ -|\<rolex\ -|\<sadd?am\ -|sadomasokism\ -|satellite.*\<(tv|dish)\>\ -|\<(sav(ing|e)|buy|see|web).*\<(pills|meds|m +e +d +s)\>\ -|\<scent\>\ -|screensaver\ -|\<sex\>\ -|\<sin\>\ -|since we've chatted\ -|\<silver\ -|\<singles\ -|\<sir\>\ -|\<s[i|]ze +(real[a-z|]+ +)*matters?\>\ -|\<sluts?\>\ -|sperm\ -|stamina\ -|stocks?\ -|sydney\ -|\<save .*[0-9]+ *%\ -|\<(secretary|wom[ea]n|girl|nude|teen).*\<strip\ -|sweetheart\ -|\<tax\>\ -|\<teeny?(ie)?s?\>\ -|terrorist\ -|\<trad(e|ing)\ -|tobacco\ -|\<try .* our\>\ -|\<USD? *[$]\ -|\<[$][0-9][0-9.,]*[0-9]\>\ -|\<uncle\>\ -|Unauthorized access.*paypal\ -|u+n+d+e+r+a+g+e\ -|update.*your.*(bank)\ -|\<vegas\ -|\<venture\>\ -|\<v[1i@.,!:;?]a+[:]*g+[:]*r+[:]*a\ -|\<v[^ ]+gra\>\ -|v[i|]+aggar\ -|\<vip\>.*visitor\ -|view +my +profile\ -|wanted you to hear about.*\<new\ -|\<wanna\ -|\<we +specialize\ -|\<weight[ -]+loss\ -|welcome +to +our\ -|\<h[0o]usew[1i]f\ -|\<webcam\ -|\<women acting\ -|\<wom[ae]n.*your.*area\ -|\<your?\>.*\<(benefit|w[io]n|satisf|payment|pri[zc]e|need|loan)\ -|\<your on\ -|\<you're on\ -|\<you search for something\ -|\<your cr[a-z.]* (rating|record)\ -|\<you can be\>.*\<(safe|secure)\ -|\<youth\ -|$jaubeLanguage\ -)" - -# Some regexps cannot be used, because they would easily match legimite mail: -# -# - "your.*address" would match -# Please confirm your XXX Forwarding Address -# - "charm" would match -# works like a charm... -# -# Notes: -# - Regalis, Cialis are viagra drugs - -jaubeSubjectKeywordsOnly="(\ -[?][?]\ -|!!\ -|(\$|USD) *[0-9][0-9.,]\ -|\<(down|king).*size\ -|\<(try|do).*<(it|now|today)\ -|\<(offer|receive).* you\ -|\<(china|korea|usa|europe|australia|r+u+s+i+a|ira[qn]|beijing|iraq)\ -|\<(bush|clinton)\>\ -|\<(tv|she|us|hi|heya?|hiya|hello|win|ink|pics?|yo)\>\ -|\<action\ -|\<advisor\ -|\<aging\>\ -|anytime\ -|anywhere\ -|attractive\ -|\<are you\>\ -|\<ass\>\ -|\<award(ing)?\>\ -|\<back +to\ -|\<be +successful\ -|\<believ\ -|\<belowed\ -|\<bid\ -|\<[bm]illion\ -|\<blowjob\ -|\<bonus\>\ -|\<breath\ -|\<bringing\ -|bulk_mailer\ -|\<busines\ -|\<buy\ -|\<camera\ -|\<candle\ -|\<cds?\>\ -|\<charge\ -|\<che+a+[pt]\>\ -|\<check.*\<out\>\ -|\<child\>\ -|\<ciao\ -|\<cigar\ -|\<cold\ -|\<contact.*\<(bank)\ -|\<coral\ -|\<cost\ -|\<coupon\ -|\<dance\ -|\<dear\>\ -|\<(debt|debs)\>\ -|\<density\ -|\<deserve\ -|\<diet\ -|\<digital\ -|\<discount\ -|\<d[0o]llar\ -|\<don't +be\ -|doesn't.*\<(hurt)\ -|\<dudes?\>\ -|\<dvds?\>\ -|\<dying\ -|\<earn\ -|effortless\ -|eliminate\ -|\<employ\ -|\<enjoy\ -|\<enlarge\ -|\<expedition\ -|find +out\ -|fingering\ -|\<free\>.*(website|download)\ -|\<for\>.*\<you.*(order|self)\ -|\<fortune\ -|\<fountain\ -|\<friend\ -|\<fun\>\ -|\<g[eo]t +some\ -|\<gain\ -|\<g[eo0]t\>.*\<(smart)\ -|\<go.* for\ -|\<gold\ -|good +day\ -|governor\ -|\<got +it\ -|\<gratis\ -|\<guarant\ -|\<health\ -|\<hold +of\ -|\<hope\ -|\<h[0o]use\ -|\<hussy\ -|\<humble\ -|\<instant\ -|\<is your\>\ -|\<judical\ -|\<large\ -|\<life\ -|\<love\ -|\<luck\ -|\<make\>.*\<(her)\ -|\<master\>\ -|\<market\ -|\<mastercard\ -|\<mobile\ -|\<more[!?]\ -|\<movie\ -|\<mp3\ -|\<muscle\ -|\<music\ -|newsletter\ -|\<now!? \ -|\<nurtur\ -|\<oil\>\ -|\<online.*web\ -|\<our\>\ -|\<overnight\ -|\<paid\>\ -|\<pay\>\ -|\<passi[o0]\ -|\<pda\>\ -|\<personal\ -|\<phone\ -|\<photo\ -|\<picture\ -|\<pills?\>\ -|\<premier\ -|\<prescri[pb]\ -|\<pound\ -|president\ -|\<pretty\>\ -|\<prices?\ -|\<propagand\ -|\<reciprocal\ -|\<representative\ -|\<refill\ -|\<sales?\>\ -|\<screensaver\ -|\<see\>.*\<this\>.*(www|web|site|page)\ -|\<sell\>\ -|\<sensati\ -|\<sense\ -|\<she\>.*(happy|try|tried)\ -|\<shop\ -|\<sincer\ -|\<sisters?\>\ -|\<smok(e|ing)?\>\ -|\<solicit\ -|\<spend\>\ -|\<spirit\ -|\<stress\ -|\<stock\ -|\<summer\>\ -|\<super\ -|\<swallow\ -|\<seeking.*assistance\ -|\<target\ -|\<thank +you\ -|\<the +time\ -|\<thin\ -|thousand\ -|\<time +to\ -|\<today\ -|\<toner\ -|\<tons\>\ -|\<travel\ -|\<try\>\ -|\<typing\ -|\<ultimate\ -|\<(university|college) .*(degree|diploma)\ -|\<up +to\ -|\<urgent\ -|\<utmost\ -|\<video\ -|\<visitor\ -|\<wash\ -|\<watch\ -|\<we +ship\ -|\<we need your\ -|\<weather\ -|\<welcome\ -|\<wife\ -|\<wines?\>\ -|\<wish\ -|\<w[oi]n\>\ -|\<wom[ae]n\ -|\<work.*\<for\>\ -|XXX\ -|yellow +page\ -|\<young\ -|$jaubeKeywords\ -)" - -# Restore saved values - -VERBOSE = $jaubeKwdVerboseOld - -dummy="pm-jaube-keywords.rc: TEST Subject keywords" - -:0 -*$ ^Subject:.*\/$jaubeSubjectKeywordsOnly$CHAR* -{ - ERROR = "Header-SubjectKeywords" - ERROR_MATCH = "$MATCH" -} - -dummy = "pm-jaube-keywords.rc: TEST Header From keywords" - -:0 -*$ ^From.*()\/$jaubeKeywords$CHAR* -{ - ERROR_MATCH = "$MATCH" - - :0 - * ERROR ?? ^^^^ - { - ERROR = "Header-FromKeywords" - } - :0 E - { - ERROR = "$ERROR:Header-FromKeywords" - } -} - -dummy = "pm-jaube-keywords.rc: TEST body keywords" - -:0 -*$ B ?? ()\/$jaubeKeywords$CHAR* -{ - ERROR_MATCH = "$MATCH" - - :0 - * ERROR ?? ^^^^ - { - ERROR = "Body-Keywords" - } - :0 E - { - ERROR = "$ERROR:Body-Keywords" - } -} - -:0 -* ! ERROR ?? ^^^^ -{ - ERROR_STATUS = "Bad" - - # strip leading and trailing whitespace. - - :0 - * ERROR_MATCH ?? ^^[$WSPC] - * ERROR_MATCH ?? ()\/[^$WSPC].*[^$WSPC] - { - ERROR_MATCH = "$MATCH" - } - - :0 - * ! JA_UBE_KEYWORD_HEADER ?? ^^^^ - { - jaubeKwdInfo = "$ERROR $ERROR_MATCH" - jaubeKwdHeader = "$ERROR_STATUS $jaubeKwdInfo" - - :0 fw - | ${FORMAIL:-"formail"} \ - -I "$JA_UBE_KEYWORD_HEADER: $jaubeKwdHeader" - } -} - -LINEBUF = $jaubeKwdLinebufOld -dummy = "pm-jaube-keywords.rc: end: $ERROR_STATUS $ERROR" - -# pm-jaube.rc ends here diff --git a/src/procmail/pm-jaube-prg-annoyance-filter.rc b/src/procmail/pm-jaube-prg-annoyance-filter.rc @@ -1,218 +0,0 @@ -# pm-jaube-prg-spamprobe.rc -- Interface to Annoyance Filter program -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Warning -# -# Put all your Unsolicited Bulk Emacil (aka spam) filters towards the -# end of your `~/.procmailrc'. The idea is that valid messages are filed -# first (mailing lists, your work and private mail, bounces) and only -# the uncategorized messages are checked last. -# -# YOU CANNOT USE THIS PROCMAIL SUBROUTINE UNLESS YOU HAVE TRAINED THE -# BAYESIAN PROGRAM FIRST! -# -# To train: -# -# $ mkdir $HOME/.annoyance -# $ DB=$HOME/.annoyance/dict.bin; DB2=$HOME/.annoyance/fdict.bin -# $ annoyance-filter --mail single.msg --prune --write $DB -# $ annoyance-filter --phrasemax 2 \ -# --read $DB \ - --mail dir/to/good/messages \ -# --junk dir/to/bad/messages \ -# --prune --write $DB -# $ annoyance-filter -v --read $DB --prune --fwrite $DB2 -# -# To check message: -# -# $ annoyance-filter --read $DB --test mail.msg -# $ annoyance-filter --fread $DB2 -v --class mail.msg -# -# Overview of features -# -# o Implements interface to -# http://sourceforge.net/projects/annoyancefilter/ project. -# See article "Training Annoyance Filter to combat spam" by -# Corrado Cau at -# http://www.newsforge.com/software/03/10/24/2046238.shtml?tid=74 -# o variable `ERROR' is set if the message was UBE. -# o Results are available by default in header -# `X-Spam-Annoyance-Status'. -# -# Description -# -# There are several Bayesian based statistical analysis programs that -# study the message's tokens and then classify it into two categories: -# good or bad, or if you like, ham and spam. All the Bayesian programs -# are not the same, so if you want to achive magic 99.99% probability -# the only methodology to do that is to chain several programs in -# serially. There is no single program that can solve the UBE detection. -# This procmail subroutine implements call interface to program -# `annoyance-filter', which must already have been installed. -# -# About bouncing message back -# -# The general consensus is, that you should not send bounces. The UBE -# sender is not there, because the address forged. Do not increase -# the network traffic; you will not do any good to anybody by -# bouncing messgas -- you just increase mail traffic even more. -# Instead save the messages to folders and periodically periodically -# check their contents. -# -# Required settings -# -# If `annoyance-filter' program is available, define this variable in your -# `~/.procmailrc'. Use absolute path to make the external shell -# quick; it'll save server load considerably. -# -# JA_UBE_ANNOYANCE_PRG = /usr/bin/spamprobe -# -# If you _do_ _not_ have program installed, do not leave the -# variable lying aroung, because it will keep this subroutine active. -# Calling a non existing program is not a good idea, so it better to -# empty the variable if the program is not available. -# -# Required settings -# -# None. No dependencies to other procmail modules. -# -# Call arguments (variables to set before calling) -# -# o `JA_UBE_ANNOYANCE_PRG', path to the program [required]. -# o `JA_UBE_ANNOYANCE_SPAM_DB', path to the dictionary database -# [required]. E.g. `$HOME/.annoyance/dict.db'. -# o `JA_UBE_ANNOYANCE_SPAM_DB_OPT', type of dictionary to read. -# Default is "--read", but this could be fast dictionary option -# "--fread". -# o `JA_UBE_ANNOYANCE_HEADER', the header name where the results -# are put. If not defined, no header is added. -# Defaults to *X-Spam-Annoyance-Status* -# o `JA_UBE_ANNOYANCE_FORCE', if set to _yes_ then call program no matter -# what. Normally if there already is *X-Spam-Annoyance-Status* header, -# it is assumed that the message has already been checked -# and no new checking is needed. -# -# Return values -# -# o ERROR, is set to the return value of the program. -# -# Usage example -# -# PMSRC = $HOME/procmail # procmail recipe dir -# -# <other checks, mailing lists, work mail etc.> -# -# JA_UBE_ANNOYANCE_PRG = "/usr/bin/nice -n 5 /usr/bin/annoyance-filter" -# JA_UBE_ANNOYANCE_SPAM_DB = $HOME/.annoyance/dict.db -# INCLUDERC = $PMSRC/pm-jaube-prg-spamprobe.rc -# -# # The ERROR will contains word "yes" if message was spam -# -# :0 : -# * ERROR ?? yes -# junk.mbox -# -# File layout -# -# The layout of this file is managed by Emacs packages tinyprocmail.el -# and tinytab.el for the 4 tab text placement. -# See http://freshmeat.net/projects/emacs-tiny-tools/ -# -# Change Log -# -# None - -dummy = " -======================================================================== -pm-jaube-prg-annoyance-filter.rc: init:" - -# ................................................... User variables ... - -# You must define program path, because we don't know -# if it has been installed in this system or not - -JA_UBE_ANNOYANCE_PRG = ${JA_UBE_ANNOYANCE_PRG:-""} - -# There is no default location for the dictionaly file, so these -# variables *must* be set in order to activate this module. - -JA_UBE_ANNOYANCE_SPAM_DB_OPT = ${JA_UBE_ANNOYANCE_SPAM_DB_OPT:-"--read"} -JA_UBE_ANNOYANCE_SPAM_DB = ${JA_UBE_ANNOYANCE_SPAM_DB:-""} - -# The header name with no colon at the end. If this variable -# is empty, then external formail call is saved - results can still -# be checked from variable ERROR. There is no trailing colon in this -# variable. - -JA_UBE_ANNOYANCE_HEADER = ${JA_UBE_ANNOYANCE_HEADER:-"\ -X-Spam-Annoyance-"} - -# Should we check even if there already was header -# JA_UBE_ANNOYANCE_HEADER - -JA_UBE_ANNOYANCE_FORCE = ${JA_UBE_ANNOYANCE_FORCE:-"no"} - -# ............................................................ do it ... - -ERROR # Kill variable - -:0 -* JA_UBE_ANNOYANCE_PRG ?? [a-z] -* JA_UBE_ANNOYANCE_SPAM_DB ?? [a-z] -*$ ! 9876543210^0 ^$JA_UBE_ANNOYANCE_HEADER -* 9876543210^0 JA_UBE_ANNOYANCE_FORCE ?? yes -{ - # Will return headers like: - # - # X-Annoyance-Filter-Junk-Probability: 0 - # X-Annoyance-Filter-Classification: Mail - - :0 w : spamannoyance$LOCKEXT - jaubeAnnoyanceData=|$JA_UBE_ANNOYANCE_PRG \ - $JA_UBE_ANNOYANCE_SPAM_DB_OPT \ - $JA_UBE_ANNOYANCE_SPAM_DB \ - --transcript - --test - - - :0 - * jaubeAnnoyanceData ?? ^X-Annoyance-Filter-Junk-Probability: \/.+ - { - jaubeAnnoyanceScore = $MATCH - - :0 - * jaubeAnnoyanceData ?? ^X-Annoyance-Filter-Classification: \/.+ - { - jaubeAnnoyanceType = $MATCH - - :0 - * jaubeAnnoyanceType ?? Junk - { - ERROR = "yes" - } - } - - :0 fw - * ! JA_UBE_ANNOYANCE_HEADER ?? ^^^^ - | ${FORMAIL:-formail} \ - -I "${JA_UBE_ANNOYANCE_HEADER}Status: ${ERROR:-no}" \ - -I "${JA_UBE_ANNOYANCE_HEADER}Classification: $jaubeAnnoyanceType" \ - -I "${JA_UBE_ANNOYANCE_HEADER}Probability: $jaubeAnnoyanceScore" - } -} - -dummy = "pm-jaube-prg-annoyance-filter.rc: end: $ERROR" - -# End of file diff --git a/src/procmail/pm-jaube-prg-bmf.rc b/src/procmail/pm-jaube-prg-bmf.rc @@ -1,283 +0,0 @@ -# pm-jaube-prg-bmf.rc -- Interface to Bayesian Mail Filter program -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Warning -# -# Put all your Unsolicited Bulk Emacil (aka spam) filters towards the -# end of your `~/.procmailrc'. The idea is that valid messages -# are filed first (mailing lists, your work and private mail, -# bounces) and only the uncategorized messages are checked last. -# -# YOU CANNOT USE THIS PROCMAIL SUBROUTINE UNLESS YOU HAVE TRAINED THE -# BAYESIAN PROGRAM FIRST! -# -# To train: -# -# $ ls spam/*.mail | xargs -n 1 bmf -s # feed individual messages -# $ ls good/*.mail | xargs -n 1 bmf -n # feed individual messages -# -# To test -# -# $ bmf -p < test.mail | less -# -# Overview of features -# -# o Implements interface to http://www.sf.net/projects/bmf -# "Bayesian Mail Filter" project. The called binary is "bmf" -# hence the name of this subroutine. Bmf program uses well -# know statistical analysis which is much more reliable than -# any hand made procmail scripts could ever achieve. -# o Variable `ERROR' is set if the message was UBE. -# o Results are available in headers `X-Spam-bmf-Status' and -# `X-Spam-bmf-Flag' for further analysis. -# -# Description -# -# There are several bayesian based statistical analysis programs that -# study the message's tokens and then classify it into two categories: -# good or bad, or if you like, ham and spam. All the Bayesian programs -# are not the same, so if you want to achive magic 99.99% probability -# the only methodology to do that is to chain several programs in -# serially. There is no single program that can solve the -# UBE detection. -# -# For serious discussion of strenghts of the different programs, -# refer to a very good article "Spam Filters" by Sam Holden at -# 2004-08-16 <http://freshmeat.net/articles/view/964>. The -# article evaluated throughly following programs: -# -# o Bayesian Mail Filter (bayesian) -# o Bogofilter (bayesian) -# o dbacl (bayesian; multiple wordlists) -# o Quick Spam Filter (bayesian) -# o SpamAssassin (perl matching + bayesian) -# o SpamProbe (bayesian) -# o SPASTIC (procmail recipes) -# -# This subroutine implements call interface to `bmf' program. Why -# whould you need it? Because unfortunately `bmf' by default -# use exactly the same headers as spamasassin and the two cannot -# co-operate together: bmf would overwrite existing -# spamassasin headers. This subroutine takes care of saving -# previous headers and move `bmf' results to their own -# `X-Spam-bmf-*' headers. -# -# About bouncing message back -# -# The general consensus is, that you should not send bounces. -# The UBE sender is not there, because the address forged. Do -# not increase the network traffic; you will not do any good to -# anybody by bouncing messgas -- you just increase mail traffic -# even more. Instead save the messages to folders and -# periodically periodically check their contents. -# -# Required settings -# -# If `bmf' program is available, define this variable in your -# `~/.procmailrc'. Use absolute path to make the external shell -# quick; it'll save server load considerably. -# -# JA_UBE_BMF_PRG = "/usr/bin/bmf" -# -# If you _do_ _not_ have program installed, do not leave the -# variable lying aroung, because it will keep this subroutine active. -# Calling a non existing program is not a good idea, so it better to -# empty the variable if the program is not available. -# -# Required settings -# -# None. No dependencies to other procmail modules. -# -# Call arguments (variables to set before calling) -# -# o JA_UBE_BMF_PRG, path to program -# o JA_UBE_BMF_HEADER_PREFIX, the header name where the results -# are put. If not defined, no headers are added. Default -# value is `X-Spam-bmf'. -# o JA_UBE_BMF_FORCE, if set to _yes_ then call program no matter -# what. Normally if there already are `X-Spam-bmf-*' headers, -# it is assumed that the message has already been checked -# and no new checking is needed. -# -# Return values -# -# o ERROR, is set to short ube trigger recipe reason. Contains -# content of `X-Spam-bmf-Status' header which you can check -# for values -# o ERROR_MATCH contains detailed content of -# `X-Spam-bmf-Status' header. -# -# If headers were enabled, they will contain: -# -# X-Spam-bmf-Status: Yes, hits=1.000000 required=0.900000, tests=bmf -# X-Spam-bmf-Flag: YES -# -# Usage example -# -# PMSRC = $HOME/procmail # procmail recipe dir -# -# <other checks, mailing lists, work mail etc.> -# -# JA_UBE_BMF_PRG = "/usr/bin/nice -n 5 /usr/bin/bmf" -# INCLUDERC = $PMSRC/pm-jaube-prg-bmf.rc -# -# # The ERROR will contains word "yes" if it program classified -# # the message into "bad" category. -# -# :0 : -# * ERROR ?? yes -# junk.mbox -# -# File layout -# -# The layout of this file is managed by Emacs packages tinyprocmail.el -# and tinytab.el for the 4 tab text placement. -# See project http://freshmeat.net/projects/emacs-tiny-tools/ -# -# Change Log -# -# None - -dummy = " -======================================================================== -pm-jaube-prg-bmf.rc: init:" - -# ................................................... User variables ... - -# You must define program path, because we don't know -# if it has been installed in this system or not - -JA_UBE_BMF_PRG = ${JA_UBE_BMF_PRG:-""} -JA_UBE_BMF_PRG_OPT = ${JA_UBE_BMF_PRG_OPT:-"-p"} - -# The header name prefix with no colon at the end. If this variable -# is empty, then `formail' is not called and no headers are added to -# the message. This saves a shell call and will make this repice a -# bit faster. The return status can still be checked from variable -# ERROR - -JA_UBE_BMF_HEADER_PREFIX = ${JA_UBE_BMF_HEADER_PREFIX:-"X-Spam-Bmf-"} - -# Should we run the check even if there aready were header -# JA_UBE_BMF_HEADER_PREFIX? Setting to 'yes' might mean: -# -# o We suspect that someone else had added the header, so don't -# trust it but generate our own -# o We don't trust the local MDA's result (if it had invoked -# bmf for us), because we want' to run the message -# through our own trained database -# o Or, we're simply testing and have several INCLUDERC=$RC_UBE_BMF -# calls in our ~/.procmailrc to find out what location would be the -# best (beginning, middle, last) by examining the procmail LOGFILE. - -JA_UBE_BMF_FORCE = ${JA_UBE_BMF_FORCE:-"no"} - -# ............................................................ do it ... - -ERROR # Kill variable - -# The condition below reads: -# - Require that variable is defined (contains path to 'bmf' program) -# - Run immediately: if there is no X-spambmf header -# - OR Run immediately: (even if there were headers) forced evaluation - -:0 -* JA_UBE_BMF_PRG ?? [a-z] -*$ 9876543210^0 ! ^$JA_UBE_BMF_HEADER_PREFIX -* 9876543210^0 ! JA_UBE_BMF_FORCE ?? yes -{ - - # Unfortunately bmf inserts same headers as Spamassassin (SA), so - # we must first save previous SA values. Kill variables first - # - # Note: the initial value is set here to header name, so that if - # there is no previous SA headers, they will be left empty. This - # works fine, because e.g. "formail -I X-Name:" does nothing when - # message does not include "X-Name:" header. - - dummy = "pm-jaube-prg-bmf.rc: saving previous X-Spam-* headers" - - jaubeBmfSaStatus = "X-Spam-Status:" - jaubeBmfSaFlag = "X-Spam-Flag:" - - :0 - * ^\/X-Spam-Status:.* - * ! ^\/X-Spam-Status:.*tests=bmf - { - jaubeBmfSaStatus = $MATCH - - :0 - * ^\/X-Spam-Flag:.* - { - jaubeBmfSaFlag = $MATCH - } - } - - # Now run the filter with -p "pass through". - - jaubeBmfStatus - jaubeBmfFlag - - :0 fw : bmf$LOCKEXT - | $JA_UBE_BMF_PRG ${JA_UBE_BMF_PRG_OPT} - - # After previous call, there should be these headers. It is unfortunate, - # that "tests=bmf" is not included with "No" case - # - # X-Spam-Status: No, hits=0.000000 required=0.900000 - # X-Spam-Status: Yes, hits=1.000000 required=0.900000, tests=bmf - # X-Spam-Flag: YES - - :0 a - * ^X-Spam-Status: \/.+ - { - - :0 - * ^X-Spam-Status: \/.+tests=bmf - { - ERROR = $MATCH - } - - jaubeBmfStatus = "${JA_UBE_BMF_HEADER_PREFIX}Status: $MATCH" - jaubeBmfFlag = "${JA_UBE_BMF_HEADER_PREFIX}Flag:" # Initial value - - :0 - * ^X-Spam-Flag: \/.* - { - jaubeBmfFlag = "$jaubeBmfFlag $MATCH" - } - - dummy = "pm-jaube-prg-bmf.rc: restore X-Spam-* / add X-Spam-Bmf headers" - - # Rearrange headers nicely and put back all Spamassassin values - - :0 fhw - * ! jaubeBmfSaStatus ?? ^^^^ - * ! jaubeBmfSaFlag ?? ^^^^ - * ! jaubeBmfStatus ?? ^^^^ - * ! jaubeBmfFlag ?? ^^^^ - | ${FORMAIL:-formail} \ - -I "$jaubeBmfSaStatus" \ - -I "$jaubeBmfSaFlag" \ - -I "$jaubeBmfStatus" \ - -I "$jaubeBmfFlag" - } -} - -dummy = "pm-jaube-prg-bmf.rc: end: $ERROR" - -# pm-jaube-prg-bmf.rc ends here diff --git a/src/procmail/pm-jaube-prg-bogofilter.rc b/src/procmail/pm-jaube-prg-bogofilter.rc @@ -1,219 +0,0 @@ -# pm-jaube-prg-bogofilter -- Interface to bogofilter program -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Warning -# -# Put all your Unsolicited Bulk Emacil (aka spam) filters towards the -# end of your `~/.procmailrc'. The idea is that valid messages are filed -# first (mailing lists, your work and private mail, bounces) and only -# the uncategorized messages are checked last. -# -# YOU CANNOT USE THIS PROCMAIL SUBROUTINE UNLESS YOU HAVE TRAINED THE -# BAYESIAN PROGRAM FIRST! -# -# To train: -# -# $ rm -f ~/.bogofilter/*.db # delete database -# $ bogofilter -B -n good.msg ... -# $ bogofilter -B -s spam.msg ... -# -# Overview of features -# -# o Implements interface to http://www.sf.net/projects/bogofilter -# project. -# o variable `ERROR' is set if message was likely spam. -# o Results are available by default in header -# `X-Spam-Bogofilter-Status'. -# -# Description -# -# There are several Bayesian based statistical analysis programs that -# study the message's tokens and then classify it into two categories: -# good or bad, or if you like, ham and spam. All the Bayesian programs -# are not the same, so if you want to achive magic 99.99% probability -# the only methodology to do that is to chain several programs in -# serially. There is no single program that can solve the UBE detection. -# This procmail subroutine implements call interface to program -# `bogofilter', which must already have been installed. -# -# About bouncing message back -# -# The general consensus is, that you should not send bounces. The UBE -# sender is not there, because the address forged. Do not increase -# the network traffic; you will not do any good to anybody by -# bouncing messgas -- you just increase mail traffic even more. -# Instead save the messages to folders and periodically periodically -# check their contents. -# -# Required settings -# -# If `bogofilter' program is available, define this variable in your -# `~/.procmailrc'. Use absolute path to make the external shell -# quick; it'll save server load considerably. -# -# JA_UBE_BOGOFILTER_PRG = /usr/bin/bogofilter -# -# If you _do_ _not_ have program installed, do not leave the -# variable lying aroung, because it will keep this subroutine active. -# Calling a non existing program is not a good idea, so it better to -# empty the variable if the program is not available. -# -# Required settings -# -# None. No dependencies to other procmail modules. -# -# Call arguments (variables to set before calling) -# -# o JA_UBE_BOGOFILTER_PRG, path to the program -# o JA_UBE_BOGOFILTER_HEADER_NEW, the header name where the results -# are put. If not defined, no header is added. -# Defaults to `X-Spam-Bogofilter-Status' -# o JA_UBE_BOGOFILTER_FORCE, if set to _yes_ then call program no matter -# what. Normally if there already is `X-Spam-*' header, -# it is assumed that the message has already been checked -# and no new checking is needed. -# -# Return values -# -# o ERROR, is set to the return value of program if message was spam. -# o ERROR_INFO, is set if case is "unsure". -# -# Usage example -# -# PMSRC = $HOME/procmail # procmail recipe dir -# -# <other checks, mailing lists, work mail etc.> -# -# JA_UBE_BOGOFILTER_PRG = "/usr/bin/nice -n 5 /usr/bin/bogogilter" -# INCLUDERC = $PMSRC/pm-jaube-prg-bogofilter.rc -# -# # The ERROR will contains reason if program classified -# # the message into "bad" category. -# -# :0 : -# * ! ERROR ?? ^^^^ -# junk.mbox -# -# File layout -# -# The layout of this file is managed by Emacs packages tinyprocmail.el -# and tinytab.el for the 4 tab text placement. -# See project http://freshmeat.net/projects/emacs-tiny-tools/ -# -# Change Log -# -# None - -dummy = " -======================================================================== -pm-jaube-prg-bogofilter.rc: init:" - -# ................................................... User variables ... - -# You must define program path, because we don't know -# if it has been installed in this system or not - -JA_UBE_BOGOFILTER_PRG = ${JA_UBE_BOGOFILTER_PRG:-""} -JA_UBE_BOGOFILTER_OPT = ${$JA_UBE_BOGOFILTER_OPT:-""} - -# No user options cannot be passed, because the output would -# change. This variable is not used. -# JA_UBE_BOGOFILTER_PRG_OPT = ${JA_UBE_BOGOFILTER_PRG_OPT:-""} - -# The original header name. - -JA_UBE_BOGOFILTER_HEADER_ORIGINAL = ${JA_UBE_BOGOFILTER_HEADER_ORIGINAL:-"\ -X-Bogosity"} - -# The header name with no colon at the end. If this variable -# is empty, then external formail call is saved - results can still -# be checked from variable ERROR. - -JA_UBE_BOGOFILTER_HEADER_NEW = ${JA_UBE_BOGOFILTER_HEADER:-\ -"X-Spam-bogofilter-Status"} - -# Should we check even if there already was already header -# 'JA_UBE_BOGOFILTER_HEADER' ? - -JA_UBE_BOGOFILTER_FORCE = ${JA_UBE_BOGOFILTER_FORCE:-"no"} - -# ............................................................ do it ... - -ERROR # Kill variables -ERROR_INFO - -:0 -* JA_UBE_BOGOFILTER_PRG ?? [a-z] -*$ ! 9876543210^0 ^$JA_UBE_BOGOFILTER_HEADER_NEW -* 9876543210^0 JA_UBE_BOGOFILTER_FORCE ?? yes -{ - # This call will add header. Notice that newer version output - # "Ham" instead of "No" - # - # X-Bogosity: No, tests=bogofilter, spamicity=0.000111, version=0.92.5 - # X-Bogosity: Ham, tests=bogofilter, spamicity=0.004063, version=0.93.2 - # X-Bogosity: Unsure, tests=bogofilter, spamicity=0.499327, version=0.92.5 - # X-Bogosity: Yes, tests=bogofilter, spamicity=1.000000, version=0.92.5 - - jaubeBogoHdr # Kill variable - - :0 - * ! JA_UBE_BOGOFILTER_HEADER_NEW ?? ^^^^ - { - jaubeBogoHdr = $JA_UBE_BOGOFILTER_HEADER_NEW - - # -e = Exit with code 0 if message is ham/unsure. - # -p = Pass through - - :0 fhbw # : bogofilter$LOCKEXT - | $JA_UBE_BOGOFILTER_PRG \ - -e \ - -p \ - --spam-header-name="$JA_UBE_BOGOFILTER_HEADER_NEW" \ - $JA_UBE_BOGOFILTER_OPT - } - :0 E - { - jaubeBogoHdr = $JA_UBE_BOGOFILTER_HEADER_ORIGINAL - - :0 fhbw : bogofilter$LOCKEXT - | $JA_UBE_BOGOFILTER_PRG -e -p $JA_UBE_BOGOFILTER_OPT - } - - # Bogofilter returns three status messages: Yes, Unsure, No|Ham - # Save the value for user to check - - :0 - *$ ^$jaubeBogoHdr: \/yes.* - { - ERROR = "bogofilter; $MATCH" - } - :0 E - *$ ^$jaubeBogoHdr: \/unsure.* - { - ERROR_INFO = "bogofilter; $MATCH" - } - :0 E - *$ ^$jaubeBogoHdr: \/.+ - { - # Do nothing. Just record bogofilter response to log file - } -} - -dummy = "pm-jaube-prg-bogofilter.rc: end: $ERROR" - -# End of file diff --git a/src/procmail/pm-jaube-prg-bsfilter.rc b/src/procmail/pm-jaube-prg-bsfilter.rc @@ -1,214 +0,0 @@ -# pm-jaube-prg-bsfilter.rc -- Interface to Bsfilter program -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Warning -# -# Put all your Unsolicited Bulk Emacil (aka spam) filters towards the -# end of your `~/.procmailrc'. The idea is that valid messages are filed -# first (mailing lists, your work and private mail, bounces) and only -# the uncategorized messages are checked last. -# -# YOU CANNOT USE THIS PROCMAIL SUBROUTINE UNLESS YOU HAVE TRAINED THE -# BAYESIAN PROGRAM FIRST! -# -# To train: -# -# $ bsfilter --add-clean good.msg ... -# $ bsfilter --add-spam spam.msg ... -# -# Overview of features -# -# o Implements interface to project -# http://packages.debian.org/testing/mail/bsfilter -# o variable `ERROR' is set if the message was UBE. -# o Results are available by default in header -# `X-Spam-Bsfilter-Status'. -# -# Description -# -# There are several Bayesian based statistical analysis programs that -# study the message's tokens and then classify it into two categories: -# good or bad, or if you like, ham and spam. All the Bayesian programs -# are not the same, so if you want to achive magic 99.99% probability -# the only methodology to do that is to chain several programs in -# serially. There is no single program that can solve the UBE detection. -# This procmail subroutine implements call interface to program -# `bsfilter', which must already have been installed. -# -# About bouncing message back -# -# The general consensus is, that you should not send bounces. The UBE -# sender is not there, because the address forged. Do not increase -# the network traffic; you will not do any good to anybody by -# bouncing messgas -- you just increase mail traffic even more. -# Instead save the messages to folders and periodically periodically -# check their contents. -# -# Required settings -# -# If `bsfilter' program is available, define this variable in your -# `~/.procmailrc'. Use absolute path to make the external shell -# quick; it'll save server load considerably. -# -# JA_UBE_BSFILTER_PRG = /usr/bin/bsfilter -# -# If you _do_ _not_ have program installed, do not leave the -# variable lying aroung, because it will keep this subroutine active. -# Calling a non existing program is not a good idea, so it better to -# empty the variable if the program is not available. -# -# Required settings -# -# None. No dependencies to other procmail modules. -# -# Call arguments (variables to set before calling) -# -# o `JA_UBE_BSFILTER_PRG', path to the program. -# o `JA_UBE_BSFILTER_HEADER', the header prefix name where the results -# are put. If not defined, no header is added. -# Defaults to *X-Spam-Bsfilter-* -# o `JA_UBE_BSFILTER_FORCE', if set to _yes_ then call program no matter -# what. Normally if there already is *X-Spam-Bsfilter-* header, -# it is assumed that the message has already been checked -# and no new checking is needed. -# -# Return values -# -# o `ERROR', is set to the return value of `bsfilter' program. -# -# Usage example -# -# PMSRC = $HOME/procmail # procmail recipe dir -# -# <other checks, mailing lists, work mail etc.> -# -# JA_UBE_BSFILTER_PRG = "/usr/bin/nice -n 5 /usr/bin/bsfilter" -# INCLUDERC = $PMSRC/pm-jaube-prg-bsfilter.rc -# -# # The ERROR will contains word "yes" if message was spam -# -# :0 : -# * ERROR ?? yes -# junk.mbox -# -# File layout -# -# The layout of this file is managed by Emacs packages tinyprocmail.el -# and tinytab.el for the 4 tab text placement. -# See project http://freshmeat.net/projects/emacs-tiny-tools/ -# -# Change Log -# -# None - -dummy = " -======================================================================== -pm-jaube-prg-bsfilter.rc: init:" - -# ................................................... User variables ... - -# You must define program path, because we don't know -# if it has been installed in this system or not - -JA_UBE_BSFILTER_PRG = ${JA_UBE_BSFILTER_PRG:-""} - -# You could use "--update" if database is well trained. - -JA_UBE_BSFILTER_PRG_OPT = ${JA_UBE_BSFILTER_PRG_OPT:-""} - -# The header prefix name. If this variable is empty, then external -# formail call is saved - results can still be checked from variable -# ERROR. - -JA_UBE_BSFILTER_HEADER = ${JA_UBE_BSFILTER_HEADER:-"\ -X-Spam-Bsfilter-"} - -# Should we check even if there already was header -# JA_UBE_BSFILTER_HEADER - -JA_UBE_BSFILTER_FORCE = ${JA_UBE_BSFILTER_FORCE:-"no"} - -# ............................................................ do it ... - -ERROR # Kill variable - -:0 -* JA_UBE_BSFILTER_PRG ?? [a-z] -*$ ! 9876543210^0 ^$JA_UBE_BSFILTER_HEADER -* 9876543210^0 JA_UBE_BSFILTER_FORCE ?? yes -{ - # bsfilter uses same headers as spamassassin, so we must - # read the results separately. - - :0 w : bsfilter$LOCKEXT - jaubeBsfilterData=|$JA_UBE_BSFILTER_PRG \ - --pipe \ - --insert-revision \ - --insert-flag \ - --insert-probability \ - $BSFILTER_OPT - - # X-Spam-Revision: bsfilter release 1.0.4 revision 1.63 - # X-Spam-Flag: No - # X-Spam-Probability: 0.906504 - - jaubeBsfilterVer # Kill variables - jaubeBsfilterFlag - jaubeBsfilterStatus - - :0 - * jaubeBsfilterData ?? X-Spam-Revision: \/.*bsfilter - { - jaubeBsfilterVer = $MATCH - - :0 - * jaubeBsfilterData ?? X-Spam-Flag: \/.+ - { - jaubeBsfilterFlag = $MATCH - } - - :0 - * jaubeBsfilterData ?? X-Spam-Probability: \/.+ - { - jaubeBsfilterStatus = $MATCH - } - - :0 - * jaubeBsfilterFlag ?? yes - { - ERROR = "yes" - - :0 - * ! jaubeBsfilterStatus ?? ^^^^ - { - ERROR = "$ERROR $jaubeBsfilterStatus" - } - } - } - - :0 fw - * ! JA_UBE_BSFILTER_HEADER ?? ^^^^ - * ! jaubeBsfilterFlag ?? ^^^^ - | ${FORMAIL:-formail} \ - -I "${JA_UBE_BSFILTER_HEADER}Flag: $jaubeBsfilterFlag" \ - -I "${JA_UBE_BSFILTER_HEADER}Status: $jaubeBsfilterStatus" \ - -I "${JA_UBE_BSFILTER_HEADER}Version: $jaubeBsfilterVer" -} - -dummy = "pm-jaube-prg-bsfilter.rc: end: $ERROR" - -# End of file diff --git a/src/procmail/pm-jaube-prg-ifile.rc b/src/procmail/pm-jaube-prg-ifile.rc @@ -1,183 +0,0 @@ -# pm-jaube-prg-ifile -- Interface to ifile program -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Warning -# -# Put all your Unsolicited Bulk Emacil (aka spam) filters towards the -# end of your `~/.procmailrc'. The idea is that valid messages are filed -# first (mailing lists, your work and private mail, bounces) and only -# the uncategorized messages are checked last. -# -# YOU CANNOT USE THIS PROCMAIL SUBROUTINE UNLESS YOU HAVE TRAINED THE -# BAYESIAN PROGRAM FIRST! -# -# To train: -# -# $ rm ~/.idata # delete database -# $ echo herbalife | ifile -i spam # initialize database -# $ ifile -h -i good good.msg ... -# $ ifile -h -i spam spam.msg ... -# -# Overview of features -# -# o Implements interface to http://freshmeat.net/projects/ifile -# project. -# o variable `ERROR' is set to the result of ifile check. This -# usually holds the "folder" name the ifile was trained at the -# time. E.g. if the folder used for training Unsolicited Bulk -# Email was "ifile -i spam", then the return value is "spam". -# o Results are available by default in header `X-Spamifile'. -# -# Description -# -# There are several Bayesian based statistical analysis programs that -# study the message's tokens and then classify it into two categories: -# good or bad, or if you like, ham and spam. All the Bayesian programs -# are not the same, so if you want to achive magic 99.99% probability -# the only methodology to do that is to chain several programs in -# serially. There is no single program that can solve the UBE detection. -# This procmail subroutine implements call interface to program -# `ifile', which must already have been installed. -# -# About bouncing message back -# -# The general consensus is, that you should not send bounces. The UBE -# sender is not there, because the address forged. Do not increase -# the network traffic; you will not do any good to anybody by -# bouncing messgas -- you just increase mail traffic even more. -# Instead save the messages to folders and periodically periodically -# check their contents. -# -# Required settings -# -# If `ifile' program is available, define this variable in your -# `~/.procmailrc'. Use absolute path to make the external shell -# quick; it'll save server load considerably. -# -# JA_UBE_IFILE_PRG = /usr/bin/ifile -# -# If you _do_ _not_ have program installed, do not leave the -# variable lying aroung, because it will keep this subroutine active. -# Calling a non existing program is not a good idea, so it better to -# empty the variable if the program is not available. -# -# Required settings -# -# None. No dependencies to other procmail modules. -# -# Call arguments (variables to set before calling) -# -# o JA_UBE_IFILE_PRG, path to the program -# o JA_UBE_IFILE_HEADER, the header name where the results -# are put. If not defined, no header is added. -# Defaults to `X-Spam-Ifile-Status' -# o JA_UBE_IFILE_FORCE, if set to _yes_ then call program no matter -# what. Normally if there already is header, -# it is assumed that the message has already been checked -# and no new checking is needed. -# -# Return values -# -# o ERROR, is set to the return value of `ifile' program. -# -# If header output is enabled, it will contain the folder name -# `ifile' thinks the message belongs to. Assuming that trained -# folders used for messages were *spam* and *good*, then the headers -# read: -# -# X-Spam-Ifile-Status: spam -# X-Spam-Ifile-Status: good -# -# Usage example -# -# PMSRC = $HOME/procmail # procmail recipe dir -# -# <other checks, mailing lists, work mail etc.> -# -# JA_UBE_IFILE_PRG = "/usr/bin/nice -n 5 /usr/bin/ifile" -# INCLUDERC = $PMSRC/pm-jaube-prg-ifile.rc -# -# # The ERROR will contains reason if program classified -# # the message into "bad" category. -# -# :0 : -# * ! ERROR ?? ^^^^ -# junk.mbox -# -# File layout -# -# The layout of this file is managed by Emacs packages tinyprocmail.el -# and tinytab.el for the 4 tab text placement. -# See project http://freshmeat.net/projects/emacs-tiny-tools/ -# -# Change Log -# -# None - -dummy = " -======================================================================== -pm-jaube-prg-ifile.rc: init:" - -# ................................................... User variables ... - -# You must define program path, because we don't know -# if it has been installed in this system or not - -JA_UBE_IFILE_PRG = ${JA_UBE_IFILE_PRG:-""} - -# No user options cannot be passed to ifile, because the output would -# change. This variable is not used. -# JA_UBE_IFILE_PRG_OPT = ${JA_UBE_IFILE_PRG_OPT:-""} - -# The header name with no colon at the end. If this variable -# is empty, then external formail call is saved - results can still -# be checked from variable ERROR. - -JA_UBE_IFILE_HEADER = ${JA_UBE_IFILE_HEADER:-\ -"X-Spam-Ifile-Status"} - -# Should we check even if there already was header -# JA_UBE_IFILE_HEADER ? - -JA_UBE_IFILE_FORCE = ${JA_UBE_IFILE_FORCE:-"no"} - -# ............................................................ do it ... - -ERROR # Kill variable - -:0 -* JA_UBE_IFILE_PRG ?? [a-z] -*$ ! 9876543210^0 ^$JA_UBE_IFILE_HEADER -* 9876543210^0 JA_UBE_IFILE_FORCE ?? yes -{ - :0 w : ifile$LOCKEXT - jaubeIfileFolder=|$JA_UBE_IFILE_PRG --strip-header --query --concise - - :0 - * ! jaubeIfileFolder ?? ^^^^ - { - ERROR = $jaubeIfileFolder - - :0 fhw - * ! JA_UBE_IFILE_HEADER ?? ^^^^ - | ${FORMAIL:-formail} -I "$JA_UBE_IFILE_HEADER: $jaubeIfileFolder" - } -} - -dummy = "pm-jaube-prg-ifile.rc: end: $ERROR" - -# End of file diff --git a/src/procmail/pm-jaube-prg-runall.rc b/src/procmail/pm-jaube-prg-runall.rc @@ -1,280 +0,0 @@ -# pm-jaube-prg-runall.rc -- Interface to all Bayesian filter programs -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Overview of features -# -# o To detect spam reliably, run all Bayesian programs one by one -# to see if any of them classifies the message as spam. -# o Programs supported: bogofilter, spamprobe, Bayesian Mail -# Filter, Annoyance Filter, Bsfilter, Spamoracle and Spamassassin. -# -# Description -# -# There are several bayesian based statistical analysis programs that -# study the message's tokens and then classify it into two categories: -# good or bad, or if you like, ham and spam. This module is a -# _meta_ _package_ which will call all other individual modules -# that interface to these Bayesian programs. The use is simple: define -# programs that are available in your system and which you have -# trained (Bayesian programs need to be trained before use), and this -# this module will query how those programs would classify the message. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include -# -# o pm-javar.rc -# o pm-jaube-prg-spamprobe.rc -# o pm-jaube-prg-spamoracle.rc -# o pm-jaube-prg-annoyance-filter.rc -# o pm-jaube-prg-bsfilter.rc -# o pm-jaube-prg-bmf.rc -# -# Call arguments (variables to set before calling) -# -# To activate Bayesian program(s), define path to them. Default -# value for all these variables is "" i.e. is is supposed that -# no programs have been installed or trained. -# -# o `JA_UBE_BOGOFILTER_PRG', path to *bogofilter* program. -# o `JA_UBE_SPAMPROBE_PRG', Path to *spamprobe* program -# o `JA_UBE_BMF_PRG', Path to Bayesian Mail Filter *bmf* program. -# o `JA_UBE_SPAMASSASSIN_PRG', path to *spamassassin* program. -# If daemon version is available, set this to *spamc* program. -# o `JA_UBE_SPAMORACLE_PRG', path to *spamoracle* program. -# o `JA_UBE_ANNOYANCE_PRG', path to *annoyance-filter* program. -# You must also set `JA_UBE_ANNOYANCE_SPAM_DB' to fast -# dictionary database location. -# o `JA_UBE_BSFILTER_PRG', path to *bsfilter* program. -# -# Optional variables to set: -# -# o `JA_UBE_BOGOFILTER_OPT'. Default is "-p" passthrough. -# Option "-e" will report exit code to procmail. -# o `JA_UBE_SPAMASSASSIN_OPT'. Default is "". -# o `JA_UBE_SPAMASSASSIN_MAX_SIZE'. Default is 256000 (256k). -# Spamassassin is a Perl program, which is slow at startup, -# so checking e.g. long attachements consumes lot of resources. -# Keep this value relatively small. -# -# Important notes -# -# All headers are canonicalized to *X-Spam-<PROGRAM>-* so e.g. -# in bogofilter's case, the default *X-Bogocity* header is -# changed to value *X-Spam-Bogofilter-Status* and so on. -# Summaries like below can then be generated: -# -# $ egrep -i '(Subject|From|^X-Spam.*Status)' *.mbox -# -# Return values -# -# o `ERROR' variable's first word is set to program that classified -# the spam: *bogofilter*, *bmf* (Bayesian Mail Filter), -# *spamassassin* etc. It is followed by semicolon ";" and -# detailed return status from the program. -# o `ERROR_INFO' is set only in bogofilter's case if it thinks -# the message is neither spam nor ham ("Unsure"). -# -# Usage example -# -# PMSRC = $HOME/procmail # procmail recipe dir -# -# # ... other checks, mailing lists, work mail etc. -# -# # bogofilter and Bayesian Mail Filter available and trained. Use them. -# -# JA_UBE_BOGOFILTER_PRG = "/bin/nice -n 5 /bin/bogofilter" -# JA_UBE_BMF_PRG = "/bin/nice -n 5 /bin/bmf" -# -# # Call the "umbrella" module, which will take care of -# # all the details. -# -# INCLUDERC = $PMSRC/pm-jaube-prg-runall.rc -# -# # ERROR is set if message was spam. The "()\/" logs reason. -# -# :0 : -# * ERROR ?? ^()\/.+ -# junk.mbox -# -# File layout -# -# The layout of this file is managed by Emacs packages tinyprocmail.el -# and tinytab.el for the 4 tab text placement. -# See project http://freshmeat.net/projects/emacs-tiny-tools/ -# -# Change Log -# -# None - -dummy = " -======================================================================== -pm-jaube-prg-runall.rc: init:" - -# Kill variables - -ERROR -ERROR_INFO - -dummy = "pm-jaube-prg-runall: Run Bogofilter" - -:0 -* ERROR ?? ^^^^ -* JA_UBE_BOGOFILTER_PRG ?? [a-z] -{ - INCLUDERC = $RC_UBE_BOGOFILTER - - :0 - * ERROR ?? ^()\/spam.* - { - ERROR = "bogofilter; $MATCH" - } - - :0 E - { - ERROR # Kill variable - } -} - -dummy = "pm-jaube-prg-runall: Run Spamprobe" - -:0 -* ERROR ?? ^^^^ -* JA_UBE_SPAMPROBE_PRG ?? [a-z] -{ - INCLUDERC = $RC_UBE_SPAMPROBE - - :0 - * ERROR ?? ^()\/spam.* - { - ERROR = "spamprobe; $MATCH" - } - - :0 E - { - ERROR - } -} - -dummy = "pm-jaube-prg-runall: Run Annoyance filter" - -:0 -* ERROR ?? ^^^^ -* JA_UBE_ANNOYANCE_PRG ?? [a-z] -{ - INCLUDERC = $RC_UBE_ANNOYANCE - - :0 - * ERROR ?? yes - { - ERROR = "annoyance-filter; $MATCH" - } - - :0 E - { - ERROR - } -} - -dummy = "pm-jaube-prg-runall: Run Bayesian Mail Filter" - -:0 -* ERROR ?? ^^^^ -* JA_UBE_BMF_PRG ?? [a-z] -{ - INCLUDERC = $RC_UBE_BMF - - :0 - * ERROR ?? ^()\/yes.* - { - ERROR = "bmf; $MATCH" - } - - :0 E - { - ERROR - } -} - -dummy = "pm-jaube-prg-runall: Run Spamassassin" - -:0 -* ERROR ?? ^^^^ -* JA_UBE_SPAMASSASSIN_PRG ?? [a-z] -{ - INCLUDERC = $RC_UBE_SPAMASSASSIN - - :0 - * ERROR ?? yes - { - ERROR = "spamassassin; $MATCH" - } - - :0 E - { - ERROR - } -} - -dummy = "pm-jaube-prg-runall: Run Bsfilter" - -:0 -* ERROR ?? ^^^^ -* JA_UBE_BSFILTER_PRG ?? [a-z] -{ - INCLUDERC = $RC_UBE_BSFILTER - - :0 - * ERROR ?? yes - { - ERROR = "bsfilter; $MATCH" - } - - :0 E - { - ERROR - } -} - -dummy = "pm-jaube-prg-runall: Run Spamoracle" - -:0 -* ERROR ?? ^^^^ -* JA_UBE_SPAMORACLE_PRG ?? [a-z] -{ - # We must run spamoracle last, because it lacks the ability - # to read message from stdin. Due to this many shell calls - # are needed. See the RC file for more information. - - INCLUDERC = $RC_UBE_SPAMORACLE - - :0 - * ERROR ?? yes - { - ERROR = "spamoracle; $MATCH" - } - - :0 E - { - ERROR - } -} - -dummy = "pm-jaube-prg-runall.rc: end: $ERROR" - -# pm-jaube-prg-bmf.rc ends here diff --git a/src/procmail/pm-jaube-prg-spamassassin.rc b/src/procmail/pm-jaube-prg-spamassassin.rc @@ -1,236 +0,0 @@ -# pm-jaube-prg-spamassassin -- Interface to spamassassin program -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Warning -# -# Put all your Unsolicited Bulk Emacil (aka spam) filters towards the -# end of your `~/.procmailrc'. The idea is that valid messages are filed -# first (mailing lists, your work and private mail, bounces) and only -# the uncategorized messages are checked last. -# -# YOU CANNOT USE THIS PROCMAIL SUBROUTINE UNLESS YOU HAVE TRAINED THE -# BAYESIAN PROGRAM FIRST! -# -# To train: -# -# $ rm -f ~/.spamassassin/bayes* -# $ sa-learn $opt --local --no-rebuild --ham good.msg ... -# $ sa-learn $opt --local --no-rebuild --spam spam.msg ... -# $ sa-learn --rebuild -# -# Overview of features -# -# o Implements interface to http://www.spamassassin.org/ -# project. -# o variable `ERROR' is set if message was spam. -# o Results are available in default headers (X-Spam-*) -# -# Description -# -# There are several Bayesian based statistical analysis programs that -# study the message's tokens and then classify it into two categories: -# good or bad, or if you like, ham and spam. All the Bayesian programs -# are not the same, so if you want to achive magic 99.99% probability -# the only methodology to do that is to chain several programs in -# serially. There is no single program that can solve the UBE detection. -# This procmail subroutine implements call interface to program -# `spamassassin', which must already have been installed. -# -# About bouncing message back -# -# The general consensus is, that you should not send bounces. The UBE -# sender is not there, because the address forged. Do not increase -# the network traffic; you will not do any good to anybody by -# bouncing messgas -- you just increase mail traffic even more. -# Instead save the messages to folders and periodically periodically -# check their contents. -# -# Required settings -# -# If `spamassassin' program is available, define this variable in your -# `~/.procmailrc'. Use absolute path to make the external shell -# quick; it'll save server load considerably. -# -# JA_UBE_SPAMASSASSIN_PRG = /usr/bin/spamassassin -# -# If you _do_ _not_ have program installed, do not leave the -# variable lying aroung, because it will keep this subroutine active. -# Calling a non existing program is not a good idea, so it better to -# empty the variable if the program is not available. -# -# Required settings -# -# None. No dependencies to other procmail modules. -# -# Call arguments (variables to set before calling) -# -# o JA_UBE_SPAMASSASSIN_PRG, path to the program -# o JA_UBE_SPAMASSASSIN_MIN_SIZE, minumum message size. Default is -# 100 bytes. -# o JA_UBE_SPAMASSASSIN_MAX_SIZE, maximum message size. Default is -# 256 000 bytes (about 256k). -# o JA_UBE_SPAMASSASSIN_FORCE, if set to _yes_ then call program no -# matter what. Normally if there already is `X-Spam-*' header, -# it is assumed that the message has already been checked -# and no new checking is needed. -# -# Return values -# -# o ERROR, is set to the return value of program if message was spam. -# o ERROR_INFO, is set if case is "unsure". -# -# Usage example -# -# PMSRC = $HOME/procmail # procmail recipe dir -# -# <other checks, mailing lists, work mail etc.> -# -# JA_UBE_SPAMASSASSIN_PRG = "/usr/bin/nice -n 5 /usr/bin/bogofilter" -# INCLUDERC = $PMSRC/pm-jaube-prg-spamassassin.rc -# -# # The ERROR will contains reason if program classified -# # the message into "bad" category. -# -# :0 : -# * ! ERROR ?? ^^^^ -# junk.mbox -# -# File layout -# -# The layout of this file is managed by Emacs packages tinyprocmail.el -# and tinytab.el for the 4 tab text placement. -# See project http://freshmeat.net/projects/emacs-tiny-tools/ -# -# Change Log -# -# None - -dummy = " -======================================================================== -pm-jaube-prg-spamassassin.rc: init:" - -# ................................................... User variables ... - -# You must define program path, because we don't know -# if it has been installed in this system or not - -JA_UBE_SPAMASSASSIN_PRG = ${JA_UBE_SPAMASSASSIN_PRG:-""} - -# No user options cannot be passed, because the output would -# change. This variable is not used. -# JA_UBE_SPAMASSASSIN_PRG_OPT = ${JA_UBE_SPAMASSASSIN_PRG_OPT:-""} - -# Theshold values when to run spamassassin for a message. - -JA_UBE_SPAMASSASSIN_MIN_SIZE = ${JA_UBE_SPAMASSASSIN_MIN_SIZE:-100} -JA_UBE_SPAMASSASSIN_MAX_SIZE = ${JA_UBE_SPAMASSASSIN_MAX_SIZE:-256000} - -# Headers of earlier run of the program. No trailing colon. - -JA_UBE_SPAMASSASSIN_HEADER_FLAG = ${JA_UBE_SPAMASSASSIN_HEADER_FLAG:-\ -"X-Spam-Flag"} - -JA_UBE_SPAMASSASSIN_HEADER_STATUS = ${JA_UBE_SPAMASSASSIN_HEADER_STATUS:-\ -"X-Spam-Status"} - -# Should we check even if there already was header -# JA_UBE_SPAMASSASSIN_HEADER ? - -JA_UBE_SPAMASSASSIN_FORCE = ${JA_UBE_SPAMASSASSIN_FORCE:-"no"} - -# ............................................................ do it ... - -ERROR # Kill variables -ERROR_INFO - -:0 -* JA_UBE_SPAMASSASSIN_PRG ?? [a-z] -*$ ! 9876543210^0 ^$JA_UBE_SPAMASSASSIN_HEADER_FLAG -* 9876543210^0 JA_UBE_SPAMASSASSIN_FORCE ?? yes -{ - # Last, run spamassassin if it has not already been run - # system wide at MTA level. NOTE: run spamassassin - # absolutely _last_ and only _if_ message was still not - # detected as Unsolicited Bulk Email by previous recipes. - # - # A lock is used so that only one program is run at a time. - # X-Spam-Flag just tests if systemwide SA has already - # been run => Headers are there already and we should save CPU - # and not call SA again. Skip too long messages (256K) - - :0 - *$ > $JA_UBE_SPAMASSASSIN_MIN_SIZE - *$ < $JA_UBE_SPAMASSASSIN_MAX_SIZE - { - jaubeSaved = $LINEBUF - LINEBUF = $JA_UBE_SPAMASSASSIN_MAX_SIZE - - # This is Procmail's global variable. Kill it for now. - - PROCMAIL_OVERFLOW - - # The message must be saved, because if there is - # a problem with SA call, it will trash the whole message. - - :0 - * HB ?? ^^\/(.*$)+$ - { - jaubeSavedMsg = $MATCH - } - - # Procmail will set PROCMAIL_OVERFLOW if 'jaubeSavedMsg' - # cannot hold the content - # - # procmail: Exceeded LINEBUF - # procmail: Assigning "PROCMAIL_OVERFLOW=yes" - - :0 fhbw : spamassassin$LOCKEXT - * PROCMAIL_OVERFLOW ?? ^^^^ - | ${JA_UBE_SPAMASSASSIN_PRG} ${JA_UBE_SPAMASSASSIN_OPT:-""} - - # Check if SA trashed the message. This is usually due - # to errors in environment. - # - # procmail: Executing "/usr/bin/spamassassin," - # Use of uninitialized value in pattern match (m//) at /usr/share/perl5/Mail/SpamAssassin/ArchiveIterator.pm line 571. - # ... - # Unable to open : No such file or directory - - :0 - * HB ?? 1^1 ^.+ - { } - - # If no lines were found, then message was trashed. Restore - - :0 E fhbw - * jaubeSavedMsg ?? [a-z] - | echo -e "$jaubeSavedMsg" - - LINEBUF = $jaubeSaved - } - - :0 - *$ ^$JA_UBE_SPAMASSASSIN_HEADER_FLAG: yes - *$ ^$JA_UBE_SPAMASSASSIN_HEADER_STATUS: \/.* - { - ERROR = "spamassassin; $MATCH" - } -} - -dummy = "pm-jaube-prg-spamassassin.rc: end: $ERROR" - -# End of file diff --git a/src/procmail/pm-jaube-prg-spamoracle.rc b/src/procmail/pm-jaube-prg-spamoracle.rc @@ -1,281 +0,0 @@ -# pm-jaube-prg-spamoracle.rc -- Interface to Spamoracle program -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Warning -# -# Put all your Unsolicited Bulk Emacil (aka spam) filters towards the -# end of your `~/.procmailrc'. The idea is that valid messages are filed -# first (mailing lists, your work and private mail, bounces) and only -# the uncategorized messages are checked last. -# -# YOU CANNOT USE THIS PROCMAIL SUBROUTINE UNLESS YOU HAVE TRAINED THE -# BAYESIAN PROGRAM FIRST! -# -# To train: -# -# $ spamoracle add -v -spam good.msg ... # feed individual messages -# $ spamoracle add -v -good good.msg ... # feed individual messages -# -# To test -# -# $ spamoracle test mail.msg | less -# -# Overview of features -# -# o Implements interface to http://freshmeat.net/projects/spamoracle -# OCaml language based Bayesian Mail program. -# o Variable `ERROR' is set to "yes" if the message was UBE. -# o Results are available in headers `X-Spam-Spamoracle-Status', -# `X-Spam-Spamoracle-Score', `X-Spam-Spamoracle-Details' and -# `X-Spam-Spamoracle-Attachment' for further analysis. -# -# Description -# -# There are several bayesian based statistical analysis programs that -# study the message's tokens and then classify it into two categories: -# good or bad, or if you like, ham and spam. All the Bayesian programs -# are not the same, so if you want to achive magic 99.99% probability -# the only methodology to do that is to chain several programs in -# serially. There is no single program that can solve the UBE detection. -# -# Using Spamoracle as sole spam protection is inefficient, because -# version version 1.4 (2004-09-29) does not accept messages from -# stdin. Becaus of this message has to be written to a temporary file -# before calling Spamoracle. Later the temporary file must be removed -# with `rm'. All these three shell calls are needed for each message. -# If you have other detection programs, call them first to identify -# unsolicited Bulk Email. -# -# About bouncing message back -# -# The general consensus is, that you should not send bounces. The UBE -# sender is not there, because the address forged. Do not increase -# the network traffic; you will not do any good to anybody by -# bouncing messgas -- you just increase mail traffic even more. -# Instead save the messages to folders and periodically periodically -# check their contents. -# -# Required settings -# -# If `spamoracle' program is available, define this variable in your -# `~/.procmailrc'. Use absolute path to make the external shell -# quick; it'll save server load considerably. -# -# JA_UBE_SPAMORACLE_PRG = /usr/bin/spamoracle -# -# If you _do_ _not_ have program installed, do not leave the -# variable lying aroung, because it will keep this subroutine active. -# Calling a non existing program is not a good idea, so it better to -# empty the variable if the program is not available. -# -# Required settings -# -# None. No dependencies to other procmail modules. -# -# Call arguments (variables to set before calling) -# -# o `JA_UBE_SPAMORACLE_PRG', path to program -# o `JA_UBE_SPAMORACLE_HEADER_PREFIX', the header name where the results -# are put. If not defined, no headers are added. Default -# value is *X-Spam-Spamoracle'*. -# o `JA_UBE_SPAMORACLE_FORCE', if set to _yes_ then call program no matter -# what. Normally if there already are *X-Spam-Spamoracle-* headers, -# it is assumed that the message has already been checked -# and no new checking is needed. -# o `JA_UBE_SPAMORACLE_REGEXP', regexp to match for spam probability. -# Defaul value will match probabbility of 0.8 with 5 interesting words. -# The match is tried agains *X-Spam-Spamoracle-Score* header. -# -# Return values -# -# o `ERROR', value "yes" if `JA_UBE_SPAMORACLE_REGEXP' matched. -# o `ERROR_MATCH' contains detailed content of -# `X-Spam-Spamoracle-Score' header. -# -# If headers were enabled, they will contain these values. The -# score's values are spam probability 0.0 - 1.0 and the degree of -# similarity 0-15 of the message with the spam messages in the -# corpus. -# -# X-Spam-Spamoracle-Status: yes -# X-Spam-Spamoracle-Score: 1.00 -- 15 -# X-Spam-Spamoracle-Details: refid:98 $$$$:98 surfing:98 asp:95 click:93 -# cable:92 instantly:90 https:88 internet:87 www:86 U4:85 isn't:14 month:81 -# com:75 surf:75 -# X-Spam-Spamoracle-Attachments: cset="GB2312" type="application/octet-stream" -# name="Guangwen4.zip" -# -# Usage example -# -# PMSRC = $HOME/procmail # procmail recipe dir -# -# <other checks, mailing lists, work mail etc.> -# -# JA_UBE_SPAMORACLE_PRG = "/usr/bin/nice -n 5 /usr/bin/bmf" -# INCLUDERC = $PMSRC/pm-jaube-prg-spamoracle.rc -# -# # The ERROR will contains word "yes" if it program classified -# # the message into "bad" category. -# -# :0 : -# * ERROR ?? yes -# junk.mbox -# -# File layout -# -# The layout of this file is managed by Emacs packages tinyprocmail.el -# and tinytab.el for the 4 tab text placement. -# See project http://freshmeat.net/projects/emacs-tiny-tools/ -# -# Change Log -# -# None - -dummy = " -======================================================================== -pm-jaube-prg-spamoracle.rc: init:" - -# ................................................... User variables ... - -# You must define program path, because we don't know -# if it has been installed in this system or not - -JA_UBE_SPAMORACLE_PRG = ${JA_UBE_SPAMORACLE_PRG:-""} - -# The header name prefix with no colon at the end. If this variable -# is empty, then `formail' is not called and no headers are added to -# the message. This saves a shell call and will make this repice a -# bit faster. The return status can still be checked from variable -# ERROR - -JA_UBE_SPAMORACLE_HEADER_PREFIX = ${JA_UBE_SPAMORACLE_HEADER_PREFIX:-"\ -X-Spam-Spamoracle-"} - -# Should we run the check even if there aready were header -# JA_UBE_SPAMORACLE_HEADER_PREFIX? Setting to 'yes' might mean: -# -# o We suspect that someone else had added the header, so don't -# trust it but generate our own -# o We don't trust the local MDA's result (if it had invoked -# bmf for us), because we want' to run the message -# through our own trained database -# o Or, we're simply testing and have several INCLUDERC=$RC_UBE_SPAMORACLE calls -# in our ~/.procmailrc to find out what location would be the -# best (beginning, middle, last) by examining the procmail LOGFILE. - -JA_UBE_SPAMORACLE_FORCE = ${JA_UBE_SPAMORACLE_FORCE:-"no"} - -# This regexp is matched against header like below. If found, the ERROR -# is set to "yes" to flag the spam. Range 0.8 - 1.00 and at least 5 -# or more interesting words. -# -# X-Spam--Spamoracle-Score: 0.81 -- 5 - -JA_UBE_SPAMORACLE_REGEXP = "\ -(\.[8-9]|1\.).* *-- *([5-9]|[0-9][0-9])" - -# Program cannot read message from STDIN, so we must write it to a file - -JA_UBE_SPAMORACLE_TMP_FILE = ${JA_UBE_SPAMORACLE_TMP_FILE:-\ -$HOME/spamoracle-${USER:-${LOGNAME:-foo}}.tmp} - -# ............................................................ do it ... -# Kill variables - -ERROR -ERROR_MATCH - -:0 -* JA_UBE_SPAMORACLE_PRG ?? [a-z] -*$ 9876543210^0 ! ^$JA_UBE_SPAMORACLE_HEADER_PREFIX -* 9876543210^0 ! JA_UBE_SPAMORACLE_FORCE ?? yes -{ - jaubeSpamoracleData = "" - jaubeSpamoracleDetails = "" - jaubeSpamoracleAttach = "" - - # This area must be locked, so that no other process - # is writing at the same time. - - LOCKFILE = spamoracle$LOCKEXT - - savedMetas = $SHELLMETAS - savedShell = $SHELL - SHELLMETAS = ">" - SHELL = /bin/sh - - :0 wc - | ${CAT:-/bin/cat} > $JA_UBE_SPAMORACLE_TMP_FILE - - :0 w - jaubeSpamoracleData=| $JA_UBE_SPAMORACLE_PRG \ - test \ - $JA_UBE_SPAMORACLE_TMP_FILE - - dummy = `${RM:-/bin/rm} -f $JA_UBE_SPAMORACLE_TMP_FILE` - - SHELLMETAS = $savedMetas - SHELL = $savedShell - - LOCKFILE - - # An empty message looks like this - # - # From: - # Subject: - # Score: 0.50 -- 0 - # Details: - - :0 - * jaubeSpamoracleData ?? ^From: .+ - * jaubeSpamoracleData ?? ^(X-)?(Spam-)?Score: \/.+ - { - dummy = $jaubeSpamoracleData - ERROR_MATCH = $MATCH - - :0 - * jaubeSpamoracleData ?? ^(X-)?(Spam-)?Details:\/.+ - { - jaubeSpamoracleDetails = $MATCH - } - - :0 - * jaubeSpamoracleData ?? ^(X-)?(Spam-)?Attachments:\/.+ - { - jaubeSpamoracleAttach = $MATCH - } - - dummy = "pm-jaube-prg-spamoracle.rc: Does score match?" - - :0 - *$ ERROR_MATCH ?? $JA_UBE_SPAMORACLE_REGEXP - { - ERROR = "yes" - } - - :0 fhw - | ${FORMAIL:-formail} \ - -I "${JA_UBE_SPAMORACLE_HEADER_PREFIX}Status: ${ERROR:-no}" \ - -I "${JA_UBE_SPAMORACLE_HEADER_PREFIX}Score: $ERROR_MATCH" \ - -I "${JA_UBE_SPAMORACLE_HEADER_PREFIX}Details:$jaubeSpamoracleDetails" \ - -I "${JA_UBE_SPAMORACLE_HEADER_PREFIX}Attachments:$jaubeSpamoracleAttach" - } -} - -dummy = "pm-jaube-prg-spamoracle.rc: end: $ERROR" - -# pm-jaube-prg-spamoracle.rc ends here diff --git a/src/procmail/pm-jaube-prg-spamprobe.rc b/src/procmail/pm-jaube-prg-spamprobe.rc @@ -1,192 +0,0 @@ -# pm-jaube-prg-spamprobe.rc -- Interface to Spamprobe program -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Warning -# -# Put all your Unsolicited Bulk Emacil (aka spam) filters towards the -# end of your `~/.procmailrc'. The idea is that valid messages are filed -# first (mailing lists, your work and private mail, bounces) and only -# the uncategorized messages are checked last. -# -# YOU CANNOT USE THIS PROCMAIL SUBROUTINE UNLESS YOU HAVE TRAINED THE -# BAYESIAN PROGRAM FIRST! -# -# To train: -# -# $ spamprobe -8 good good.msg ... -# $ spamprobe -8 spam spam.msg ... -# -# Make sure there are no stale lock files, or the spamprobe and this -# subroutine will hang infinitely: -# -# $ rm -f ~/.spamprobe/lock -# -# Overview of features -# -# o Implements interface to http://freshmeat.net/projects/spamprobe/ -# project. -# o variable `ERROR' is set if the message was UBE. -# o Results are available by default in header -# `X-Spam-Spamprobe-Status'. -# -# Description -# -# There are several Bayesian based statistical analysis programs that -# study the message's tokens and then classify it into two categories: -# good or bad, or if you like, ham and spam. All the Bayesian programs -# are not the same, so if you want to achive magic 99.99% probability -# the only methodology to do that is to chain several programs in -# serially. There is no single program that can solve the UBE detection. -# This procmail subroutine implements call interface to program -# `spamprobe', which must already have been installed. -# -# About bouncing message back -# -# The general consensus is, that you should not send bounces. The UBE -# sender is not there, because the address forged. Do not increase -# the network traffic; you will not do any good to anybody by -# bouncing messgas -- you just increase mail traffic even more. -# Instead save the messages to folders and periodically periodically -# check their contents. -# -# Required settings -# -# If `spamprobe' program is available, define this variable in your -# `~/.procmailrc'. Use absolute path to make the external shell -# quick; it'll save server load considerably. -# -# JA_UBE_SPAMPROBE_PRG = /usr/bin/spamprobe -# -# If you _do_ _not_ have program installed, do not leave the -# variable lying aroung, because it will keep this subroutine active. -# Calling a non existing program is not a good idea, so it better to -# empty the variable if the program is not available. -# -# Required settings -# -# None. No dependencies to other procmail modules. -# -# Call arguments (variables to set before calling) -# -# o `JA_UBE_SPAMPROBE_PRG', path to the program. -# o `JA_UBE_SPAMPROBE_HEADER', the header name where the results -# are put. If not defined, no header is added. -# Defaults to *X-Spam-Spamprobe-Status* -# o `JA_UBE_SPAMPROBE_FORCE', if set to _yes_ then call program -# no matter what. Normally if there already is -# *X-Spam-Spamprobe-Status* header, it is assumed that the -# message has already been checked and no new checking is -# needed. -# -# Return values -# -# o `ERROR', is set to the return value of `spamprobe' program. -# -# Usage example -# -# PMSRC = $HOME/procmail # procmail recipe dir -# -# <other checks, mailing lists, work mail etc.> -# -# JA_UBE_SPAMPROBE_PRG = "/usr/bin/nice -n 5 /usr/bin/spamprobe" -# INCLUDERC = $PMSRC/pm-jaube-prg-spamprobe.rc -# -# # The ERROR will contains word "yes" if message was spam -# -# :0 : -# * ERROR ?? yes -# junk.mbox -# -# File layout -# -# The layout of this file is managed by Emacs packages tinyprocmail.el -# and tinytab.el for the 4 tab text placement. -# See project http://freshmeat.net/projects/emacs-tiny-tools/ -# -# Change Log -# -# None - -dummy = " -======================================================================== -pm-jaube-prg-spamprobe.rc: init:" - -# ................................................... User variables ... - -# You must define program path, because we don't know -# if it has been installed in this system or not - -JA_UBE_SPAMPROBE_PRG = ${JA_UBE_SPAMPROBE_PRG:-""} - -# Command "score" examines the message -# You could use command "train" is you have good database. - -JA_UBE_SPAMPROBE_PRG_OPT = ${JA_UBE_SPAMPROBE_PRG_OPT:-"score"} - -# The header name with no colon at the end. If this variable -# is empty, then external formail call is saved - results can still -# be checked from variable ERROR. There is no trailing colon in this -# variable. - -JA_UBE_SPAMPROBE_HEADER = ${JA_UBE_SPAMPROBE_HEADER:-"\ -X-Spam-Spamprobe-Status"} - -# Should we check even if there already was header -# JA_UBE_SPAMPROBE_HEADER - -JA_UBE_SPAMPROBE_FORCE = ${JA_UBE_SPAMPROBE_FORCE:-"no"} - -# ............................................................ do it ... - -ERROR # Kill variable - -:0 -* JA_UBE_SPAMPROBE_PRG ?? [a-z] -*$ ! 9876543210^0 ^$JA_UBE_SPAMPROBE_HEADER -* 9876543210^0 JA_UBE_SPAMPROBE_FORCE ?? yes -{ - jaubeSpamprobeScore # Kill variable - - :0 w # : spamprobe$LOCKEXT - jaubeSpamprobeScore=|$JA_UBE_SPAMPROBE_PRG ${SPAMPROBE_OPT:-"score"} - - # Check for failures; require (A)and condition - # - # procmail: Executing "/usr/bin/spamprobe,score" - # error: unable to open database ....spamprobe/sp_words: - # Cannot allocate memory - # warning: berkeley db reported error: env close: Invalid argument (22) - # caught runtime exception: unable to open words database - # caught signal 11: cleaning up - - :0 A - * jaubeSpamprobeScore ?? [a-z] - { - ERROR = $jaubeSpamprobeScore - - # X-Spam-Spamprobe-Status: GOOD 0.0000273 e5af974acad8028bea8a10f1f08b966e - # X-Spam-Spamprobe-Status: SPAM 0.9742932 07a3b71c9c96968641bbfa497a458d8e - :0 fw - * ! JA_UBE_SPAMPROBE_HEADER ?? ^^^^ - | ${FORMAIL:-formail} \ - -I "$JA_UBE_SPAMPROBE_HEADER: $jaubeSpamprobeScore" - } -} - -dummy = "pm-jaube-prg-spamprobe.rc: end: $ERROR" - -# End of file diff --git a/src/procmail/pm-jaube.rc b/src/procmail/pm-jaube.rc @@ -1,1575 +0,0 @@ -# pm-jaube.rc -- Unsolicited Bulk Email (UBE) filter. -# -# {{{ Documentation -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Warning -# -# Put all your UBE (aka spam) filters towards the _end_ of your -# ~/.procmailrc. The idea is that valid messages are filed -# first (mailing lists, your work and private mail, bounces) and only -# the uncategorized messages are checked. -# -# Are you sure you want to use procmail for UBE? -# -# If you think you can put this recipe as a first line of defence to -# your mail, you will disappoint. Checking UBE with procmail's -# rule based means does not work that way. The good messages -# must be sorted first (like your mailing lists and your -# important work or friend message) and only then what's left to -# process can be scanned by static rule based tools, like this -# procmail module. There are much more better tools that are -# based on statistical analysis of messages. You really should -# consider using one or combination of Bayesian tools: -# *Spamassassin*, *bogofilter*, *spamprobe*, *Bayesian* *Mail* -# *Filter*, *ifile* etc. -# -# _Repeat:_ procmail rules are not the tool to UBE control. The -# pattern matching rules can never keep up with the spammers. That -# said, if you: -# -# o Can bare a 70-80 % UBE detection rate. -# o Can bare 10 % false hits; you need to check you UBE folder -# regularly for messaged that did not belong there. -# o Have an account that does not get large number of UBE messages. -# o Or if procmail is all you have in the system. -# -# only then consider this module or any other procmail based -# spam filters in that respect. So, please don't set your -# expectations high. Spend good time with the configuration -# variables and check there returned result in variable `ERROR' -# carefully. Good luck. -# -# Overview of features -# -# o Requires procmail 3.11pre7+ -# o You don't need external files: site block lists, the -# heuristics nail most of the UBE messages. Just plug in this -# module and you have UBE shield active. -# o Header based filtering: Minimum headers, Pegasus bulk mail, -# X-uidl validity check, bogus From-To combination, -# o Address based filtering: Numeric address, Invalid address (eg. -# me@myMarketing.global), UBE-like(friend,remove request.) -# o Text filtering: no html accepted, common advertising slogans, -# unnecessary many capitalized words, HTML message body detection, -# o And many more check that just not were listed here. -# -# Remember: this is not 100% and there will always be some mishits, so -# don't just junk messages to `/dev/null'. -# -# Description -# -# Originally Daniel Smith posted his spam.rc, where he had gathered -# many tips and heuristics to filter UBE email. This filter here -# expresses work of many procmail users. Original filters were -# modified, some rules were left out that catched false email -# messages and made the package look a bit more general so that it -# could be included via `INCLUDERC' in the standard way. -# -# Thanks to Daniel and others, the UBE bomb days can be reduced, -# when this filter is active. Some UBE messages may still lurk -# into the mailbox, but that's the problem with all static rule -# based tools. -# -# Logging the events -# -# A good strategy to follow incoming mail is to log the vital parts -# like Date, From, Subect to some log file and then a reason what -# happened to a message. The `~/Mail/mail.log' might look like: -# -# 1997-12-08 work@example.com Extra Holiday $$$$$ -# [jaube; Marketing-Big-ExitCode; LEGAL, MONEY-MAKING PHENOMENON] -# 1997-12-09 Denizen <logger@example.com> [RePol] hiding -# 1997-12-09 david X <dx@example.com> Re: Send list to incoming folder -# 1997-12-09 david X <dx@example.com> Re: Send list to incoming folder -# 1997-12-09 OMC manager <omcman@example.fi> "Environments updated" -# [my; work-localenv] -# 1997-12-09 doodle@example.org Re: Gnus (Emacs Newsreader) FAQ -# [my; emacs; Re: Gnus (Emacs Newsreader) FAQ ] -# -# First a UBE message that was identified and saved -# to folder. Next 3 messages were filed to mailing-list folders and -# there was no [] action displayed for them (left out due to high -# volume of these messages). Second Last was internal work -# message. Lastly someone asked somthign about Emacs. -# -# The basic incoming message log recipe could be like this. -# Variable `TODAY' is `$YYYY-$MM-$DD' whose values are set after -# calling `pm-jadate.rc'. The `LISTS' is user set variable to exclude -# mailing lists whose activity is not important. Variables `FROM' and -# `SUBJECT' are fields read the message's headers. -# -# BIFF = $HOME/Mail/mail.log -# INCLUDERC = $PMSRC/pm-jadate.rc -# ... -# -# :0 hwic: -# *$ ! $LISTS -# |echo "$TODAY $FROM $FSUBJECT" >> $BIFF -# -# Here is small perl script to print summary of trapped UBE -# messages from a log like above. It gives nice overview which recipes -# catch most of the UBE messages. -# -# perl -ne '/jaube; (\S+)/; $s{$1}++; \ -# END { $s = (map{$x += $_; $_= $x} values %s)[-1]; \ -# $i = int $s{$_}/$s *100; \ -# for (keys %s) { printf "$s{$_} $i $_\n" } \ -# }' \ -# mail.log | \ -# sort -nr -# -# Here is sample results during two month period There are total of -# 3248 UBE messages catched. -# -# count % type -# ------------------------------------------ -# 554 17 Marketing-CountBigLetterWords -# 457 14 Marketing -# 422 12 Marketing-SelectedBigLetterWords -# 349 10 AddrBogus-ToFrom -# 263 8 FromReceived-Mismatch -# 223 6 NoDirectAddress-ToCc -# 216 6 HdrForgedPegasus -# 164 5 AddrBogus-To -# 151 4 MessageId -# 102 3 BodyHtml -# 73 2 Received-IPError -# 63 1 Identical-FromTo -# 53 1 AddrInvalid -# 15 0 From-nslookup -# 9 0 HdrReceivedTime -# 7 0 HdrX-UIDL -# 4 0 Marketing-headers -# -# About bouncing message back -# -# The general consensus is, that you should not send bounces. The UBE -# sender is not there, because the address is usually forged. Do not -# increase the network traffic. Instead save the messages to folders -# and periodically check their contents. It's not nice to be forced to -# apologize if you bounced message to a wrong destination. DON'T -# BOUNCE. Forget all recipe examples that use HOST and EXITCODE and -# be a good Net citizen. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This -# recipe file will include -# -# o pm-javar.rc -# o pm-janslookup.rc -# o pm-jaaddr.rc -# -# Call arguments (variables to set before calling) -# -# Only handful of the most important variables are described here. -# You really should read all the comments placed in the "user configured -# section" in this procmail module's code. Most of the defaults -# should work out of the box. -# -# o `JA_UBE_VALID_ADDR', your email addresses or other -# valid from addresses that will say "this is mail addressed -# directly to you". -# o `JA_UBE_HDR', If non-empty, a new header is added which tells which -# recipe was triggered. The header is not added to message, if -# there is nothing to report; i.e. message passed all tests. -# o Various flags: Some of the ube detecting recipes give more -# false hits than nail real ube. Experiment with yourself and turn -# on or off the recipes that work for the kind of ube messages -# you receive. -# o `JA_UBE_MAX_BIG_WORDS', the maximum count of big letter words in the -# message that is tolerated. The current count 5 is rather -# conservative and it is suggested you to increase it to prevent -# trapping too many false hits. Alternatively update JA_UBE_CAPS_OK -# to include accepted words. -# o `JA_UBE_APPARENTLY_TO_MAX', how many Apparently-To headers are -# tolerated. Default is 3. -# o `JA_UBE_MAX_HTML_TAGS', maximum count of html tags allowed in the -# body. -# o `JA_UBE_ATTACHMENT_ILLEGAL_KILL', if set to "yes" (default), then -# illegal attachment from body is ripped off. This is brute way -# to truncate the message abruptly to save mailbox space. You still -# see the headers for tracking, but the body is gone. The regexp -# to test is set in `JA_UBE_ATTACHMENT_ILLEGAL_REGEXP'. -# o `JA_UBE_ATTACHMENT_SUSPECT_KILL', if set to "yes" (default "no"), -# kill suspectible characters in attachement filename. The regexp -# to test is set in `JA_UBE_ATTACHMENT_SUSPECT_NAME_REGEXP'. -# o JA_UBE_CHARSET_LEGAL, if set, accept only these character. The -# default value detect messages with 7bit only (english speaking. -# For foreign language you may want to set this something like -# `$CHAR_7BIT_SET$CHAR_LIST_FINLAD' -# for Finnish. See `pm-javar.rc' for available character sets. -# -# Return values -# -# o `ERROR_STATUS', status word of checks. Value "Good" or "Bad" -# o `ERROR,' is set to short ube trigger recipe reason -# o `ERROR_MATCH', is set to some MATCH that happened while triggering -# UBE message. -# -# Alternatively you check content of header `JA_UBE_HDR' which contains -# results of the above variables. Possible values for `ERROR' are: -# -# AddrAOLinvalid -# AddrBogus-From -# AddrInvalid-From -# AddrInvalid-To -# AddrNumeric -# AddrNumericDomain -# AddrUbeLike -# BodyAttachment-FileIllegalAdditional -# BodyAttachment-FileIllegalMatch -# BodyAttachment-FileIllegalOther -# BodyAttachment-FileSuspect -# BodyCharacters-Illegal -# BodyHtml-NonMime -# BodyHtml-script -# BodyHtmlBase64 -# BodyHtmlImage -# BodyHtmlTags -# BodyMimeCharset-Illegal -# EnvelopeFrom-Invalid -# From-nslookup -# FromReceived-Mismatch -# HdrForgedPegasus -# HdrReceived -# HdrReceivedTime -# HdrX-Distribution -# HdrX-UIDL -# Header-ApparentlyTo -# HeaderCharacters-Illegal -# HeaderMimeCharset-Illegal -# Html-base64 -# Identical-FromTo -# Marketing-Body -# Marketing-CountBigLetterWords -# Marketing-SelectedBigLetterWords -# Marketing-Subject -# Marketing-SubjectGreeting -# MegaSpammer -# MessageId-Invalid -# MessageId-Empty -# NoDirectAddress-ToCc -# NotEnoughHeaders -# Received-IPError -# VirusBody -# VirusHeader -# -# Usage example -# -# # - All legimate messages should already been handled and -# saved before this recipe. -# # - Activate the filter only for messages that are not from -# # daemon and not from valid senders: like from "my" domain -# # and mailing lists and from somewhere else. -# -# VALID_FROM = "(my@address.example.com|word@here.example.com)" -# -# :0 -# *$ ! ^From:.*$VALID_FROM -# *$ ! FROM_DAEMON -# { -# -# # Do not add extra headers. This saves external shell call -# # (formail). Also do not try to kill the message content, -# # again saving one external call (awk). With these, the -# # recipe is faster and more CPU friendly. -# -# PM_JA_UBE_HDR = "" -# JA_UBE_ATTACHMENT_ILLEGAL_KILL = "no" -# -# INCLUDERC = $PMSRC/pm-jaube.rc -# -# # Variable "ERROR" is set if message was UBE, record error -# # to log file with "()\/" -# -# :0 : -# * ERROR ?? ()\/[a-z].* -# { -# # Don't save those *.exe, *.zip UBE attachements -# :0 -# * ERROR ?? attacment.*file -# /dev/null -# -# :0 : -# spam.mbox -# } -# } -# -# There may be UBE messages that fool `FROM_DAEMON' test, so -# you could also use something more finer check. The standard daemon -# error message almost always has sentence "Transcript of session -# follows" in the body. This recipe says: "Unless proven otherwise, -# I don't believe this is daemon message even if it looked like that". -# Add More "2^1" checks to raise score for other valid daemon cases. -# -# * -1^0 ^FROM_DAEMON -# * ! 2^1 B ?? Transcript of session follows -# { -# # ... Now call UBE checker -# } -# -# File layout -# -# The layout of this file is managed by Emacs packages tinyprocmal.el -# and tinytab.el for the 4 tab text placement. -# See project http://freshmeat.net/projects/emacs-tiny-tools/ -# -# Change Log -# -# 2004-09-10 Restructural changes and many improvements with added -# checks. This module no longer saves messages - it only checks if -# message is UBE or not. -# -# 1998-08-24 Gregory Sutter sent update to his recipe. -# -# 1998-02-27 <bochmann@TUDURZ.urz.tu-dresden.de> (Henryk Bochmann) -# reported that the ReceivedFrom test triggered all htmail messages. -# Now Fixed. -# -# }}} -# {{{ Variables - -# ............................................................ &init ... - -dummy = " -======================================================================== -pm-jaube.rc: init:" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc - - :0 # This is extremely critical, so flag error - * ! WSPC ?? [ ] - { - LOG = "(pm-jaube.rc) *** FATAL ERROR: couldn't include pm-javar.rc" - } -} - -####################################################################### -# -# User configurable variables. Set these, before calling this -# module/subroutine. -# -####################################################################### - -# ............................................... &enabling-features ... - -# Recipe enable flags. Turn off if you think they -# give too many false hits. Set to 'yes' or 'no' - -JA_UBE_FLAG_IP = ${JA_UBE_FLAG_IP:-"yes"} -JA_UBE_FLAG_MID = ${JA_UBE_FLAG_MID:-"yes"} -JA_UBE_FLAG_NUM_ADDR = ${JA_UBE_FLAG_NUM_ADDR:-"yes"} -JA_UBE_FLAG_TEXT_MARKET = ${JA_UBE_FLAG_TEXT_MARKET:-"yes"} -JA_UBE_FLAG_TEXT_VIRUS = ${JA_UBE_FLAG_TEXT_VIRUS:-"yes"} -JA_UBE_FLAG_IDENTICAL_FROM_TO = ${JA_UBE_FLAG_IDENTICAL_FROM_TO:-"yes"} -JA_UBE_FLAG_TO_CC = ${JA_UBE_FLAG_TO_CC:-"yes"} -JA_UBE_FLAG_BIG_LETTER_WORDS = ${JA_UBE_FLAG_BIG_LETTER_WORDS:-"yes"} - -# Is there is an attachment (*.exe ...), setting this option to 'yes' -# will brutally remove file attached in base64 data thus reducing the -# size of the saved message considerably. Warning: the MIME headers -# WILL BE INVALID after this brutal operation, so some Mail User -# Agents (MUAs) may not be able to read the message properly. -# -# If you have plenty of disk space OR if you plan to send the -# message to /dev/null after checking the ERROR variables for -# indication of "attachment.*file", please turn this option "off". -# Then no external awk process is called and your procmal -# process is faster. - -JA_UBE_ATTACHMENT_ILLEGAL_KILL = $JA_UBE_ATTACHMENT_ILLEGAL_KILL:-"yes"} -JA_UBE_ATTACHMENT_SUSPECT_KILL = $JA_UBE_ATTACHMENT_SUSPECT_KILL:-"no"} - -# Should the From: addresses domain be validated with nslookup? -# Turning this option on may slow down UBE filter for first 200 -# mails. After that the nslookup cache starts playing well. - -JA_UBE_FLAG_FROM_NSLOOKUP = ${JA_UBE_FLAG_FROM_NSLOOKUP:-"yes"} - -# ....................................................... &variables ... - -JA_UBE_HDR = ${JA_UBE_HDR:-"X-Spam-Jaube"} # No trailing colon! - -# Define this variable to match _all_ valid From and To addresses that -# are yours. Put your regexp inside prenthesis. -# -# This defualts to "(logname|email@foo.com)" or "(logname|xyzabc)" -# if EMAIL is not defined. - -JA_UBE_VALID_ADDR = ${JA_UBE_VALID_ADDR:-\ -(${LOGNAME:-$USERNAME}|${EMAIL:-xyzabc})} - -# A Macro - -JA_UBE_FROM = ${JA_UBE_FROM:-\ -"(^(Apparently-|Resent-)*(From|Reply-To|Sender):|^From$NSPC+)"} - -# If message comes from these address, check that From addresses domain -# is found from Received header. If not, then it's forged. -# -# This regexps must not include @ character because the matched string -# is used later "as is" and included @ will confuse the algorithm. -# -# 1998-10-05 Jacques Gauthier <jacques_g@yahoo.com> informed that -# rocketmail was merged with lycosmail, but that rocketmail still exists. - - -JA_UBE_FROM_QUESTIONABLE = ${JA_UBE_FROM_QUESTIONABLE:-"\ -@.*(compuserve\ -|aol\.\ -|microsoft\ -|yahoo -|juno\.\ -|netcom\ -|earthlink\ -|prodigy\ -|freeyellow\ -|hotmail\ -|rocketmail\ -|lycosmail\ -|wowmail\ -)"} - - -# This list is _not_ meant to be comprehensive. Just some words that are -# likely to be used in Computer related communication. -# -# ootb = out of the box oob = out of box -# fyi = for your information -# fwiw = -# itp = intent to package -# eof = end of file -# esmtp = If message headers have been attached thre will be ESMTP Mail server -# Received: lines -# dst,cest = timezone values - -JA_UBE_CAPS_OK_DEFAULT = ${JA_UBE_CAPS_OK:-\ -"\<(\ -\<AM\>\ -|ASAP\ -|API\ -|BEGIN\ -|BLOCK\ -|\<CEST\>\ -|CVS\ -|CYGWIN\ -|DHCP\ -|\<DIR\ -|\<DSA\>\ -|\<DST\>\ -|\<IP\>\ -|\<EET\>\ -|EMACS\ -|ENCRYPTED\ -|\<END\>\ -|E?SMTP\ -|EXIT\ -|\<EOF\>\ -|FAQ\ -|\<FSF\>\ -|FWIW\ -|GNOME\ -|\<GCC\ -|\<GNU\>\ -|GPG\ -|GPL\ -|\<FYI\>\ -|GIF\ -|GSM\ -|HOME\ -|HP-?UX\ -|HTTP\ -|\<ITP\>\ -|JPG\ -|\<KB\>\ -|KDE\ -|\<KEY\ -|LANG\ -|LC_ALL\ -|LC_CTYPE\ -|MESSAGE\ -|MIME\ -|NOTE\ -|OOB\ -|OOTB\ -|\<PART\>\ -|PATH\ -|\<PID\>\ -|PCX\ -|PGP\ -|<\ORACLE\>\ -|POSIX\ -|PUBLIC\ -|PXE\ -|README\ -|RSA\ -|\<SIGN(ED)?\>\ -|SSH\ -|TEXT/PLAIN\ -|\<UID\>\ -|\<URL\>\ -|US-ASCII\ -|\<UTC\>\ -|WWW\ -|XEMACS\ -)\>"} - -# Allowed words that are all caps. -# If message contains too many capitalized words, it's certainly UBE. -# -# If you want caps checking, set -# -# JA_UBE_CAPS_OK = $JA_UBE_CAPS_OK_DEFAULT - -JA_UBE_CAPS_OK = "" # Disabled by default - -# If you'tr english speankin and to not want any messages that -# contains exotic character, this default is fine. If you speak -# some other language, you should define this variable to list -# of characters allowed. It will be later converted into [ ... ] -# class regexp. - -JA_UBE_CHARSET_LEGAL = ${JA_UBE_CHARSET_LEGAL:-\ -"$CHAR_7BIT_SET$CHAR_7BIT_CONTROL"} - -# Check for header of body for these MIME content types - -JA_UBE_MIME_CHARSET_ILLEGAL = ${JA_UBE_MIME_CHARSET_ILLEGAL:-\ -"\<(ks_\ -|euc-kr\ -|ISO-.*2022\ -|big-?5\ -|gb[0-9]\ -|koi[0-9]\ -|kr\>\ -|cs\>\ -|jis\>\ -|jp\>\ -|Windows-1251\ -)"} - - -# Any regexp than can match the full attachment file name. -# *.scr is audio/x-wav - -JA_UBE_ATTACHMENT_ILLEGAL_REGEXP = ${JA_UBE_ATTACHMENT_ILLEGAL_REGEXP:-\ -"\.(\ -ba[st]\ -|bin\ -|chm\ -|cmd\ -|com\ -|cpl\ -|dll\ -|exe\ -|hta\ -|inf\ -|jar\ -|ms[cit]\ -|mp3\ -|pcd\ -|pif\ -|ram\ -|reg\ -|sc[rt]\ -|swf\ -|vb[es]?\ -|wav\ -|ws[cfh]\ -)"} - -# In addition to JA_UBE_ATTACHMENT_ILLEGAL_REGEXP, this regexp is tried. -# So, if you want to retain the default (*.exe) checks, do not touch -# JA_UBE_ATTACHMENT_ILLEGAL_REGEXP, but set -# JA_UBE_ATTACHMENT_ILLEGAL_REGEXP_ADDITIONAL -# -# You could include \.(bmp|jpe?g|gif|png) - -JA_UBE_ATTACHMENT_ILLEGAL_REGEXP_ADDITIONAL = \ -${JA_UBE_ATTACHMENT_ILLEGAL_REGEXP_ADDITIONAL:-""} - -# If this regexp matches the attachement filename, then it is -# suspect. Some spammers send files named after the email address, -# so this regexp catches those. An example: -# -# name="j.doe@example.net" -# -# Set this variable to an empty string "" to disable checking. - -JA_UBE_ATTACHMENT_SUSPECT_NAME_REGEXP = \ -${JA_UBE_ATTACHMENT_SUSPECT_NAME_REGEXP:-\ -"[@&%!?#|;:<>{}\[\]\'$]"} - -# Subject field words to classify as "Greeting" - -JA_UBE_SUBJECT_GREETING = ${JA_UBE_SUBJECT_GREETING:-\ -"\<(hi|hey|greeting|hello|help)\>"} - -# ...................................................... &thresholds ... - -JA_UBE_MAX_APPRENTLY_TO = ${JA_UBE_MAX_APPRENTLY_TO:-3} -JA_UBE_MAX_BIG_WORDS = ${JA_UBE_MAX_BIG_WORDS:-5} -JA_UBE_MAX_HTML_TAGS = ${JA_UBE_MAX_HTML_TAGS:-4} - -# ........................................................... &other ... -# Define DEGUG = "yes" to get the headers into the LOGFILE - -:0 -* DEBUG ?? on -{ - LOG = "$NL$NL ######## head-begin $NL" - HEADER = `sed /^$/q` - LOG = "$NL ######## head-end $NL" -} - -####################################################################### -# -# Private variables. Do not touch -# -####################################################################### - -jaubePGPmessage = "no" # set initial value for flag - -:0 -* B ?? BEGIN PGP (SIGNED )?MESSAGE -{ - jaubePGPmessage = "yes" -} - -jaubeHTML = "no" # set initial value for flag - -:0 -*$ HB ?? ^Content-Type:.*html -{ - jaubeHTML = "yes" -} - -# .......................................................... &output ... - -# The status of this message. Changed to "Bad" if ERROR is set here. - -ERROR_STATUS = "Good" - -# - Kill these variables. -# - The UBE catch reason is stored into ERROR. -# - If something was matched while detecting UBE, te second -# will hold the match. - -ERROR -ERROR_MATCH - -# }}} - -# ............................................................ &misc ... - -money1="[0-9]+([,.][0-9]+)*$WSPC+(dollars?|euros?)" - -money = "(\ -\$[0-9]\ -|[0-9]$WSPC*%\ -|$money1 -)" - - -# {{{ Body: Attachments - -# ............................................................ &text ... - -dummy="pm-jaube.rc: Check attachements" - -# These are some clever attachement names like: -# name="this.doc .pif" -# name="this.doc -# .pif" - -:0 -* ERROR ?? ^^^^ -* HB ?? Content-Type:.*(application|octet-stream|multipart|alternative) -*$ B ?? name=\/.+$SPCL+[^\"']+ -{ - jaubeFile = $MATCH - - # Remove leading quote mark - - :0 - *$ jaubeFile ?? ^^[\"']+\/.+$SPCL+[^\"']+ - { - jaubeFile = $MATCH - } - - :0 - * ! JA_UBE_ATTACHMENT_ILLEGAL_REGEXP ?? ^^^^ - *$ $SUPREME^0 jaubeFile ?? ()\/$JA_UBE_ATTACHMENT_ILLEGAL_REGEXP - { - ERROR = "BodyAttachment-FileIllegalMatch" - ERROR_MATCH = "$jaubeFile ($MATCH)" - } - - :0 - * ! JA_UBE_ATTACHMENT_ILLEGAL_REGEXP_ADDITIONAL ?? ^^^^ - *$ $SUPREME^0 jaubeFile ?? ()\/$JA_UBE_ATTACHMENT_ILLEGAL_REGEXP_ADDITIONAL - { - ERROR = "BodyAttachment-FileIllegalAdditional" - ERROR_MATCH = "$jaubeFile ($MATCH)" - } -} - -:0 -* ERROR ?? ^^^^ -* HB ?? Content-Type:\/.*(audio|video) -{ - ERROR = "BodyAttachment-FileIllegalOther" - ERROR_MATCH = "$MATCH" -} - -:0 -* ERROR ?? ^^^^ -* ! JA_UBE_ATTACHMENT_SUSPECT_NAME_REGEXP ?? ^^^^ -* B ?? base64 -* B ?? name=\/.* -* MATCH ?? ()\/[^\"\' ]+ -{ - jaubeFile = $MATCH - - :0 - *$ jaubeFile ?? $JA_UBE_ATTACHMENT_SUSPECT_NAME_REGEXP - { - ERROR = "BodyAttachment-FileSuspect" - ERROR_MATCH = "$jaubeFile" - } -} - -# }}} -# {{{ Invalid IP and domains, or From_ - -:0 -* ERROR ?? ^^^^ -* JA_UBE_FLAG_IP ?? yes -*$ ^Received.*()\/\[[0-9\.]*([03-9]$d$d|2[6-9]$d|25[6-9]) -{ - ERROR = "Received-IPError" - ERROR_MATCH = $MATCH -} - -# 1998-05-26 By <dattier@wwa.com> (David W. Tamkin) in -# procmail mailing list. Message-ID: <m0ye6in-001HOsC@tekka.wwa.com> -# -# Valid envelope From_ address looks like and anything different from -# that is probably spam. -# -# From foo@bar.com Tue May 26 02:46:33 1998 - -:0 -* ERROR ?? ^^^^ -*$ ! ^From$WSPC+$NSPC+$WSCPC+.*$weekdays -*$ From+s+\/.* -{ - ERROR = "EnvelopeFrom-Invalid" - ERROR_MATCH = $MATCH -} - -# }}} -# {{{ Invalid message id - -# By era eriksson <era@iki.fi> -# -# Invalid Message-Id:s are likely UBE -# Careful, this seems to give false hits sometimes(and one is enough!) -# You may want to disable this permanently. -# -# There is software out there that breaks -# RFC822 in that they don't include an "@" in the Message-Id. I don't -# care too much since I see them in my spam tank but if you send stuff -# to /dev/null, you'll probably want to take out the @ part. -# -# RFC822 says (4.1): -# -# msg-id = "<" addr-spec ">" -# addr-spec = local-part "@" domain ; global address -# local-part = word *("." word) -# domain = sub-domain *("." sub-domain) -# => -# Message-Id: word *("." word) "@" sub-domain *("." sub-domain), -# -# where (3.3): -# -# word = atom / quoted-string -# atom = 1*<any CHAR except specials, SPACE and CTLs>; efectively ascii 33-127. -# -# Example invalid: <winATT-3.01-userid-999> -# Example valid : <v03130307b0b2fc185d0b@[206.109.113.133]> -# -# Below, it is required that domain is like "this.com", and not just "localhost". - -:0 -* ERROR ?? ^^^^ -* JA_UBE_FLAG_MID ?? yes -* ^Message-Id:\/.* -*$ ! ^Message-Id:[$WSPC]+<[^$WSPC<>@]+@([a-zA-Z0-9-]+\.)+[a-zA-Z]+> -{ - ERROR = "MessageId-Invalid" - ERROR_MATCH = $MATCH -} - -# Empty Message-ID should never be generated by a real mail program - -:0 -* ERROR ?? ^^^^ -*$ ^Message-Id:.*<$WSPC*> -{ - ERROR = "MessageId-Empty" - # ERROR_MATCH = $MATCH -} - -# }}} - -# .......................................................... &header ... - -# {{{ Header: Required minimum - -:0 -* ^From: -* ^(Apparently-|Delivered-|Envelope-)?To: -* ^Date: -{ } -:0 E -* ERROR ?? ^^^^ -{ - ERROR = "NotEnoughHeaders" - # ERROR_MATCH = $MATCH -} - -# }}} -# {{{ Header: X-distribution - -# Pegasus mail uses this - -:0 -* ERROR ?? ^^^^ -*$ ^X-Distribution:$WSPC*\/(moderate|bulk|mass) -{ - ERROR = "HdrX-Distribution" - ERROR_MATCH = $MATCH -} - -# }}} -# {{{ Header: Illegal character sets - -# This section is special. We always run the character test set, -# No matter if the previous check would have found another -# error (and ERROR is set) - -dummy = "pm-jaube.rc: Check illegal character sets" -charset = $JA_UBE_MIME_CHARSET_ILLEGAL - -:0 -* ! JA_UBE_CHARSET_LEGAL ?? ^^^^ -{ - dummy = "Charset test: $JA_UBE_CHARSET_LEGAL" - - :0 - *$ ^(Subject|From|To):.*()\/[^$JA_UBE_CHARSET_LEGAL] - { - ERROR = "${ERROR}${ERROR+:}HeaderCharacters-Illegal" - ERROR_MATCH = $MATCH - } - - :0 E - *$ B ?? ()\/[^$JA_UBE_CHARSET_LEGAL] - { - ERROR = "${ERROR}${ERROR+:}BodyCharacters-Illegal" - ERROR_MATCH = $MATCH - } -} - -:0 -*$ $SUPREME^0 ^Content-Type:.*\/$charset[^ \"'<>]* -*$ $SUPREME^0 ^Subject:.*=[?]\/$charset[^ '\"<>]* -{ - ERROR = "${ERROR}${ERROR+:}HeaderMimeCharset-Illegal" - ERROR_MATCH = "$MATCH" -} - -:0 -*$ B ?? charset=.*\/$charset[^ '\"<>]* -{ - ERROR = "${ERROR}${ERROR+:}BodyMimeCharset-Illegal" - ERROR_MATCH = "$MATCH" -} - -# }}} -# {{{ Header: Apparently-To - -# One typical UBE is where there is multiple apparently-to headers -# -# Apparently-To: -# Apparently-To: -# Apparently-To: -# Apparently-To: -# Apparently-To: - -:0 -* ERROR ?? ^^^^ -*$ -$JA_UBE_MAX_APPRENTLY_TO^0 -* 1^1 ^Apparently-To: -{ - ERROR = "Header-ApparentlyTo" - ERROR_MATCH = "$= too many" -} - -# }}} -# {{{ Header: X-uidl - -# Headers that shouldn't exist in "real" mail -# -# Might need to be a little more particular here; -# Philip Guenther <guenther@gac.edu>: If a message comes into your -# mailbox that has the X-UIDL: header, and doesn't have your address in -# the header, then I would have strong doubts about it's legitimacy. -# -# Edward J. Sabol <sabol@alderaan.gsfc.nasa.gov>: E-mails with -# X-UIDL: headers are almost definitely spam unless they've been -# Resent-To: me by someone. Also, valid X-UIDL: headers have 32 hexadecimal -# digits exactly. - -hex8 = "$h$h$h$h$h$h$h$h" - -:0 -* ERROR ?? ^^^^ -* ^X-UIDL: -*$ ! ^X-UIDL:$WSPC*\/$hex8$hex8$hex8$hex8$WSPC*$ -* ! ^Resent-To: -{ - ERROR = "HdrX-UIDL" - ERROR_MATCH = $MATCH -} - -# }}} -# {{{ Header: bogus Pegasus - -# 1998-08-24 Gregory kindly sent update to this filter. Thank you. -# -# Pegasus mailer is the only mailer which legitimately generates -# "Comments: Authenticated sender is ..." so kill anything else. -# --Gregory S. Sutter <foo@xample.com> -# -# Pegasus mailer is the only mailer which legitimately generates -# "Comments: Authenticated sender is ..." so kill anything else. -# This works for Pegasus versions 2.54 and below only, 2.55 and -# above don't generate the Authenticated Sender header. - -:0 -* ERROR ?? ^^^^ -* ^Comments:.*Authenticated sender -* ! ^X-Mailer:.*Pegasus Mail -* ! ^Resent-To: -* ! ^Return-Path:.*owner- -{ - ERROR = "HdrForgedPegasus" - # ERROR_MATCH = $MATCH # what should be saved here? -} - -# }}} -# {{{ Header: Received - -# ........................................................ &received ... - -# Spamford's "Cyber-Bomber" generates "CLOAKED!" headers. -# The following also catches bogus IP addresses - -:0 -* ERROR ?? ^^^^ -* ^Received: \/.*(CLOAKED|\[(0)+\.(0)+\.(0)+\.(0)+\]).* -{ - ERROR = "HdrReceived $MATCH" - ERROR_MATCH = $MATCH -} - -# Stealth Mailer bogus timestamp - -:0 -* ERROR ?? ^^^^ -* ^Received: \/.*-0[67]00 \(E[SD]T\) -{ - ERROR = "HdrReceivedTime" - ERROR_MATCH = $MATCH -} - -# by wwgrol@sparc01.fw.hac.com (W. Wesley Groleau x4923) -# Check that suspicious From site is mentioned in the Received headers - -:0 -* ERROR ?? ^^^^ -*$ ! ^(From|To|Cc):.*$JA_UBE_VALID_ADDR -* ^Received: -*$ ^From:.*\/$JA_UBE_FROM_QUESTIONABLE -*$ ! ^Received:.*\/$MATCH -{ - ERROR = "FromReceived-Mismatch" - ERROR_MATCH = $MATCH -} - -# }}} - -# ......................................................... &Address ... - -# {{{ Address: Numeric - -:0 -* ERROR ?? ^^^^ -* JA_UBE_FLAG_NUM_ADDR ?? yes -*$ ^From:\/$WSPC*$d+@.* -{ - ERROR = "AddrNumeric" - ERROR_MATCH = $MATCH -} - -# Bogus, all-numeric domain names: - -:0 -* ERROR ?? ^^^^ -* ^(From|To|Reply-To): \/.*@[0-9]+\..* -{ - ERROR = "AddrNumericDomain" - ERROR_MATCH = $MATCH -} - -# }}} -# {{{ Address: Invalid AOL - -# By John Gianni <jjg@cadence.com> -# -# From Postmaster@aol.com: Valid AOL address can not: -# -# - be shorter than 3 or longer than 10 characters -# - begin with numerals -# - contain periods, underscores, dashes or other punctuation -# -# Valid AOL mail will have a short, verifiable Received path directly -# from a resolvable host within AOL.COM to your mail host. Valid AOL -# address are 10 characters or less and also has to begin with a -# letter and not a number also. -# -# If AOL address starts with anything else but A-Z; then it must be bogus. - -:0 -* ERROR ?? ^^^^ -* ^From: \/.*@aol\.com -* ! ^From: *([^a-z]|.+[^0-9a-z]|............).*@ -{ - ERROR = "AddrAOLinvalid" - ERROR_MATCH = $MATCH -} - -# }}} -# {{{ Address: Bogus - -:0 -* ERROR ?? ^^^^ -{ - - # Originally by Daniel Smith - - word = "[a-z0-9][-a-z0-9_.+]*" - word2 = "[-a-z0-9]" - - # See "Top Level Domains (gTLDs)" http://www.icann.org/tlds/ - - tld = "(\ -aero\ -|arpa\ -|biz\ -|com\ -|coop\ -|edu\ -|gov\ -|info\ -|int\ -|mil\ -|museum\ -|name\ -|net\ -|org\ -|pro\ -|[a-z][a-z]\ -)" - -} - -:0 -* ERROR ?? ^^^^ -*$ ! ^From:\/.*$word@($word2+\.)+$tld -{ - ERROR = "AddrBogus-From" - ERROR_MATCH = $MATCH -} - -:0 -* ERROR ?? ^^^^ -*$ ! $SUPREME^0 (To|Cc):.*$JA_UBE_VALID_ADDR -*$ ! $SUPREME^0 (To|Cc):.*$word@($word2+\.)+$tld -{ - :0 - * (To|Cc):\/.* - *$ MATCH ?? $NSPC.+$NSPC - { } - - ERROR = "AddrInvalid-To" - ERROR_MATCH = $MATCH -} - -# If the From: line contains a @ but no . after it, it's suspect -# By Era eriksson - -:0 -* ERROR ?? ^^^^ -* ^From:\/.*@[^ >]+>? -*$ ! ^From:.*@[^.]+\. -{ - ERROR = "AddrInvalid-From" - ERROR_MATCH = $MATCH -} - -# }}} -# {{{ Address: UBE-like - -:0 -* ERROR ?? ^^^^ -*$ ()\/(${JA_UBE_FROM}|^TO)(remove|delete|\<free\>|friend@) -{ - ERROR = "AddrUbeLike" - ERROR_MATCH = $MATCH -} - -# }}} -# {{{ Header: From-To, To-Cc - -# By Era Eriksson, Sun, 08 Feb 1998 in procmail mailing list -# The lone "To" is purely for logging purposes to record MATCH - -:0 -* ERROR ?? ^^^^ -* JA_UBE_FLAG_IDENTICAL_FROM_TO ?? yes -*$ ! ^(From|To|Cc):.*$JA_UBE_VALID_ADDR -* ^To: \/.* -* $ ^\/(From|Reply-To): $\MATCH -{ - ERROR = "Identical-FromTo" - ERROR_MATCH = $MATCH -} - -# If the message is not directly addressed to ME, then It's suspect. -# Be sure to handle mailing lists before you call this file !! - -:0 -* ERROR ?? ^^^^ -* JA_UBE_FLAG_TO_CC ?? yes -* ! FROM_DAEMON -* ^(To|Cc):\/.* -*$ ! ^(To|Cc):.*$JA_UBE_VALID_ADDR -{ - ERROR = "NoDirectAddress-ToCc" - ERROR_MATCH = $MATCH -} - -# }}} -# {{{ Text: Marketing slogans - -# ....................................................... &marketing ... -# Notice that the MATCH is set to text line that triggered the UBE - -dummy = "pm-jaube.rc: Marketing-CaseSensitive" - -# Case sensitive tests - -:0 D -* ERROR ?? ^^^^ -* JA_UBE_FLAG_TEXT_MARKET ?? yes -* HB ?? ()\/\<(\ - GUARANTEED|OFFER|BONUS|CREDIT\ - |LEGAL(LY)?|SECRET|\<CLICK\>\ - |NO RISK|MAKE.*MONEY\ - |MILLION|THOUSEND\ - ).* -{ - ERROR = "Marketing-SelectedBigLetterWords" - ERROR_MATCH = $MATCH -} - -dummy = "pm-jaube.rc: Marketing-Headers" - -# If there is a dollar in header(subject), this is ube. - -:0 -* ERROR ?? ^^^^ -* JA_UBE_FLAG_TEXT_MARKET ?? yes -*$ ^Subject:.*()\/(\$[0-9]|[0-9]$WSPC*%|\<Free\>|!!+) -* ! SUBJECT ?? Returned mail -{ - ERROR = "Marketing-Subject" - ERROR_MATCH = $MATCH -} - -dummy = "pm-jaube.rc: Simple headers, dollar body" - -:0 -* ERROR ?? ^^^^ -* JA_UBE_FLAG_TEXT_MARKET ?? yes -*$ ^Subject:$WSPC*((fwd|re):)*$WSPC*$JA_UBE_SUBJECT_GREETING -*$ ^Subject:()\/.* -*$ B ?? $money -{ - ERROR = "Marketing-SubjectGreeting" - ERROR_MATCH = $MATCH -} - -dummy = "pm-jaube.rc: Marketing body" - -# "Earn" must not match "learn" -# Some marketing people try to be clever, they send -# -# for just $19.95, for incredible $19.95, for the sum 19.195 -# for 19.95 -# -# So we match anything that has "for" and NN+.N+. There must not be -# dollar in from, because the marketing could also use English pounds -# or some other currency. -# -# \<for\>.*\<[0-9][0-9.]*\> - -:0 -* ERROR ?? ^^^^ -* JA_UBE_FLAG_TEXT_MARKET ?? yes -*$ B ?? ()\/\ - \<(naked|women|girls|nude)\>\ - |\<(babe|chick|blonde|brunette|cash|sex|hardcore|viagra)\>\ - |\<(promote|earn|porn|drug\ - |make.*money\ - |Money making\ - |Make \$[0-9]\ - |(Low|fair|these) +price\ - |price.*\<range\ - |want to buy\ - |bulk email\ - |No Credit Check\ - |this is your chance\ - |The most incredible stuff\ - |You have nothing to lo*se\ - |weight control\ - |lifetime membership\ - |Internet Business\ - |order(ing)? (now|form)\ - |are.*you.*looking for\ - |global.*Advertis\ - |marketing resource\ - |Don't waste.*(dollars|money)\ - |bring to your attention\ - |limited.*(trial|time)\ - |our.*offerings\ - |We.*(guarantee|seek)\ - |\<(for|cost)\>.*$[0-9][0-9.]\ - |This offer\ - |FREE.*(offer|bonus|sample)\ - |as low as.*$[0-9]\ - |$money1\ - |send \$.* to\ - |save up.*to.*%\ - |save as much as.*[$%]\ - |sav(e|ing).*money\ - |Delete if not interested\ - |wish to be (excluded|removed)\ - |to our remove list\ - |Remov(al|e) instruction\ - |to be removed from.*list\ - |to reply to remov\ - |you were.*selected\ - |life style\ - |phone card\ - |long distance\ - |Life Insurance\ - |forgive the intrusion\ - |Your.*(bonus|marker)\ - |(visit|Welcome).*our.*Web ?site\ - |(CALL|visit).*\<(us|today)\>\ - |webcam\ - |Response +needed\ - )$S*$WSPC*$S* -*$ MATCH ?? $NSPC -{ - ERROR = "Marketing-Body" - ERROR_MATCH = $MATCH -} - -dummy = "pm-jaube.rc: Virus message" - -:0 -* ERROR ?? ^^^^ -{ - regexpBody = "\ -Attenzione Virus\ -|Returned due to virus\ -|[]{<(]virus[]})>]\ -|InterScan NT Alert\ -|Message quarantined\ -|Filter incident\ -|Symantec AVF detected\ -|banned filename .*in mail from you\ -|File blocked - ScanMail for Lotus\ -|MDaemon Notification -- Attachment Removed\ -|SAV detected a violation in a document\ -|MailMarshal has detected a suspect attachment\ -|Security Alert - ScanMail for Lotus Notes\ -|Skynet Mail Protection scan results\ -|Vexira ALERT\ -|You sent potentially unsafe content\ -" - - # These are too general to appear in Body. - - regexpHeader = "\ -virus(es|ii)?.*\<(alert|warn|detect|remov|found|infect|notif|scan|mail)\ -|\<(alert|warn|detect|remov|found|infect|notif|scan|mail|sen[dt]).*virus\ -|\<(contained).*virus\ -|\<anti-?vir(us)?\>\ -|virus.*(gefunden|encontrado|enviado|correo)\ -|$regexpBody\ -" - -} - -:0 -* ERROR ?? ^^^^ -* JA_UBE_FLAG_TEXT_VIRUS ?? yes -*$ ()\/($regexpHeader)$S*$WSPC*$S* -{ - ERROR = "VirusHeader" - ERROR_MATCH = $MATCH -} - -:0 -* ERROR ?? ^^^^ -* JA_UBE_FLAG_TEXT_VIRUS ?? yes -*$ B ?? ()\/($regexpBody)$S*$WSPC*$S* -{ - ERROR = "VirusBody" - ERROR_MATCH = $MATCH -} - -# }}} -# {{{ score: big letters - -# Count full words whose all letters have been capitalized -# - If must not be uuencoded message, -# - Ignore some commond words like: IP AM SMTP -# - Word must have at least 3 big letters - -dummy = "pm-jaube.rc: CHECK BigLetterWords" - -:0 D -* ERROR ?? ^^^^ -* jaubeHTML ?? no -* jaubePGPmessage ?? no -*$ ! JA_UBE_CAPS_OK ?? ^^^^ -*$ -$JA_UBE_MAX_BIG_WORDS^0 -*$ B ?? -1^1 ()$JA_UBE_CAPS_OK -* B ?? 1^1 ()\/\<[A-Z][A-Z][A-Z]+\> -{ - ERROR = "Marketing-CountBigLetterWords" - ERROR_MATCH = "$= too many" -} - -# }}} -# {{{ text: html - -# Raw HTML, but missing MIME definition headers. -# Or you could match B ?? ()<(body[^<>]*|html)> - -:0 -* ERROR ?? ^^^^ -*$ B ?? ^^$SPCL*<html> -* ! H ?? ^(Mime-Version\\|Content-Type): -{ - ERROR = "BodyHtml-NonMime" - ERROR_MATCH = $MATCH -} - -:0 -* ERROR ?? ^^^^ -* HB ?? ^Content-Type:.*/html -* HB ?? ^Content-Transfer-Encoding:.*base64 -* HB ?? ^\/Subject:.* -{ - ERROR = "Html-base64" -} - -# The Javascript, VBscript - -:0 -* ERROR ?? ^^^^ -* B ?? ()<html> -* B ?? ()\/<$SPC*script$SPC*(lang.+)?> -* B ?? </$SPC*script$SPC*> -{ - ERROR = "BodyHtml-script" - ERROR_MATCH = $MATCH -} - -:0 -* ERROR ?? ^^^^ -*$ -$JA_UBE_MAX_HTML_TAGS^0 -* B ?? 1^1 ()\/</?(body|html|ul|ol|dl|dd|dt|li|br|p|pre|font\ - |h[123456]|table|tr|td)> -{ - ERROR = "BodyHtmlTags" - ERROR_MATCH = "$= too many" -} - -:0 -* ERROR ?? ^^^^ -* B ?? ^Content-Type:.*text/html -* B ?? ^Content-Transfer-Encoding:.*base64 -{ - ERROR = "BodyHtmlBase64" - # ERROR_MATCH = $MATCH -} - -:0 -* ERROR ?? ^^^^ -*$ B ?? ()<img$WSPC+src$WSPC*=.*http -{ - ERROR = "BodyHtmlImage" - # ERROR_MATCH = $MATCH -} - -# Known MEGA Spammers -# -# They send 20Million spams a day! Try this (and we'll count -# lines, not strings, just in case "cyberpromo.com" occurs twice in -# the subject: for example, a legitimate letter from a friend has a -# subject of "I'm sick of cyberpromo.com! Damn cyberpromo.com to -# hell!"). -# -# 1^1 ^.*\<cyberpromo\.com\> -# * -1^1 ^Subject:(.*\<)?cyberpromo.com\> -# -# While less "perfect", I can never remember the scoring rules, and I'd -# likely use something like the following; plus, it's probably faster: -# This catches "cyberpromo.com" in any header not starting with "S", and -# it happens that none of the ones we need to catch it in start with "S", -# so it probably works the same on "real-life" mail headers. The -# condition can be modified to check for headers not starting with "Su" -# by changing it to: -# -# * ^([^S]|S[^u]).*\<cyberpromo\.com\> -# -# if needed; further extensions should be obvious.) - -:0 -* ERROR ?? ^^^^ -* ^[^S].*\/\<cyberpromo\.com\> -{ - ERROR = "MegaSpammer" - ERROR_MATCH = $MATCH -} - -# }}} -# {{{ nslookup - -dummy = "pm-jaube.rc: Check nslooup" - -# Check if From address has valid domain. We can't check address, but this -# is closest we get. This check must be at the end so that faster "text" -# test are applied first. - -:0 -* ERROR ?? ^^^^ -* JA_UBE_FLAG_FROM_NSLOOKUP ?? yes -* ^From:\/.* -{ - INPUT = $MATCH - INCLUDERC = $PMSRC/pm-jaaddr.rc # explode address string - ERROR - - :0 - *$ SITE ?? $a - { - INPUT = $SITE - INCLUDERC = $PMSRC/pm-janslookup.rc - - :0 - * ERROR ?? yes - { - ERROR_MATCH = "From $SITE nslookup fail/$ERROR_MATCH" - ERROR = "From-nslookup" - } - :0 E - { - ERROR # Clear variable - } - } -} - -# }}} - -# ..................................................... &final-check ... - -:0 -* ! ERROR ?? ^^^^ -{ - ERROR_STATUS = "Bad" - - :0 - * ! JA_UBE_HDR ?? ^^^^ - { - jaubeHeader = "$JA_UBE_HDR: $ERROR_STATUS $ERROR $ERROR_MATCH" - - # Check if ERROR_MATCH is not set (empty) - - :0 - * ERROR_MATCH ?? ^^^^ - { - jaubeHeader = "$JA_UBE_HDR: $ERROR_STATUS $ERROR" - } - - :0 fhw - | ${FORMAIL:-"formail"} -I "$jaubeHeader" - } - - # If AWK fails, then we see "Rescue of unfiltered data succeeded" - # This might be due to message being too big - - :0 fbiw - * ERROR ?? Attachment.*FileSuspect - * JA_UBE_ATTACHMENT_SUSPECT_KILL ?? yes - * B ?? base64 - | $AWK '/[bB]ase64|BASE64/ { exit } { print }' - - :0 E fbiw - * ERROR ?? Attachment.*FileIllegal - * JA_UBE_ATTACHMENT_ILLEGAL_KILL ?? yes - * B ?? base64 - | $AWK '/[bB]ase64|BASE64/ { exit } { print }' -} - -dummy = "pm-jaube.rc: end: $ERROR" - -# pm-jaube.rc ends here diff --git a/src/procmail/pm-jaube1.rc b/src/procmail/pm-jaube1.rc @@ -1,67 +0,0 @@ -# pm-jaube1.rc -- Jari's UBE filter. Subroutine 1 -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Documentation -# -# This file is part of the "pm-jaube.rc". This subroutine is called -# when likely UBE message has been triggered. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This recipe file -# will include -# -# o pm-jastore.rc -# -# Change Log (none) - -# ............................................................ &code ... -# - -id = "pm-jaube1.rc" -dummy = " -======================================================================== -$id: init: -" - - -# Should we write log message to file which identifies this UBE - -:0 hic: $JA_UBE_LOG$LOCKEXT -* JA_UBE_LOG ?? [a-z] -|echo " [jaube; $ERROR; $ERROR_MATCH]" >> $JA_UBE_LOG - - -# Add new header to the message - -:0 fhw -* JA_UBE_HDR ?? [a-z] -| $FORMAIL -A "$JA_UBE_HDR: $ERROR, $ERROR_MATCH" - -# Should it be stored directly? - -:0 -* JA_UBE_MBOX ?? [a-z] -{ - MBOX = $JA_UBE_MBOX - INCLUDERC = $RC_STORE -} - -dummy = "$id: end:" - - -# pm-jaube1.rc ends here diff --git a/src/procmail/pm-javac.rc b/src/procmail/pm-javac.rc @@ -1,144 +0,0 @@ -# pm-javac.rc -- Procmail: Vacation framework recipe (id-cache) -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# Framework for all programs that need to reply to messages only once. -# Usually known as "vacation" feature. If you cahnge th cache file, -# you can attach this recipe to any messages that you want to deal with -# only once. -# -# Required settings -# -# PMSRC must point to source directory of procmail code. This subroutine -# will include -# -# o pm-javar.rc -# -# Call arguments (variables to set before calling) -# -# o JA_VAC, To activate vacation, set value to "yes" -# o JA_VAC_RC, When new message-id is found, run this includerc -# o JA_VAC_ID_CACHE, Remember to clear this file when you start -# the vacation. -# -# Usage example -# -# To turn on the vacation feature, create ~/.vac file and recipe below -# activates vacation. If the vacation is not active, then cache file -# is removed. (automatic cleanup). The VERBOSE is also turned off -# when you're on vacation; so that your procmail log will not get -# filled. -# -# So when you go to vacation, you 'touch ~/.vac' and update -# ~/vacation.msg. When you come back, you 'rm ~/.vac'. That's it. -# -# IMPORTANT: If you are subscribed to mailing lists, be sure to file -# messages from those services first and put the vacation recipe -# only after the list or bot messages. Also add sufficent "!" conditions -# in order not to reply to other "bot" service messages. -# -# JA_VAC_ID_CACHE = $HOME/.pm-vac.cache -# -# :0 -# *$ ? $IS_EXIST $HOME/.vac -# { -# VERBOSE = off -# JA_VAC = "yes" -# JA_VAC_RC = $PMSRC/pm-myvac.rc # my vacation recipe -# INCLUDERC = $PMSRC/pm-javac.rc # framework -# } -# :0 E # else -# * ? $IS_EXIST $JA_VAC_ID_CACHE -# { -# dummy = `$RM -f $JA_VAC_ID_CACHE` -# } -# -# Here is example of pm-myvac.rc recipe -# -# # Change subject -# -# :0 fhw -# * ^Subject: *\/[^ ].* -# | $FORMAIL -I "Subject: vacation (was: $MATCH)" -# -# :0 fb # put message to body -# | $CAT $HOME/.vacation.msg -# -# :0 # Send it -# | $SENDMAIL -# -# Change Log (none) - -dummy = " -======================================================================== -pm-javac.rc: init:" - -:0 -* ! WSPC ?? [ ] -{ - INCLUDERC = $PMSRC/pm-javar.rc -} - -# .......................................................... &public ... - -JA_VAC = ${JA_VAC:-"no"} -JA_VAC_RC = ${JA_VAC_RC:-""} -JA_VAC_XLOOP = ${JA_VAC_XLOOP:-"$LOGNAME@$HOST X-loop"} -JA_VAC_ID_CACHE = ${JA_VAC_ID_CACHE:-"$HOME/pm-vac.cache"} -JA_VAC_ID_CACHE_SIZE = ${JA_VAC_ID_CACHE_SIZE:-8192} - -# ........................................................... &do-it ... -# - The `! precedence' match should prevent from replying to "bot" -# messages -# - Mailing lists should use type "list" - -:0 -* JA_VAC ?? yes -*$ ! $JA:FROM_DAEMON -*$ ! ^X-Loop: $JA_VAC_XLOOP -* ! ^Precedence:.*(bulk|list|junk) -* JA_VAC_RC ?? [a-z] -{ - dummy = "pm-javac.rc: checking." - - oldLock = $LOCKFILE - LOCKFILE = ${JA_VAC_ID_CACHE}${LOCKEXT} - - :0 c - * ! ? $FORMAIL -rD $JA_VAC_ID_CACHE_SIZE $JA_VAC_ID_CACHE - { - # Compose reply and add some basic headers - - :0 fhw - | $FORMAIL -rt \ - -A "Precedence: junk" \ - -A "X-Loop: $JA_VAC_XLOOP" - - :0 a # Formail succeeded - { - # New user, call this rc to send a reply - INCLUDERC = $JA_VAC_RC - } - } - - LOCKFILE = $oldLock -} - -dummy = "pm-javac.rc: end:" - -# End of file diff --git a/src/procmail/pm-javar.rc b/src/procmail/pm-javar.rc @@ -1,562 +0,0 @@ -# pm-javar.rc -- Global variable definitions -# -# File id -# -# Copyright (C) 1997-2010 Jari Aalto -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or (at your option) any later version -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details at -# <http://www.gnu.org/copyleft/gpl.html>. -# -# Description -# -# This file defines common variables that you can use in the recipe's -# condition line. Procmail does not know about escape sequences -# like `\t' or `\n' and it is therefore much more readable to use -# variables as substitute for common regular expression -# atoms. Pay attention that the line starts with "*$ ", where -# "$" expands the variables: In this file, the variable names -# represent the well known Perl regular expression names, so -# that $s is alost like Perl expression \s (whitespace) and $S -# is almost equivalent to `\S' (non-whitespace). Similarly, $d is -# `\d' (digit) and $D resembled `\D' (non-digit). -# -# :0 -# *$ $s+something+$s+$d+$a+ -# -# The equivalent without variables (you don't see the tabs and -# spaces here): -# -# :0 -# # Space + tab -# * [ ]something[ ][0-9]+[a-z]+ -# -# -# In addition all system dependent variables are defined in this module. -# For example if you have Gnu awk, it is strongly suggest that you set: -# -# AWK = "/path/to/gawk" # in Linux, this would be /usr/bin/awk -# -# You can define these variables before or after the module, just make -# sure the binaries reflect your operating system's paths. In general, -# if you "port" your setup to several system, dont' include absolute -# paths. In the other hand, if your setup is in the same place using -# absolute paths will speed up executions by a factor of 3 or more. -# (depending on how long your PATH is) -# -# Standard variables defined -# -# See pm-tips.txt file for full explanation or look at the source code. -# -# SPC WSPC NSPC SPCL # Whitespace, Non Whitespace, W+linefeed -# \s \d \D \w \W and \a \A # perl equivalents -# -# Special variable JA_FROM_DAEMON -# -# In order to boost procmail and to save extra CPU cycles, this module -# defines variable `JA_FROM_DAEMON' that caches the information of -# ^FROM_DAEMON. You can refer to `JA_FROM_DAEMON' as you would to -# big brother FROM_DAEMON. This has the advantage that procmail -# has already computed the result and the variable `JA_FROM_DAEMON' -# is used as a cache, thus avoiding repeated FROM_DAEMON regexp -# tests, which are expensive. Variable `JA_FROM_DAEMON_match' -# contains "" or the result of matched daemon text. -# -# *$ $JA_FROM_DAEMON -# -# or the familiar -# -# *$ ! $JA_FROM_DAEMON -# -# Instead of using the regexp parsing with -# -# * ^FROM_DAEMON -# -# and -# -# * ! ^FROM_DAEMON -# -# Special variable JA_FROM_MAILER -# -# Works like `JA_FROM_DAEMON' variable but in respect to FROM_MAILER. -# The matches text is in `JA_FROM_MAILER_MATCH' -# -# Usage example -# -# For your .procmailrc, you can simply put this, because you -# want to load the variables at startup -# -# PMSRC = "/path/to/install/location/of/this/library" -# INCLUDERC = $PMSRC/pm-javar.rc -# -# If you're developing your own modules that use these variables -# put these lines at the beginning. `~/.procmailrc'. It checks -# if WSPC variable does not include a space --> load the -# variable definitions. If the variable is already defined, the -# file is not loaded. The test line is something alike #ifdef -- -# #endif in C/C++ language or a conditional "import" command in -# other languages. -# -# :0 -# * ! WSPC ?? [ ] -# { -# INCLUDERC = $PMSRC/pm-javar.rc -# } -# -# Defined modules -# -# After this file loads, you can refer to any module with $RC_JA_MODULE. -# E.g. to call email spit module in your code you would use following. -# See at the end of this file for all defined module names. -# -# INCLUDERC = $RC_JA_UBE -# -# Change Log (none) - -dummy = " -======================================================================== -pm-javar.rc: init:" - -# pure newline, you could use is like: -# LOG = "message $NL" - -NL = " -" -LF = $NL # synonym, linefeed -CR = " " # Carriage return -TAB = " " # \t character, you won't see it. -WSPC = " $TAB" # whitespace in procmail: space + tab - -# These are the variables that you're likely to use in -# condition lines. Notice that there is Perl styles `s' variable -# for shorter name for most used SPC. - -SPC = "[$WSPC]" # Regexp space/tab -NSPC = "[^$WSPC]" # Negation, non-whitespace - -# Whitespace with linefeed -# Note that in regexps, the character class is faster that OR. -# Refer to O'Reilly book "Mastering Regular Expressions" -# -# space + tab + dollar -# -# ( | |$) is slower than ([ ]|$) - -SPCL = "($SPC|$|$CR)" # space or tab; linefeed; Carriage return - -# ..................................................... &perl-styled ... -# http://www.perl.com/ -# Shorter variable names, mimic perl token names. - -n = "$NL" # Newline -- Perl \n -t = "$TAB" # Tab -- Perl \t -s = "$SPC" # whitespcae -- Almost like perl \s -S = "$NSPC" # Non-Whitespace -- Almost like Perl \S -d = "[0-9]" # digit -- Perl \d -D = "[^0-9]" # Non-digit -- Perl \D -w = "[0-9a-z_A-Z]" # word -- Perl \w -W = "[^0-9a-z_A-Z]" # Non-word -- Perl \W - -# No perl equivalents for these, but handy anyway. - -a = "[a-zA-Z]" # alphabetic (7 bit) -A = "[^a-zA-Z]" # Non-alphabetic -h = "[0-9a-fA-F]" # Hex value -H = "[^0-9a-fA-F]" # Non-Hex value - -# ............................................................ &misc ... - -SUPREME = "9876543210" # The highest score value. See pm-tips.txt -OR = "$SUPREME" # Multiline OR-ing in score recipes -NOR = "-$SUPREME" - -# For IP addresses - -OCTET = "([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])" -DOTQUAD = "$OCTET[.]$OCTET[.]$OCTET[.]$OCTET" - - -# Getting month or month-number matches. See pm-jadate*rc modules -# for examples. - -mm2nbr = "Jan01Feb02Mar03Apr04May05Jun06Jul07Aug08Sep09Oct10Nov11Dec12" -nbr2mm = "01Jan02Feb03Mar04Apr05May06Jun07Jul08Aug09Sep10Oct11Nov12Dec" -weekdays = "(Sun|Mon|Tue|Wed|Thu|Fri|Sat)" - -TMPDIR = ${TMPDIR:-"/tmp"} - -# ........................................................ &programs ... -# Substitute these with absolute path names and binaries will run faster - -FORMAIL = ${FORMAIL:-"formail"} -PROCMAIL = ${PROCMAIL:-"procmail"} - -# Don't ever leave out flags -oi and -t - -SENDMAIL_FLAGS = "-oi -t" -SENDMAIL = ${SENDMAIL:-"sendmail $SENDMAIL_FLAGS"} - -# This _must_ be Perl 5.x version. Old version 4.0 is way too old -# and obsolete for statements like BEGIN{} - -PERL = ${PERL:-"perl"} - -LS = ${LS:-"/bin/ls"} -LS_BY_DATE = ${LS:-"/bin/ls -t"} -TR = ${TR:-"/bin/tr"} -RM = ${RM:-"/bin/rm"} -MV = ${MV:-"/bin/mv"} -CP = ${CP:-"/bin/cp"} -CAT = ${CAT:-"/bin/cat"} -SED = ${SED:-"/bin/sed"} -AWK = ${AWK:-"awk"} - -RMDIR = ${RMDIR-"/bin/rmdir"} -MKDIR = ${MKDIR-"/bin/mkdir"} - -TOUCH = ${TOUCH:-"touch"} -CHMOD = ${CHMOD:-"chmod"} -DATE = ${DATE:- "date"} # must accept POSIX % escapes as date(1) - -EGREP = ${EGREP:-"egrep"} -FGREP = ${EGREP:-"fgrep"} -GREP = ${EGREP:-"egrep"} # use "grep -E" if you have GNU version -NSLOOKUP = ${NSLOOKUP:-"nslookup"} -GZIP = ${GZIP:-"gzip"} -BZIP = ${BZIP:-"bzip2"} # Name BZIP is shorter than pedantic BZIP2 - -# ............................................................ &test ... -# The `test' command is not identical on every operating system, so they -# must be put behind variables. E.g. On Irix the -e -# option is not recognized so IS_EXIST must be changed to -r there. - -IS_READABLE = ${IS_READABLE:-"test -r"} -IS_EXIST = ${IS_READABLE:-"test -e"} -IS_EXECTABLEU = ${IS_READABLE:-"test -x"} -IS_FILE = ${IS_READABLE:-"test -f"} -IS_DIR = ${IS_READABLE:-"test -d"} -IS_NOT_EMPTY = ${IS_READABLE:-"test -s"} # exist and not empty - -# ............................................................ &mime ... -# Mime decode commands: Install package 'metamail' if the system -# does not have program `mimencode'. -# See <ftp://ftp.funet.fi/pub/unix/mail/metamail> and "mm2.7*" -# Metamail's description: -# -# Collection of MIME handling utilities Metamail is an implementation of -# MIME, the Multipurpose Internet Mail Extensions, a proposed standard -# for multimedia mail on the Internet. Metamail implements MIME, and also -# implements extensibility and configuration via the "mailcap" mechanism -# described in an informational RFC that is a companion to the MIME -# document. - -MIME_BIN = ${MIME_BIN:-"mimencode"} -MIME_BIN_QP = ${MIME_BIN_QP:-"$MIME_BIN -u -q"} # decode Quoted printable -MIME_BIN_64 = ${MIME_BIN_64:-"$MIME_BIN -u -b"} # decode base64 - -# encode commands with "E" at the end - -MIME_BIN_QP_E = ${MIME_BIN_QPE:-"$MIME_BIN -q"} -MIME_BIN_64_E = ${MIME_BIN_64E:-"$MIME_BIN -b"} - -# ...................................................... &exit-codes ... -# These should be pretty standard. See /usr/include/sysexits.h - -EX_OK = 0 # successful termination -EX__BASE = 64 # base value for error messages - -EX_USAGE = 64 # command line usage error -EX_DATAERR = 65 # data format error -EX_NOINPUT = 66 # cannot open input -EX_NOUSER = 67 # addressee unknown -EX_NOHOST = 68 # host name unknown -EX_UNAVAILABLE = 69 # service unavailable -EX_SOFTWARE = 70 # internal software error -EX_OSERR = 71 # system error (e.g., can't fork) -EX_OSFILE = 72 # critical OS file missing -EX_CANTCREAT = 73 # can't create (user) output file -EX_IOERR = 74 # input/output error -EX_TEMPFAIL = 75 # temp failure; user is invited to retry -EX_PROTOCOL = 76 # remote error in protocol -EX_NOPERM = 77 # permission denied - -# ........................................................ &messages ... -# Reserve string variables - -JA_MSG_ERROR = "ERROR: *** " # Message follows after this -JA_MSG_ERROR_FATAL = "ERROR: FATAL: *** " # Message follows after this - -# ................................................... character sets ... -# Define character sets grouped by language. -# Contact: <PSE-L@mail.professional.org> -# 2004-04-16 included from http://www.professional.org/procmail/furrin.rc -# See thread "furrin character sets" 2203-02-22 at -# http://info.ccone.at/INFO/Mail-Archives/procmail/Feb-2003/threads.html#00521 - -# In emacs, you can generate any character: See key C-x 8 C-h -# -# There are entities: u umlaut (small/big), SZ ligature -CHAR_LIST_GERMAN = "üÜß" - -# These are entities: a A ring, a A umlaut, o O umlaut -CHAR_LIST_FINLAND = "åÅäÄöÖé" -CHAR_LIST_SWEDEN = $CHAR_LIST_FINLAND - -# included entity: o slash -CHAR_LIST_NORWAY = "$CHAR_LIST_FINNISHøØ" - -# included entity: ae AE ligature -CHAR_LIST_DENMARK = "æÆ" - -CHAR_LIST_SCANDINAVIAN = "\ -$CHAR_LIST_FINLAND\ -$CHAR_LIST_NORWAY\ -$CHAR_LIST_DENMARK\ -" - -# You can make regular expressions like: -# -# unclean7bit = "[^$CHAR_7BIT_SET]" -# -# :0 : -# * HB ?? unclean7bit -# spam - -# Newline -CHAR_7BIT_CONTROL = " " - -CHAR_7BIT_PUNCTUATION = "-+^~\"\'\`&/\\|*@%!?,.:;\(\){}<>\[\]\$#" - -CHAR_7BIT_SET = "$TAB !-~" # This is range: from SPC to TILDE. -CHAR_7BIT_SCANDINAVIAN_SET = "$CHAR_7BIT_SET$CHAR_LIST_SCANDINAVIAN" - -CHARSET_JP = "WINDOWS-932|EUC-JP|(cs-?)?ISO-?2022-?JP(-[12])?|ISO-2022-D\ -|SHIFT[-_]JIS|JIS[-_]?X[-_]?02(08|01|12|13)|sjis|jis7|ms-kanji\ -|(x-)?mac(-)?japanese|x-EBCDIC-Japanese(Katakana|AndUSCanada\ -|AndJapaneseLatin|AndKana)" - -CHARSET_CN = "WINDOWS-(936|950)|EUC-CN|(hz-|x-euc-tw)?GB[-_]?2312\ -|(cn-)?(BIG5|gb)|ISO-2022-([EGHIJKLM]|cn|cn-ext)|ISO-IR-165\ -|GB8565\.2(-1988)?|x-euc-tw|hz|iso-ir-58|gbk|big5-hkscs|gb18030\ -|(x-)?mac(-)?chinese(trad|imp)|iso-ir-58\ -|x-EBCDIC-(Traditional|Simplified)Chinese|x-Chinese-(CNS|eten)" - -# non-standards compliant variations of chinese - -CHARSET_CN_BOGUS = "CHINESEBIG5|BIG-5" - -CHARSET_KR = "WINDOWS-949|EUC-KR|KS[-_ ]?C[-_ ]?5601([-_ ]?1987)?\ -|ISO-2022-(C|kr)|KS[-_]?X[-_]?1001|ksc5636|iso-646-kr|uhc\ -|johab|(x-)?mac(-)?korean|iso-ir-149|x-EBCDIC-(KoreanAnd)?KoreanExtended" - -# some mailer actually sets this - -CHARSET_BOGUS = "X-UNKNOWN|USER-DEFINED" - -# Not recommended to block these - they're all rather encompassing - -CHARSET_UNICODE = "UTF(-)?(7|8|16)]|UCS(-)?(2|4)\ -|UNICODE-1-1-UTF-7|ISO-10646-UCS-2|UNICODE-(16|32)(LITTLE|BIG)-ENDIAN)?\ -|unicodeFFFE|JAVA|x-EBCDIC-International(-euro)?" - -# If you're english, you probably don't want to block this one either. - -CHARSET_ENG = "US-ASCII|ASCII|iso-ir-6|iso646-us|x-EBCDIC-(cp-us|UK)(-euro)?" - -# Western European (English, but also French and many others. Standard) - -CHARSET_WESTEURO = "WINDOWS-1252|ISO-?8859-(1|15)|iso-ir-100\ -|(x-)?mac(-)?roman|latin-?(1|9)|macintosh|x-IA5(-German)?\ -|x-ebcdic-(spain|italy|germany|france)(-euro)?|x-europa" - -# Central/Eastern European (non-english) - -CHARSET_SLAVIC = "WINDOWS-1250|ISO-?8859-(2|16)\ -|iso-ir-(87|102)|(x-)?mac(-)?(central-europe|ce|croatian)\ -|latin-?2|CP870" - -# uncommon stuff and/or generally obsoleted. Includes maltese (eh, sorry if -# that's you) - -CHARSET_FUNKYLATIN = "ISO-?8859-[34]|iso-ir-109|latin-?3" - -# Russian, et-al. -# KOI8-T is Tajiki (Tajikistan) -# armscii-8 is Armenian - -CHARSET_CYRILLIC = "WINDOWS-1251|ISO-?8859-5|KOI8(-(RU|[RTU]))?\ -|ISO-IR-(101|111|144|147)|IBM866\ -|(x-)?mac(-)?(romanian?|cyrillic|ukran(e|ian))\ -|nunacom-8|armscii-8|x-EBCDIC-Cyrillic(SerbianBulgarian|Russian)" - -# Arabic - -CHARSET_ARABIC = "WINDOWS-1256|ISO-?8859-6|iso-ir-127\ -|(x-)?mac(-)?arabic|asmo-708|x-EBCDIC-Arabic" - -# Greek - -CHARSET_GREEK = "WINDOWS-1253|ISO-?8859-7|(x-)?mac(-)?greek\ -|iso-ir-(126|150)|x-EBCDIC-Greek(Modern)?" - -# Hebrew - -CHARSET_HEBREW = "WINDOWS-1255|ISO-?8859-8(-i)?|(x-)?mac(-)?hebrew\ -|iso-ir-138|x-EBCDIC-Hebrew" - -# Turkish - -CHARSET_TURKISH = "WINDOWS-1254|ISO-?8859-9|(x-)?mac(-)?turkish\ -|iso-ir-(109|148)|latin-?5|x-EBCDIC-Turkish|CP1026" - -# Icelandic/Nordic (i.e. Iceland, Greenland, Norway, Sweden...) - -CHARSET_NORDIC = "ISO-?8859-10|(x-)?mac(-)?iceland(ic)?|iso-ir-60\ -|x-IA5-(Norwegian|Swedish)\ -|x-EBCDIC-(FinlandSweden|DenmarkNorway|Icelandic)(-euro)?" - -# Thai (ISO not _actually_ used, but draft standard is same) - -CHARSET_THAI = "WINDOWS-874|TIS[-_]?620|ISO-?8859-11\ -|mulelao-1|ibm-cp1133|(x-)?mac(-)?thai|x-EBCDIC-Thai" - -# ISO-8859-12 is bogus (was suggested to be vietnamese, but can't fit). -# However, I've seen this encoding specified in spam though, and lacking an -# official designation, I'm hocking it here. - -CHARSET_VIETNAM = "WINDOWS-1258|ISO-?8859-12|viscii|tcvn5712|vps" - -# Baltic Rim - -CHARSET_BALTIC = "WINDOWS-1257|ISO-?8859-13|iso-ir-110" - -# Celtic (Irish and Welsh) - -CHARSET_CELTIC = "ISO-?8859-14" - -# Other stuff which escapes categorization at this time - -CHARSET_MISC = "isiri-3342|x-iscii-(as|be|de|gu|ka|ma|or|pa|ta|te)" - -# ..................................................... &from-daemon ... - -JA_FROM_DAEMON = "!" - -:0 -* ^FROM_DAEMON -{ - JA_FROM_DAEMON_MATCH = $MATCH - JA_FROM_DAEMON = "!!" # double !! means "OK" - - # 2000-01-08 This has been copied from procmail log file - # because we can't get the match otherwise. - # Procmail version: v3.11pre4 1995/10/29 - # - # The following recipe is dummy: It solely sets MATCH to show - # what procmail thinks triggered FROM_DAEMON - -# :0 -# * ()\/^(Precedence:.*(junk|bulk|list)|To: Multiple recipients of |(((Resent-)?(From|Sender)|X-Envelope-From):|>?From )([^>]*[^(.%@a-z0-9])?(Post(ma?(st(e?r)?|n)|office)|(send)?Mail(er)?|daemon|mmdf|n?uucp|LIST(SERV|proc)|NETSERV|owner|r(e(quest|sponse)|oot)|b(ounce|bs\.smtp)|echo|mirror|s(erv(ices?|er)|mtp)|A(dmin(istrator)?|MMGR|utoanswer))(([^).!:a-z0-9][-_a-z0-9]*)?[%@> ][^<)]*(\(.*\).*)?)?$([^>]|$))) -# { } - -} - -# ..................................................... &from_mailer ... - -JA_FROM_MAILER = "!" - -:0 -* ^FROM_MAILER -{ - JA_FROM_MAILER_MATCH = $MATCH - JA_FROM_MAILER = "!!" # double !! means "OK" -} - -# .................................................. &define-modules ... - -:0 -* PMSRC ?? [a-z] -{ - RC_ADDR = $PMSRC/pm-jaaddr.rc - RC_BUP = $PMSRC/pm-jabup.rc - RC_COOKIE = $PMSRC/pm-jacookie.rc - RC_COOKIE1 = $PMSRC/pm-jacookie1.rc - RC_CRON = $PMSRC/pm-jacron.rc - RC_DAEMON = $PMSRC/pm-jadaemon.rc - RC_DATE = $PMSRC/pm-jadate.rc - RC_DATE1 = $PMSRC/pm-jadate1.rc - RC_DATE2 = $PMSRC/pm-jadate2.rc - RC_DATE3 = $PMSRC/pm-jadate3.rc - RC_DATE4 = $PMSRC/pm-jadate4.rc - RC_DATE5 = $PMSRC/pm-jadate5.rc - RC_DUP = $PMSRC/pm-jadup.rc - RC_EMPTY = $PMSRC/pm-jaempty.rc - RC_FROM = $PMSRC/pm-jafrom.rc - RC_FWD = $PMSRC/pm-jafwd.rc - RC_LIST = $PMSRC/pm-jalist.rc - - RC_MIME_DECODE = $PMSRC/pm-jamime-decode.rc - RC_MIME_KILL = $PMSRC/pm-jamime-kill.rc - RC_MIME_SAVE = $PMSRC/pm-jamime-save.rc - RC_MIME = $PMSRC/pm-jamime.rc - - RC_NETMIND = $PMSRC/pm-janetmind.rc - RC_NSLOOKUP = $PMSRC/pm-janslookup.rc - RC_ORIG = $PMSRC/pm-jaorig.rc - RC_PING = $PMSRC/pm-japing.rc - RC_POP3 = $PMSRC/pm-japop3.rc - RC_RANDF = $PMSRC/pm-jarandf.rc - RC_SRV_CHECK = $PMSRC/pm-jasrv-check.rc - RC_SRV_DAEMON = $PMSRC/pm-jasrv-daemon.rc - RC_SRV_ERR = $PMSRC/pm-jasrv-err.rc - RC_SRV_FROM = $PMSRC/pm-jasrv-from.rc - RC_SRV_MSG = $PMSRC/pm-jasrv-msg.rc - RC_SRV_MULTI = $PMSRC/pm-jasrv-multi.rc - RC_SRV_REQ = $PMSRC/pm-jasrv-req.rc - RC_SRV_SEND = $PMSRC/pm-jasrv-send.rc - RC_SRV = $PMSRC/pm-jasrv.rc - RC_STORE = $PMSRC/pm-jastore.rc - RC_SUBJECT = $PMSRC/pm-jasubject.rc - RC_TIME = $PMSRC/pm-jatime.rc - RC_UBE = $PMSRC/pm-jaube.rc - RC_UBE1 = $PMSRC/pm-jaube1.rc - RC_UBE_BMF = $PMSRC/pm-jaube-prg-bmf.rc - RC_UBE_BOGOFILTER = $PMSRC/pm-jaube-prg-bogofilter.rc - RC_UBE_IFILE = $PMSRC/pm-jaube-prg-ifile.rc - RC_UBE_SPAMASSASSIN = $PMSRC/pm-jaube-prg-spamassassin.rc - RC_UBE_SPAMPROBE = $PMSRC/pm-jaube-prg-spamprobe.rc - RC_UBE_SPAMORACLE = $PMSRC/pm-jaube-prg-spamoracle.rc - RC_UBE_ANNOYANCE = $PMSRC/pm-jaube-prg-annoyance-filter.rc - RC_UBE_BSFILTER = $PMSRC/pm-jaube-prg-bsfilter.rc - RC_UBE_RUNALL = $PMSRC/pm-jaube-prg-runall.rc - RC_UBE_KEYWORDS = $PMSRC/pm-jaube-keywords.rc - RC_VAC = $PMSRC/pm-javac.rc - RC_VAR = $PMSRC/pm-javar.rc -} - -:0 E -{ - # Set LINEBUF so that next message line is not truncated. - LINEBUF = 1024 - dummy = " ------------------------------------------------------------------------ - - pm-javar.rc: PANIC: Variable PMSRC does not point to procmail - recipe code directory. Add something like this to ~/.procmailrc - (using correct install location): - PMSRC = $HOME/procmail/procmail-lib/lib - ------------------------------------------------------------------------ -" -} - -dummy = "pm-javar.rc: end: variables defined." - -# End of file pm-javar.rc diff --git a/src/procmail/unread-default.rc b/src/procmail/unread-default.rc @@ -1,48 +0,0 @@ -# unread-default.rc -# -# procmail recipe to compute how many unread messages -# for the $DEFAULT delivery. -# -# $Id: unread-default.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# Copyright (C) 1995 Alan K. Stebbens <aks@sgi.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# - -# -# Just count how many messages in $DEFAULT - - -UNREAD=no # default output - -# There are two basic methods: a fast way and a slow way - -# The fast way (loses sometimes -- but, really, who cares? we're -# just counting unread messages.) - -:0 -* ? test -f $DEFAULT -{ UNREAD=`egrep -c '^From ' $DEFAULT` } - -# The slow way, but, the "procmail" way :^) -# -#:0 -#* ? test -f $DEFAULT -#{ JUNK=`formail -e -s echo -n x < $DEFAULT` -# :0 -# * JUNK ?? 1^1 x -# { UNREAD = $= } -#} diff --git a/src/procmail/unread-mh.rc b/src/procmail/unread-mh.rc @@ -1,90 +0,0 @@ -# unread-mh.rc -# -# procmail recipe to compute how many unread messages -# for MH as the MUA (mail user agent). -# -# $Id: unread-mh.rc,v 1.1 2002/01/01 22:25:33 jaalto Exp $ -# -# Copyright (C) 1995 Alan K. Stebbens <aks@sgi.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# - -# -# Usage: -# -# Referenced by "ackmail.rc" when MUA=mh and the text of the -# reply includes the string '$UNREAD' -# -# If MH_INFOLDERS is set, uses the output of "folder +$folder" -# for each folder mentioned in MH_INFOLDERS. The sum of the -# current message number subtracted from the last message -# number for each folder is returned. -# -# If MH_INFOLDERS is not set, then check for the Unseen-Sequence -# profile entry. If this is set, uses the number of messages -# in this sequence. -# -# If there is no Unseen-Sequence profile entry, or there is no -# sequence in the +inbox, then use the output of 'folders +inbox' -# as for MH_INFOLDERS above. -# - -# Note: PATH should include the MH bin directory - -UNREAD=no # default output -SHELL=/bin/sh # be sure - -# If the user has defined one or more explicit folders in the -# variable MH_INFOLDERS, then use a shell script to get UNREAD -:0 -* MH_INFOLDERS ?? .+ -{ - UNREAD=`(for f in $MH_INFOLDERS ; do folder +$f ; done) | - sed -n -e 's/^.*- *\([0-9]*\)); cur= *\([0-9]*\);.*/ok \1 \2/p' | - awk '/ok/ { s+=$2-$3 } END { print s }'` -} - -# If no explicit folder list, try using unseen sequences -:0 E -{ - # Get some MH info - MH_INBOX=`mhpath +inbox` - MH_UNSEENSEQ=`mhparam Unseen-Sequence` - MH_INSEQFILE=$MH_INBOX/.mh_sequences - - :0 chW - * MH_UNSEENSEQ ?? [a-z]+ - * ? test -f $MH_INSEQFILE - * ? grep "^$MH_UNSEENSEQ:" $MH_INSEQFILE - |UNREAD=`pick +inbox $MH_UNSEENSEQ 2>/dev/null | wc -l` - - # Ok -- no unseen sequence. Try last resort of using +inbox info. - :0 E - { - INFOLDER=`folder +inbox` - :0 - * INFOLDER ?? cur= *\/[0-9]+ - { CUR=$MATCH - :0 - * INFOLDER ?? messages *\( *[0-9]+- *\/[0-9]+ - { MAX=$MATCH - :0 - * ? test "$MAX" -gt "$CUR" - { UNREAD=`expr $MAX - $CUR` } - } - } - } -} diff --git a/src/zlibs/accounts b/src/zlibs/accounts @@ -21,23 +21,6 @@ # Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -switch_identity() { - if [ "$name" != "" ]; then - act "switch to identity: $name <$login>" - rm -f "$MAILDIRS/Identity" - cat <<EOF > "$MAILDIRS/Identity" -# Automatically generated, do not modify -# change or add configs into Accounts instead -set hostname = $host -set realname = "$name" -set from = "$name <$login>" -EOF - else - error "No identity found, left blank." - touch "$MAILDIRS/Identity" - fi -} - list_accounts() { accts=`${=find} "$ACCOUNTS" -type f | grep -v README | sed 's/.txt//'` for a in ${(f)accts}; do diff --git a/src/zlibs/addressbook b/src/zlibs/addressbook @@ -153,7 +153,7 @@ complete() { return 0 } -isknown() { +sender_isknown() { head="`${WORKDIR}/bin/fetchaddr -x From -a`" email="${head[(ws:,:)1]}" @@ -163,7 +163,7 @@ isknown() { lookup="`lookup_email ${email}`" { test "$lookup" = "" } || { - func "isknown() found <$email> in $list (id $lookup)" + func "sender_isknown() found <$email> in $list (id $lookup)" return 0 } return 1 diff --git a/src/zlibs/email b/src/zlibs/email @@ -181,11 +181,6 @@ fetch() { # fetch works with imap and pop, skip smtp { test "$account_type" = "smtp" } && { return 0 } - if ! [ -r "$PROCMAILDIR/rc" ]; then - act "updating procmail configuration" - { test $DRYRUN != 1 } && { update } - fi - notice "Connecting account ${account} via ${account_type}" is_online ${host} ${port} @@ -255,28 +250,12 @@ fetch() { func "fetchmail returns $ret" ;; esac - # archive old procmail log - if [ -r "$MAILDIRS/logs/procmail.log" ]; then - newlock "$MAILDIRS/logs/procmail-${datestamp}.log" - cat "$MAILDIRS/logs/procmail.log" \ - >> "$MAILDIRS/logs/procmail-${datestamp}.log" - rm -f "$MAILDIRS/logs/procmail.log" - unlock "$MAILDIRS/logs/procmail-${datestamp}.log" - fi - act "please wait while downloading mails to incoming..." print " $fmconf " | fetchmail -f - unset $fmconf - filter_maildir incoming - - # total=`mailstat -k $MAILDIRS/logs/procmail.log | tail -n1 | awk '{print $2}'` - # briefing=`mailstat -kt $MAILDIRS/logs/procmail.log |awk '!/procmail/ { print " " $2 "\t" $3 }'|sort -nr` - # notice "$total emails fetched" - # print "${briefing}" - } # DRYRUN return 0 @@ -454,7 +433,6 @@ peek() { act "opening folder ${folder}" fi - switch_identity case $transport in ssl|tls) act "using secure connection (SSL)" iproto="imaps" ;; diff --git a/src/zlibs/filters b/src/zlibs/filters @@ -66,6 +66,8 @@ hdr() { /^$/ { exit }' "$1" } +# reads all configurations and creates a cache of what is read +# the cache consists of array and maps declarations for zsh update_filters() { { test -r "$MAILDIRS/Filters.txt" } || { error "Filters not found in $MAILDIRS/Filters.txt" @@ -80,9 +82,9 @@ update_filters() { newlock "$ff" cat <<EOF >> "$ff" # automatically generated by jaromail -typeset -Al filter_from -typeset -Al filter_to - +typeset -Al filter_from +typeset -Al filter_to +typeset -alU filter_own EOF ffilters=`cat "$MAILDIRS/Filters.txt" | awk ' /^#/ {next} @@ -116,6 +118,27 @@ EOF esac done + # compile the list of own addresses and aliases + for i in `awk ' +/^#/ { next } +/^$/ { next } +/^email/ { print $2 }' \ + "$MAILDIRS"/Accounts/*`; do + cat <<EOF >> "$ff" +filter_own+=($i) +EOF + done + { test -r $MAILDIRS/Aliases.txt } && { + for i in `awk ' +/^#/ { next } +/^$/ { next } +{ print $1 }' "$MAILDIRS/Aliases.txt"`; do + cat <<EOF >> "$ff" +filter_own+=($i) +EOF + done + } + unlock "$ff" zcompile "$ff" source "$ff" @@ -158,12 +181,14 @@ filter_maildir() { notice "Filtering maildir: $input ($numm mails}" c=0 + typeset -alU ftos + for m in ${(f)mails}; do match=0 c=$(($c + 1)) list="blacklist" - hdr "$m" | isknown + hdr "$m" | sender_isknown { test $? = 0 } && { cat "$m" | deliver zz.blacklist { test $? = 0 } && { ${=rm} "$m" } @@ -177,6 +202,10 @@ filter_maildir() { { test $? = 0 } && { ${=rm} "$m" } continue } + # recompile the array of destination addresses + ftos=`hdr "$m" | ${WORKDIR}/bin/fetchaddr -x Cc -a | cut -d, -f1` + ftos+=`hdr "$m" | ${WORKDIR}/bin/fetchaddr -x To -a | cut -d, -f1` + { test "$ownfilters" = "1" } && { func "processing through own filters" @@ -186,6 +215,7 @@ filter_maildir() { { test "$ffrom" = "" } || { femail="${ffrom[(ws:,:)1]}" for exp in ${(k)filter_from}; do + # special zsh parsing in PCRE (=~) if [[ "$femail" =~ "$exp" ]]; then act "$c\t\t/ $numm\t\t-> ${filter_from[$exp]}" cat "$m" | deliver ${filter_from[$exp]} @@ -202,13 +232,11 @@ filter_maildir() { } { test "$match" = "1" } && { continue } - ftos=`hdr "$m" | ${WORKDIR}/bin/fetchaddr -x Cc -a | cut -d, -f1` - ftos+=`hdr "$m" | ${WORKDIR}/bin/fetchaddr -x To -a | cut -d, -f1` - # run all filter regexps on the to: and cc: fields { test "$ftos" = "" } || { for ft in ${(f)ftos}; do for exp in ${(k)filter_to}; do + # special zsh parsing in PCRE (=~) if [[ "$ft" =~ "$exp" ]]; then act "$c\t\t/ $numm\t\t-> ${filter_to[$exp]}" cat "$m" | deliver ${filter_to[$exp]} @@ -229,7 +257,7 @@ filter_maildir() { } # own filters list="whitelist" - hdr "$m" | isknown + hdr "$m" | sender_isknown { test $? = 0 } && { print "hit on whitelist" act "$c\t\t/ $numm\t\t-> known" cat "$m" | deliver known @@ -243,10 +271,25 @@ filter_maildir() { { test $? = 0 } && { ${=rm} "$m" } continue } - # if here then file to unsorted - act "$c\t\t/ $numm\t\t-> unsorted" - cat "$m" | deliver unsorted - { test $? = 0 } && { ${=rm} "$m" } + # parse own email and aliases + for f in $ftos; do + + # check if destination address is in filter_own array + if [[ ${filter_own[(i)"$ftos"]} -le ${#filter_own} ]] ; then + act "$c\t\t/ $numm\t\t-> priv" + cat "$m" | deliver priv + { test $? = 0 } && { ${=rm} "$m" } + + else + + # if here then file to unsorted + act "$c\t\t/ $numm\t\t-> unsorted" + cat "$m" | deliver unsorted + { test $? = 0 } && { ${=rm} "$m" } + + fi + + done done @@ -296,15 +339,10 @@ source '$WORKDIR/.mutt/general' source '$WORKDIR/.mutt/formats' source '$WORKDIR/.mutt/keybindings' source '$WORKDIR/.mutt/colors' -source '$MAILDIRS/Identity' +source '$MAILDIRS/Identity.txt source '$TMPDIR/muttpass' EOF -# support user made configuration of mutt - { test -r "$MAILDIRS/Mutt.txt" } && { - print "source '$MAILDIRS/Mutt.txt'" >> $MUTTDIR/rc } - - ##################### # helper applications @@ -339,6 +377,9 @@ EOF { test -r "${MAILDIRS}/Applications.txt" } && { + # here is the tweak to open attachments + # with Mutt without blocking it (fork) + apptypes=`cat "${MAILDIRS}/Applications.txt"` for t in ${(f)apptypes}; do eval `print $t | awk ' @@ -352,19 +393,13 @@ application/*; a="${TMPDIR}" && f=\`basename %s\` && rm -f "\$a"/"\$f" && cp %s EOF } # Applications.txt - # this one is empty and sources files in temp when necessary - # touch $TMPDIR/muttpass + touch $TMPDIR/muttpass - # just the header, will be completed later in procmail loop + # just the header, will be completed later rm -f $MUTTDIR/mboxes print -n "mailboxes +known +priv" > $MUTTDIR/mboxes - # update identity with default - read_account imap - - switch_identity - for f in `cat "$MAILDIRS/Filters.txt" | awk ' /^#/ {next} /^./ { print $4 }'`; do @@ -380,8 +415,35 @@ EOF } -update_sieve() { +# $1 = conditional directive +# $2 = folder to fileinto +# sieve_filter_array: array of entries +typeset -alU sieve_filter_array +sieve_filter() { + condition="$1" + fileinto="$2" + + cat <<EOF >> "$MAILDIRS/Filters.sieve" +# $fileinto +$condition [ +EOF + c=${#sieve_filter_array} + for i in $sieve_filter_array; do + print -n "\"$i\"" >> "$MAILDIRS/Filters.sieve" + c=$(( $c - 1 )) + { test $c != 0 } && { print -n "," >> "$MAILDIRS/Filters.sieve" } + print >> "$MAILDIRS/Filters.sieve" + done + + cat <<EOF >> "$MAILDIRS/Filters.sieve" +] +{ fileinto "$fileinto"; stop; } + +EOF + return 0 +} +update_sieve() { ####### # SIEVE @@ -394,30 +456,25 @@ update_sieve() { cat <<EOF >> "$MAILDIRS/Filters.sieve" require "fileinto"; -# blacklist -if header :contains "From" [ EOF + + # blacklist + sieve_filter_array=() newlock "$TMPDIR/blacklist.sieve.$id" cat <<EOF | ${SQL} -batch ${addressbook} \ >> "$TMPDIR/blacklist.sieve.$id" SELECT email FROM blacklist; EOF - typeset -alU blacklist for i in `cat "$TMPDIR/blacklist.sieve.$id"`; do - blacklist+=("$i"); done + sieve_filter_array+=("$i"); done unlink "$TMPDIR/blacklist.sieve.$id" - c=${#blacklist} - for b in $blacklist; do - print -n "\"$b\"" >> "$MAILDIRS/Filters.sieve" - c=$(( $c - 1 )) - { test $c != 0 } && { print -n "," >> "$MAILDIRS/Filters.sieve" } - print >> "$MAILDIRS/Filters.sieve" - done -cat <<EOF >> "$MAILDIRS/Filters.sieve" -] -{ fileinto "zz.blacklist"; stop; } + sieve_filter \ + 'if header :contains "From"' \ + zz.blacklist + # bounces + cat <<EOF >> "$MAILDIRS/Filters.sieve" # bounces if header :contains "Sender" "bounce" { fileinto "zz.bounces"; @@ -426,94 +483,76 @@ if header :contains "Sender" "bounce" { ############# # own filters + EOF - # now do the sieve + # now do our own filters + sieve_filter_array=() { test ${#filter_to} -gt 0 } && { - cat <<EOF >> "$MAILDIRS/Filters.sieve" -# filter to -if header :contains "To" [ -EOF - c=${#filter_to} + for f in ${(k)filter_to}; do - print -n "\"$f\"" >> "$MAILDIRS/Filters.sieve" - c=$(( $c - 1 )) - { test $c != 0 } && { print -n "," >> "$MAILDIRS/Filters.sieve" } - print >> "$MAILDIRS/Filters.sieve" - done - cat <<EOF >> "$MAILDIRS/Filters.sieve" -] -{ fileinto "filters"; stop; } + sieve_filter_array+=($f); done -EOF + sieve_filter \ + 'if header :contains "To"' \ + filters } + sieve_filter_array=() { test ${#filter_from} -gt 0 } && { - cat <<EOF >> "$MAILDIRS/Filters.sieve" -# filter from -if header :contains "From" [ -EOF - c=${#filter_from} + for f in ${(k)filter_from}; do - print -n "\"$f\"" >> "$MAILDIRS/Filters.sieve" - c=$(( $c - 1 )) - { test $c != 0 } && { print -n "," >> "$MAILDIRS/Filters.sieve" } - print >> "$MAILDIRS/Filters.sieve" - done - cat <<EOF >> "$MAILDIRS/Filters.sieve" -] -{ fileinto "filters"; stop; } + sieve_filter_array+=($f); done -EOF + sieve_filter \ + 'if header :contains "From"' \ + filters } ############################################################## # if the sender is known (whitelist) then put mail in - # high priority 'known' (procmail) or INBOX (sieve) - - - -#### SIEVE -act "compiling whitelist rules from addressbook" -func "generating whitelist for sieve filters" -cat <<EOF >> "$MAILDIRS/Filters.sieve" -# whitelist -if header :contains "From" [ -EOF + # high priority 'known' maildir or INBOX (sieve) -newlock "$TMPDIR/whitelist.sieve.$id" + act "compiling whitelist rules from addressbook" + func "generating whitelist for sieve filters" -cat <<EOF | ${SQL} -batch ${addressbook} \ - >> "$TMPDIR/whitelist.sieve.$id" + sieve_filter_array=() + newlock "$TMPDIR/whitelist.sieve.$id" + cat <<EOF | ${SQL} -batch ${addressbook} \ + >> "$TMPDIR/whitelist.sieve.$id" SELECT email FROM whitelist; -EOF -typeset -alU whitelist -for i in `cat "$TMPDIR/whitelist.sieve.$id"`; do - whitelist+=("$i"); done - -unlink "$TMPDIR/whitelist.sieve.$id" - -c=${#whitelist} -for w in $whitelist; do - print -n "\"$w\"" >> "$MAILDIRS/Filters.sieve" - c=$(( $c - 1 )) - { test $c != 0 } && { print -n "," >> "$MAILDIRS/Filters.sieve" } - print >> "$MAILDIRS/Filters.sieve" -done -cat <<EOF >> "$MAILDIRS/Filters.sieve" -] -{ fileinto "INBOX"; stop; } +EOF + + for i in `cat "$TMPDIR/whitelist.sieve.$id"`; do + sieve_filter_array+=("$i"); done + + unlink "$TMPDIR/whitelist.sieve.$id" + + sieve_filter \ + 'if header :contains "From"' \ + INBOX + + cat <<EOF >> "$MAILDIRS/Filters.sieve" # spam if header :is "X-Spam-Flag" "YES" { - fileinto "zz.spam"; - stop; + fileinto "zz.spam"; stop; } -fileinto "unsorted"; EOF -unlock "$MAILDIRS/Filters.sieve" + # own addresses and aliases + sieve_filter_array=($filter_own) + sieve_filter \ + 'if header :contains [ "To","Cc" ] ' \ + priv + + # unsorted + cat <<EOF >> "$MAILDIRS/Filters.sieve" +fileinto "unsorted"; +EOF + + unlock "$MAILDIRS/Filters.sieve" return 0 } # end of update() diff --git a/src/zlibs/maildirs b/src/zlibs/maildirs @@ -226,67 +226,6 @@ merge() { act "Done. All mails merged into ${dst}" } -# re-sort all maildir through the procmail filters -# it can create duplicates, up to the user to rmdupes -filter() { - - update # update all filters - - # archive old procmail log - { test -r "$MAILDIRS/logs/procmail.log" } && { - newlock "$MAILDIRS/logs/procmail-${datestamp}.log" - cat "$MAILDIRS/logs/procmail.log" \ - >> "$MAILDIRS/logs/procmail-${datestamp}.log" - ${=rm} "$MAILDIRS/logs/procmail.log" - unlock "$MAILDIRS/logs/procmail-${datestamp}.log" - } - - prc="$PROCMAILDIR/rc" - - typeset -al fall - - for folder in ${=PARAM}; do - { test -r "$folder" } || { folder="$MAILDIRS/$folder" } - { test -r "$folder" } || { - error "Directory not found: $folder" - continue } - - { maildircheck "$folder" } || { - error "Not a maildir folder: $folder" - continue } - - notice "Filtering folder $folder" - # first index current state - for m in `${=find} "$folder" -type f`; do fall+=("$m"); done - done - - { test ${#fall} = 0 } && { - error "No messages to filter, operation aborted." - return 1 - } - - # then process it, this way ignoring new mails send to same folder - act "Filtering ${#fall} messages..." - for n in ${=fall}; do - cat "$n" | procmail -m "$prc" - done - notice "Done filtering" - unset fall - - - total=`mailstat -k "$MAILDIRS/logs/procmail.log" | tail -n1 | awk '{print $2}'` - briefing=`mailstat -kt "$MAILDIRS/logs/procmail.log" |awk '!/procmail/ { print " " $2 "\t" $3 }'|sort -nr` - echo "${briefing}" - - - formail_cache="$TMPDIR/filter.rmdupes.$datestamp.$RANDOM" - newlock "$formail_cache" - - # prunes out all duplicates from last filtered mails, - rmdupes lastlog - - unlink $formail_cache -} # very simple LDA delivery to a maildir # the delicate part is returning all errors