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:
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
-}
-
-# ....................................................... µsoft ...
-
-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