Hello All,
I tried to use the following rc for vacation auto-reply.
It works fine but when this recipe...:
(see below within {})
...
...
# Check the cache for a recent ack
:0:$ACKS.$LOCKEXT
* !? fgrep -s "$FROMADDR $DATE" $ACKS
...
...
...matches its condition I get mail once (it's what I want) but
when id DOES NOT I receive TWO copies of each incoming mail (it's
what I DO NOT want).
Please help me get rid of duplicate mails.
Thanx in advance
Best regards,
Serge mailto:serge7(_at_)usa(_dot_)net
-----------------------------cut---------------------------
# ackmail.rc -- procmail rc to acknowledge mail (with either a
# vacation message, or an acknowledgement)
#
# Author: Alan Stebbens <aks(_at_)hub(_dot_)ucsb(_dot_)edu>
#
# $Id: ackmail.rc,v 1.2 1995/02/10 04:16:13 aks Exp $
# $Source: /fs/eci1c/home/staff/aks/src/mail/procmail/lib/RCS/ackmail.rc,v $
#
# 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
#
# ACKS - file containing the acknowledgment cache;
# defaults to $MAILDIR/.acks.cache
#
# ACKMSG - file containing the message to reply with;
# defaults to $MAILDIR/ackmsg
#
# VACAMSG - file containing the message to reply with;
# defaults to $MAILDIR/vacation.msg
#
# FROMSIG - From: header to use in the auto-ack; defaults
# to "Mailer-Daemon of $USER"
#
# And be sure PATH includes the directory containing "formail".
MY_NAMES=${MY_NAMES:-${SIGNATURE:-`cat $HOME/.signature 2>/dev/null`}}
ACKS=${ACKS:-$MAILDIR/.acks.cache}
ACKMSG=${ACKMSG:-$MAILDIR/ackmsg}
VACAMSG=${VACAMSG:-$MAILDIR/vacation.msg}
FROMSIG=${FROMSIG:-"Mailer-Daemon of $USER"}
NOACKS=${NOACKS:-$MY_ADDR}
# Handy regexp patterns (taken from "headers.rc")
PRE_ADDR_SPAN='(.*[^-((_dot_)%(_at_)a-zA-Z0-9])?'
POST_ADDR_SPAN='(([^),.!:a-zA-Z0-9].*)?(,|$[^>]))'
FROM="(^(((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?
:0ch
* $ ^TO($USER|$MY_ADDR|$MY_NAMES)
* ? test -f $ACKMSG -o -f $VACAMSG
* ! ^FROM_DAEMON
* !$ $FROM(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
* !$ $FROM($NOACKS)$POST_ADDR_SPAN
{
# Okay -- we're donig 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
COMSAT=off
DELIVERED=yes
# 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 the mail to see if we have replied recently, and if so, if
# we should reply again
DATE=`date +'%D'`
# Get the from address by having formail generate a reply address
FROMADDR=`formail -rzx To:`
# Get the subject sans "Re:" and replacing double-quotes
SUBJ=`formail -zx Subject: | sed -e 's/^Re: *//g' -e 's/["~]/_/g'`
# Get which file: "vacation.msg" has precedence over "ackmsg"
ACKFILE=`if [ -f $VACAMSG ]; then echo $VACAMSG ; else echo $ACKMSG ; fi`
# Get either the string "on vacation" or "acknowledgement"
ACKM="`if [ -f $VACAMSG ]; then echo 'on vacation' ; else echo
acknowledgment ; fi`"
# Check the cache for a recent ack
:0:$ACKS.$LOCKEXT
* !? fgrep -s "$FROMADDR $DATE" $ACKS
| ( fgrep -v "$FROMADDR" $ACKS ; echo "$FROMADDR $DATE" ) >$ACKS.new ; \
rm -f $ACKS ; mv $ACKS.new $ACKS ; \
( formail -rI"From: $FROMSIG" \
-I"Reply-To: $MY_ADDR" \
-I"Precedence: junk" \
-I"Subject: Re: $SUBJ [$ACKM]" \
-I"X-Loop: $MY_ADDR" \
-I"References:" ; \
sed -e "s~\$SUBJECT~$SUBJ~" $ACKFILE ) \
| $SENDMAIL -oi -t
}
-----------------------------cut---------------------------