Provided by: procmail_3.24-1ubuntu2_amd64 bug

NAME

       procmailex - procmail rcfile examples

SYNOPSIS

       $HOME/.procmailrc examples

DESCRIPTION

       For a description of the rcfile format see procmailrc(5).

       The weighted scoring technique is described in detail in the procmailsc(5) man page.

       This  man  page  shows several example recipes.  For examples of complete rcfiles you can check the NOTES
       section in procmail(1), or look at the example rcfiles in /usr/share/doc/procmail/examples.

EXAMPLES

       Sort out all mail coming from the scuba-dive  mailing  list  into  the  mailfolder  scubafile  (uses  the
       locallockfile scubafile.lock).

              :0:
              * ^TOscuba
              scubafile

       Forward all mail from peter about compilers to william (and keep a copy of it here in petcompil).

              :0
              * ^From.*peter
              * ^Subject:.*compilers
              {
                 :0 c
                 ! william@somewhere.edu

                 :0
                 petcompil
              }

       An equivalent solution that accomplishes the same:

              :0 c
              * ^From.*peter
              * ^Subject:.*compilers
              ! william@somewhere.edu

                 :0 A
                 petcompil

       An equivalent, but slightly slower solution that accomplishes the same:

              :0 c
              * ^From.*peter
              * ^Subject:.*compilers
              ! william@somewhere.edu

              :0
              * ^From.*peter
              * ^Subject:.*compilers
              petcompil

       If you are fairly new to procmail and plan to experiment a little bit it often helps to have a safety net
       of some sort.  Inserting the following two recipes above all other recipes will make  sure  that  of  all
       arriving  mail  always  the last 32 messages will be preserved.  In order for it to work as intended, you
       have to create a directory named `backup' in $MAILDIR prior to inserting these two recipes.

              :0 c
              backup

              :0 ic
              | cd backup && rm -f dummy `ls -t msg.* | sed -e 1,32d`

       If your system doesn't generate or generates incorrect leading `From ' lines on every mail, you  can  fix
       this  by  calling up procmail with the -f- option.  To fix the same problem by different means, you could
       have inserted the following recipe above all other recipes in your rcfile.  They will filter  the  header
       of  any  mail  through  formail  which  will  strip any leading `From ', and automatically regenerates it
       subsequently.

              :0 fhw
              | formail -I "From " -a "From "

       Add the headers of all messages that didn't come from the postmaster to your  private  header  collection
       (for  statistics  or  mail  debugging);  and  use  the  lockfile `headc.lock'.  In order to make sure the
       lockfile is not removed until the pipe has finished, you  have  to  specify  option  `w';  otherwise  the
       lockfile would be removed as soon as the pipe has accepted the mail.

              :0 hwc:
              * !^FROM_MAILER
              | uncompress headc.Z; cat >>headc; compress headc

       Or, if you would use the more efficient gzip instead of compress:

              :0 hwc:
              * !^FROM_MAILER
              | gzip >>headc.gz

       Forward all mails shorter than 1000 bytes to my home address (no lockfile needed on this recipe).

              :0
              * < 1000
              ! myname@home

       Split  up  incoming  digests from the surfing mailing list into their individual messages, and store them
       into surfing, using surfing.lock as the locallockfile.

              :0:
              * ^Subject:.*surfing.*Digest
              | formail +1 -ds >>surfing

       Store everything coming from the postmaster or mailer-daemon (like bounced mail)  into  the  file  postm,
       using postm.lock as the locallockfile.

              :0:
              * ^FROM_MAILER
              postm

       A  simple  autoreply recipe.  It makes sure that neither mail from any daemon (like bouncing mail or mail
       from mailing-lists), nor autoreplies coming from yourself will be autoreplied  to.   If  this  precaution
       would not be taken, disaster could result (`ringing' mail).  In order for this recipe to autoreply to all
       the incoming mail, you should of course insert it before all other recipes in your rcfile.   However,  it
       is  advisable  to  put  it  after  any  recipes  that  process the mails from subscribed mailinglists; it
       generally is not a good idea to generate autoreplies  to  mailinglists  (yes,  the  !^FROM_DAEMON  regexp
       should already catch those, but if the mailinglist doesn't follow accepted conventions, this might not be
       enough).

              :0 h c
              * !^FROM_DAEMON
              * !^X-Loop: your@own.mail.address
              | (formail -r -I"Precedence: junk" \
                  -A"X-Loop: your@own.mail.address" ; \
                 echo "Mail received.") | $SENDMAIL -t

       A more complicated autoreply  recipe  that  implements  the  functional  equivalent  of  the  well  known
       vacation(1)  program.   This  recipe  is  based on the same principles as the last one (prevent `ringing'
       mail).  In addition to that however, it maintains a vacation database  by  extracting  the  name  of  the
       sender  and  inserting  it  in  the  vacation.cache  file if the name was new (the vacation.cache file is
       maintained by formail which will make sure that it always contains the most recent names, the size of the
       file  is  limited  to  a maximum of approximately 8192 bytes).  If the name was new, an autoreply will be
       sent.

       As you can see, the following recipe has comments between the conditions.  This is allowed.  Do  not  put
       comments on the same line as a condition though.

              SHELL=/bin/sh    # only needed for older versions of procmail

              :0 Whc: vacation.lock
               # Perform a quick check to see if the mail was addressed to us
              * $^To:.*\<$\LOGNAME\>
               # Don't reply to daemons and mailinglists
              * !^FROM_DAEMON
               # Mail loops are evil
              * !^X-Loop: your@own.mail.address
              | formail -rD 8192 vacation.cache

                :0 ehc         # if the name was not in the cache
                | (formail -rI"Precedence: junk" \
                     -A"X-Loop: your@own.mail.address" ; \
                   echo "I received your mail,"; \
                   echo "but I won't be back until Monday."; \
                   echo "-- "; cat $HOME/.signature \
                  ) | $SENDMAIL -oi -t

       Store  all  messages  concerning  TeX  in  separate, unique filenames, in a directory named texmail (this
       directory has to exist); there is no need to use lockfiles in this case, so we won't.

              :0
              * (^TO|^Subject:.*)TeX[^t]
              texmail

       The same as above, except now we store the mails in numbered files (MH mail folder).

              :0
              * (^TO|^Subject:.*)TeX[^t]
              texmail/.

       Or you could file the mail in several directory folders at the same  time.   The  following  recipe  will
       deliver the mail to two MH-folders and one directory folder.  It is actually only one file with two extra
       hardlinks.

              :0
              * (^TO|^Subject:.*)TeX[^t]
              texmail/. wordprocessing dtp/.

       Store all the messages about meetings in a folder that is in a directory that changes every month.   E.g.
       if  it  were  January 1994, the folder would have the name `94-01/meeting' and the locallockfile would be
       `94-01/meeting.lock'.

              :0:
              * meeting
              `date +%y-%m`/meeting

       The same as above, but, if the `94-01' directory wouldn't have existed, it is created automatically:

              MONTHFOLDER=`date +%y-%m`

              :0 Wic
              * ? test ! -d $MONTHFOLDER
              | mkdir $MONTHFOLDER

              :0:
              * meeting
              ${MONTHFOLDER}/meeting

       The same as above, but now by slightly different means:

              MONTHFOLDER=`date +%y-%m`
              DUMMY=`test -d $MONTHFOLDER || mkdir $MONTHFOLDER`

              :0:
              * meeting
              ${MONTHFOLDER}/meeting

       If you are subscribed to several mailinglists and people cross-post to some of them, you usually  receive
       several  duplicate  mails (one from every list).  The following simple recipe eliminates duplicate mails.
       It tells formail to keep an 8KB cache file in which it will store the  Message-IDs  of  the  most  recent
       mails  you  received.  Since Message-IDs are guaranteed to be unique for every new mail, they are ideally
       suited to weed out duplicate mails.  Simply put the following recipe at the top of your  rcfile,  and  no
       duplicate mail will get past it.

              :0 Wh: msgid.lock
              | formail -D 8192 msgid.cache

       Beware  if  you  have delivery problems in recipes below this one and procmail tries to requeue the mail,
       then on the next queue run, this mail will be considered a duplicate and will be thrown away.  For  those
       not quite so confident in their own scripting capabilities, you can use the following recipe instead.  It
       puts duplicates in a separate folder instead of throwing them away.  It is  up  to  you  to  periodically
       empty the folder of course.

              :0 Whc: msgid.lock
              | formail -D 8192 msgid.cache

              :0 a:
              duplicates

       Procmail  can  deliver  to  MH folders directly, but, it does not update the unseen sequences the real MH
       manages.  If you want procmail to update those as well, use a recipe like the following which  will  file
       everything  that  contains the word spam in the body of the mail into an MH folder called spamfold.  Note
       the local lockfile, which is needed because MH programs do not lock  the  sequences  file.   Asynchronous
       invocations  of  MH  programs  that  change  the sequences file may therefore corrupt it or silently lose
       changes.  Unfortunately, the lockfile doesn't completely solve the problem as rcvstore could  be  invoked
       while `show' or `mark' or some other MH program is running.  This problem is expected to be fixed in some
       future version of MH, but until then, you'll have to balance  the  risk  of  lost  or  corrupt  sequences
       against the benefits of the unseen sequence.

              :0 :spamfold/$LOCKEXT
              * B ?? spam
              | rcvstore +spamfold

       When delivering to emacs folders (i.e., mailfolders managed by any emacs mail package, e.g., RMAIL or VM)
       directly, you should use emacs-compatible lockfiles.  The emacs mailers are a bit  braindamaged  in  that
       respect, they get very upset if someone delivers to mailfolders which they already have in their internal
       buffers.  The following recipe assumes that $HOME equals /home/john.

              MAILDIR=Mail

              :0:/usr/local/lib/emacs/lock/!home!john!Mail!mailbox
              * ^Subject:.*whatever
              mailbox

       Alternatively, you can have procmail deliver into its own set of mailboxes, which you  then  periodically
       empty  and  copy over to your emacs files using movemail.  Movemail uses mailbox.lock local lockfiles per
       mailbox.  This actually is the preferred mode of operation in conjunction with procmail.

       To extract certain headers from a mail and put them into environment variables you can  use  any  of  the
       following constructs:

              SUBJECT=`formail -xSubject:`    # regular field
              FROM=`formail -rt -xTo:`        # special case

              :0 h                            # alternate method
              KEYWORDS=| formail -xKeywords:

       If  you  are using temporary files in a procmailrc file, and want to make sure that they are removed just
       before procmail exits, you could use something along the lines of:

              TEMPORARY=$HOME/tmp/pmail.$$
              TRAP="/bin/rm -f $TEMPORARY"

       The TRAP keyword can also be used to change the exitcode of procmail.   I.e.  if  you  want  procmail  to
       return an exitcode of `1' instead of its regular exitcodes, you could use:

              EXITCODE=""
              TRAP="exit 1;"   # The trailing semi-colon is important
                               # since exit is not a standalone program

       Or, if the exitcode does not need to depend on the programs run from the TRAP, you can use a mere:

              EXITCODE=1

       The following recipe prints every incoming mail that looks like a postscript file.

              :0 Bb
              * ^^%!
              | lpr

       The  following  recipe does the same, but is a bit more selective.  It only prints the postscript file if
       it comes from the print-server.  The first condition matches only if it is  found  in  the  header.   The
       second condition only matches at the start of the body.

              :0 b
              * ^From[ :].*print-server
              * B ?? ^^%!
              | lpr

       The same as above, but now by slightly different means:

              :0
              * ^From[ :].*print-server
              {
                :0 B b
                * ^^%!
                | lpr
              }

       Likewise:

              :0 HB b
              * ^^(.+$)*From[ :].*print-server
              * ^^(.+$)*^%!
              | lpr

       Suppose  you  have  two  accounts,  you use both accounts regularly, but they are in very distinct places
       (i.e., you can only read mail that arrived at either one of the accounts).  You  would  like  to  forward
       mail  arriving  at  account  one to account two, and the other way around.  The first thing that comes to
       mind is using .forward files at both sites; this won't work of course, since you will be creating a  mail
       loop.   This  mail loop can be avoided by inserting the following recipe in front of all other recipes in
       the $HOME/.procmailrc files on both sites.  If you make sure that you add the same X-Loop: field at  both
       sites, mail can now safely be forwarded to the other account from either of them.

              :0 c
              * !^X-Loop: yourname@your.main.mail.address
              | formail -A "X-Loop: yourname@your.main.mail.address" | \
                 $SENDMAIL -oi yourname@the.other.account

       If  someone  sends  you  a mail with the word `retrieve' in the subject, the following will automatically
       send back the contents of info_file to the sender.  Like in all recipes where we send mail, we watch  out
       for mail loops.

              :0
              * !^From +YOUR_USERNAME
              * !^Subject:.*Re:
              * !^FROM_DAEMON
              * ^Subject:.*retrieve
              | (formail -r ; cat info_file) | $SENDMAIL -oi -t

       Now follows an example for a very simple fileserver accessible by mail.  For more demanding applications,
       I suggest you take a look at SmartList (available from the same place as the procmail distribution).   As
       listed,  this  fileserver sends back at most one file per request, it ignores the body of incoming mails,
       the Subject: line has to look like "Subject: send file the_file_you_want" (the blanks  are  significant),
       it  does  not  return  files that have names starting with a dot, nor does it allow files to be retrieved
       that are outside the fileserver directory tree (if you decide to munge this example, make sure you do not
       inadvertently loosen this last restriction).

              :0
              * ^Subject: send file [0-9a-z]
              * !^X-Loop: yourname@your.main.mail.address
              * !^Subject:.*Re:
              * !^FROM_DAEMON
              * !^Subject: send file .*[/.]\.
              {
                MAILDIR=$HOME/fileserver # chdir to the fileserver directory

                :0 fhw                   # reverse mailheader and extract name
                * ^Subject: send file \/[^ ]*
                | formail -rA "X-Loop: yourname@your.main.mail.address"

                FILE="$MATCH"            # the requested filename

                :0 ah
                | cat - ./$FILE 2>&1 | $SENDMAIL -oi -t
              }

       The  following  example  preconverts  all plain-text mail arriving in certain encoded MIME formats into a
       more compact 8-bit format which can be used and displayed more easily by most programs.  The mimencode(1)
       program is part of Nathaniel Borenstein's metamail package.

              :0
              * ^Content-Type: *text/plain
              {
                :0 fbw
                * ^Content-Transfer-Encoding: *quoted-printable
                | mimencode -u -q

                   :0 Afhw
                   | formail -I "Content-Transfer-Encoding: 8bit"

                :0 fbw
                * ^Content-Transfer-Encoding: *base64
                | mimencode -u -b

                   :0 Afhw
                   | formail -I "Content-Transfer-Encoding: 8bit"
              }

       The following one is rather exotic, but it only serves to demonstrate a feature.  Suppose you have a file
       in your HOME directory called ".urgent", and the (one) person named in that file  is  the  sender  of  an
       incoming  mail,  you'd  like  that  mail  to be stored in $MAILDIR/urgent instead of in any of the normal
       mailfolders it would have been sorted in.  Then this is what you could  do  (beware,  the  filelength  of
       $HOME/.urgent should be well below $LINEBUF, increase LINEBUF if necessary):

              URGMATCH=`cat $HOME/.urgent`

              :0:
              * $^From.*${URGMATCH}
              urgent

       An  entirely  different  application  for  procmail  would be to conditionally apply filters to a certain
       (outgoing) text or mail.  A typical example would be a filter through which you pipe all  outgoing  mail,
       in  order  to make sure that it will be MIME encoded only if it needs to be.  I.e. in this case you could
       start procmail in the middle of a pipe like:

              cat newtext | procmail ./mimeconvert | mail chris@where.ever

       The mimeconvert rcfile could contain something like (the =0x80= and =0xff= should be substituted with the
       real 8-bit characters):

              DEFAULT=|     # pipe to stdout instead of
                            # delivering mail as usual
              :0 Bfbw
              * [=0x80=-=0xff=]
              | mimencode -q

                :0 Afhw
                | formail -I 'MIME-Version: 1.0' \
                   -I 'Content-Type: text/plain; charset=ISO-8859-1' \
                   -I 'Content-Transfer-Encoding: quoted-printable'

SEE ALSO

       procmail(1), procmailrc(5), procmailsc(5), sh(1), csh(1), mail(1), mailx(1), uucp(1), aliases(5),
       sendmail(8), egrep(1), grep(1), biff(1), comsat(8), mimencode(1), lockfile(1), formail(1)

AUTHORS

       Stephen R. van den Berg
              <srb@cuci.nl>

                                                     BuGless                                       PROCMAILEX(5)