procmail - Unix, Linux Command

Procmail should be invoked automatically over the
.forward file mechanism as soon as mail arrives.  Alternatively, when installed by
a system administrator (and in the standard Red Hat Linux configuration), it
can be invoked from within the mailer immediately.  When invoked, it
first sets some environment variables to default values, reads the mail message from
stdin until an EOF, separates the body from the header, and then, if no command line
arguments are present, it starts to look for a file named
$HOME/.procmailrc. According to the processing recipes in this file,
the mail message that just arrived gets distributed into the right folder
(and more).  If no rcfile is found, or processing of the rcfile falls off
the end, procmail will store the mail in the default system
mailbox.


If no rcfiles and no
-p have been specified on the command line, procmail will, prior to reading $HOME/.procmailrc, interpret commands from
/etc/procmailrc (if present).
Care must be taken when creating /etc/procmailrc, because, if circumstances permit, it will be executed with root privileges (contrary to the $HOME/.procmailrc file of course).


If running suid root or with root privileges, procmail will be able to
perform as a functionally enhanced, backwards compatible mail delivery agent.


Procmail can also be used as a general purpose mail filter, i.e., provisions
have been made to enable procmail to be invoked in a special sendmail rule.


The rcfile format is described in detail in the
procmailrc(5)
man page.


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


Examples for rcfile recipes can be looked up in the
procmailex(5)
man page.






Any other arguments are presumed to be rcfile paths (either absolute,
or if they start with ‘./’ relative to the current
directory;
any other relative path is relative to $HOME, unless the
-m option has been given, in which case all relative paths are relative to the
current directory); procmail will start with the first one it finds on the
command line.  The following ones will only be parsed if the preceding ones
have a not matching HOST-directive entry, or in case they should not exist.


If no rcfiles are specified, it looks for
$HOME/.procmailrc. If not even that can be found, processing will continue according to
the default settings of the environment variables and the ones specified
on the command line.



Skip the rest of this EXAMPLES section unless you are a system administrator
who is vaguely familiar with sendmail.cf syntax.


The
-m option is typically used when procmail is called from within a rule in the
sendmail.cf file.  In order to be able to do this it is convenient to create
an extra ‘procmail’ mailer in your sendmail.cf file (in addition to the perhaps
already present ‘local’ mailer that starts up procmail).  To create such a
‘procmail’ mailer I’d suggest something like:





Mprocmail, P=/usr/bin/procmail, F=mSDFMhun, S=11, R=21,
        A=procmail -m $h $g $u


This enables you to use rules like the following (most likely in ruleset 0)
to filter mail through the procmail mailer (please note the leading tab
to continue the rule, and the tab to separate the comments):





R$*<@some.where>$*
        $#procmail $@/etc/procmailrcs/some.rc $:$1@some.where.procmail$2
R$*<@$*.procmail>$*
        $1<@$2>$3       Already filtered, map back


And /etc/procmailrcs/some.rc could be as simple as:





SENDER = "<$1>"                 # fix for empty sender addresses
SHIFT = 1                       # remove it from $@

:0                              # sink all junk mail
* ^Subject:.*junk
/dev/null

:0 w                            # pass along all other mail
! -oi -f "$SENDER" "$@"


:0                              # sink all junk mail
* ^Subject:.*junk
/dev/null


:0 w                            # pass along all other mail
! -oi -f "$SENDER" "$@"


Do watch out when sending mail from within the /etc/procmailrcs/some.rc file,
if you send mail to addresses which match the first rule again, you could
be creating an endless mail loop.



In the unlikely event that you absolutely need to kill procmail before it has
finished, first try and use the regular kill command (i.e.,
not kill -9, see the subsection
Signals for suggestions), otherwise some
lockfiles might not get removed.


Beware when using the
-t option, if procmail repeatedly is unable to deliver the mail (e.g., due to
an incorrect rcfile), the system mailqueue could fill up.  This could
aggravate both the local postmaster and other users.


The
/etc/procmailrc file might be executed with root privileges, so be very careful of what you put in it.
SHELL will be equal to that of the current recipient, so if procmail has to invoke the shell, you’d better set it to some safe value first.
See also :
DROPPRIVS. 

Keep in mind that if
chown(1)
is permitted on files in
/etc/procmailrcs/, that they can be chowned to root (or anyone else) by their current owners.
For maximum security, make sure this directory is
executable to root only.


Procmail is not the proper tool for sharing one mailbox among many
users, such as when you have one POP account for all mail to your
domain. It can be done if you manage to configure your MTA to add some
headers with the envelope recipient data in order to tell Procmail who
a message is for, but this is usually not the right thing to do.
Perhaps you want to investigate if your MTA offers ‘virtual user
tables’, or check out the ‘multidrop’ facility of Fetchmail.



Procmail uses the regular TERMINATE signal to terminate any runaway filter,
but it does not check if the filter responds to that signal and it only sends
it to the filter itself, not to any of the filter’s children.


A continued
Content-Length: field is not handled correctly.


The embedded newlines in a continued header should be skipped when
matching instead of being treated as a single space as they are now.



If there is no
Content-Length: field or the
-Y option has been specified and procmail appends to regular mailfolders, any
lines in the body of the message that look like postmarks are prepended with
‘>’ (disarms bogus mailheaders).  The regular expression that is used
to search for these postmarks is:


‘\nFrom ’


If the destination name used in explicit delivery mode is not in /etc/passwd,
procmail will proceed as if explicit delivery mode was not in effect.
If not in explicit delivery mode and
should the uid procmail is running under, have no corresponding /etc/passwd
entry, then HOME will default to /, LOGNAME will default to #uid,
SHELL will default to /bin/sh, and ORGMAIL will default to
/tmp/dead.letter.


When in explicit delivery mode, procmail will generate a leading ‘From ’
line if none is present.  If one is already present procmail will leave it
intact.  If procmail is not invoked with one of the following user or group ids : root, daemon, uucp, mail, x400, network, list, slist, lists or news, but still has to generate or accept a new ‘From ’ line,
it will generate an additional ‘>From ’ line to help distinguish
fake mails.


For security reasons procmail will only use an absolute or
$HOME-relative rcfile if it is owned by the recipient or root, not
world writable, and the directory it is contained in is not world
writable.  The $HOME/.procmailrc file has the additional constraint of not
being group-writable or in a group-writable directory.


If /var/mail/$LOGNAME is a bogus mailbox (i.e., does not belong to the
recipient, is unwritable, is a symbolic link or is a hard link), procmail will
upon startup try to rename it into a file starting
with ‘BOGUS.$LOGNAME.’ and
ending in an inode-sequence-code.  If this turns out to be impossible,
ORGMAIL will have
no initial value, and hence will inhibit delivery without a proper rcfile.


If /var/mail/$LOGNAME already is a valid mailbox, but has got too loose
permissions on it, procmail will correct this.  To prevent procmail from doing
this make sure the u+x bit is set.


When delivering to directories, MH folders, or maildir folders, you
don’t need to use lockfiles to prevent several concurrently running procmail
programs from messing up.


Delivering to MH folders is slightly more time consuming than delivering
to normal directories or mailboxes, because procmail has to search for
the next available number (instead of having the filename immediately
available).


On general failure procmail will return EX_CANTCREAT, unless option
-t is specified, in which case it will return EX_TEMPFAIL.


To make ‘egrepping’ of headers more consistent, procmail concatenates all
continued header fields; but only internally.  When delivering the mail, line
breaks will appear as before.


If procmail is called under a name not starting with ‘procmail’ (e.g., if it
is linked to another name and invoked as such), it comes up in explicit
delivery mode, and expects the recipients’ names as command line arguments
(as if -d had been specified).


Comsat/biff notifications are done using udp.  They are sent off
once when procmail generates the regular logfile entry.  The notification
messages have the following extended format (or as close as you can get when
final delivery was not to a file):


$LOGNAME@offset_of_message_in_mailbox :absolute_path_to_mailbox


Whenever procmail itself opens a file to deliver to, it
consistently uses the following kernel locking strategies :
fcntl(2).


Procmail is NFS-resistant and eight-bit clean.




There exists an excellent newbie FAQ about mailfilters (and procmail
in particular); it is maintained by Nancy McGough <nancym@ii.com>
and can be obtained by sending a mail to mail-server@rtfm.mit.edu with
the following in the body:


send usenet/news.answers/mail/filtering-faq


If procmail is
not installed globally as the default mail delivery agent (ask your system administrator), you have to make sure it is invoked when your mail arrives.
In this case your $HOME/.forward (beware, it
has to be world readable) file should contain the line below.  Be sure to include
the single and double quotes, and unless you know your site to be running
smrsh (the SendMail Restricted SHell), it must be an
absolute path.




" |exec /usr/bin/procmail"


Some mailers (notably exim) do not currently accept the above syntax.
In such case use this instead:




|/usr/bin/procmail


Procmail can also be invoked to postprocess an already filled system
mailbox.  This can be useful if you don’t want to or can’t use a
$HOME/.forward file (in which case the following script could
periodically be called from within
cron(1),
or whenever you start reading mail):





#!/bin/sh

ORGMAIL=/var/mail/$LOGNAME

if cd $HOME &&
 test -s $ORGMAIL &&
 lockfile -r0 -l1024 .newmail.lock 2>/dev/null
then
  trap "rm -f .newmail.lock" 1 2 3 13 15
  umask 077
  lockfile -l1024 -ml
  cat $ORGMAIL >>.newmail &&
   cat /dev/null >$ORGMAIL
  lockfile -mu
  formail -s procmail <.newmail &&
   rm -f .newmail
  rm -f .newmail.lock
fi
exit 0


ORGMAIL=/var/mail/$LOGNAME


if cd $HOME &&
 test -s $ORGMAIL &&
 lockfile -r0 -l1024 .newmail.lock 2>/dev/null
then
  trap "rm -f .newmail.lock" 1 2 3 13 15
  umask 077
  lockfile -l1024 -ml
  cat $ORGMAIL >>.newmail &&
   cat /dev/null >$ORGMAIL
  lockfile -mu
  formail -s procmail <.newmail &&
   rm -f .newmail
  rm -f .newmail.lock
fi
exit 0





PATH=/usr/local/bin:/usr/bin:/bin
MAILDIR=$HOME/Mail      #you’d better make sure it exists
DEFAULT=$MAILDIR/mbox   #completely optional
LOGFILE=$MAILDIR/from   #recommended

:0:
* ^From.*berg
from_me

:0
* ^Subject:.*Flame
/dev/null


:0:
* ^From.*berg
from_me


:0
* ^Subject:.*Flame
/dev/null


Other examples for rcfile recipes can be looked up in the
procmailex(5)
man page.

<procmail-users@procmail.org>

for submitting questions/answers.

for subscription requests.



If you would like to stay informed about new versions and official patches send
a subscription request to


procmail-announce-request@procmail.org

<srb@cuci.nl>

<guenther@sendmail.com>


Advertisements


    129 Lectures 
     23 hours 

 Eduonix Learning Solutions

    5 Lectures 
     4.5 hours 

 Frahaan Hussain

    35 Lectures 
     2 hours 

 Pradeep D

    41 Lectures 
     2.5 hours 

 Musab Zayadneh

    46 Lectures 
     4 hours 

 GUHARAJANM

    6 Lectures 
     4 hours 

 Uplatz
 Print
 Add Notes
 Bookmark this page