1 votes

Procmail : Pipe vers le programme, sinon renvoyer l'erreur à l'expéditeur

J'essaie d'utiliser procmail pour envoyer tous les messages pour un certain domaine à RT (Request Tracker). Il s'agit plutôt d'une question sur le fichier .procmailrc.

Voici mon fichier .procmailrc actuel :

#Preliminaries
SHELL=/bin/sh               #Use the Bourne shell (check your path!)
MAILDIR=${HOME}        #First check what your mail directory is!
LOGFILE=${MAILDIR}/procmail.log
LOG="--- Logging ${LOGFILE} for ${LOGNAME}, "
VERBOSE=yes
MAILDOMAIN='rt.mydomain.com'
RT_MAILGATE="/opt/rt3/bin/rt-mailgate"
RT_URL="http://rt.mydomain.com/"

LOGABSTRACT=all

### Trying to  process using the rt-mailgate script
:0
{
# the following line extracts the recipient from Received-headers.
# Simply using the To: does not work, as tickets are often created
# by sending a CC/BCC to RT
TO=`formail -c -xReceived: |grep $MAILDOMAIN |sed -e 's/.*for *<*\(.*\)>* *;.*$/\1/'`
QUEUE=`echo $TO| $HOME/get_queue.pl`
ACTION=`echo $TO| $HOME/get_action.pl`
:0 h b w 
|/usr/bin/perl $RT_MAILGATE --queue $QUEUE --action $ACTION --url $RT_URL
}

### Upon failure, I want to send back an error message to the user, saying
###   "Queue does not exist." I took this code from the procmailex manpage.
:0 Wh: no-queue.lock
{
## Reply if error
* !^FROM_DAEMON
* !^X-Loop: noloop@rt.ncom.com
| formail -rD 8192 no-queue.cache

  :0 ehc
  |(formail -rI"Precedence: junk" -A"X-Loop: noloop@rt.mydomain.com" ; \
    echo "The Queue or Action was invalid."; echo "--" \
    ) | $SENDMAIL -oi -t

}

Voyez-vous un problème avec mon fichier .procmailrc ? Il fonctionne bien si la file d'attente existe, mais après cela, il envoie simplement le courrier à /var/mail/nom d'utilisateur. Je veux jeter le courrier et renvoyer un message d'erreur.

2voto

Pavel Zdenek Points 166

Je n'ai pas utilisé procmail depuis un moment, honnêtement, donc je m'excuse si cela ne fonctionne pas immédiatement.

Tout d'abord, l'imbrication dans le script que vous aviez causait des problèmes parce qu'elle coupait pratiquement une recette en deux. Ils ne sont pas nécessaires de toute façon, donc je les ai supprimés. J'ai également simplifié la structure et je l'ai configurée de manière à ce qu'elle ne tombe jamais dans la boîte aux lettres locale.

#Preliminaries
SHELL=/bin/sh               #Use the Bourne shell (check your path!)
MAILDIR=${HOME}        #First check what your mail directory is!
LOGFILE=${MAILDIR}/procmail.log
LOG="--- Logging ${LOGFILE} for ${LOGNAME}, "
VERBOSE=yes
MAILDOMAIN='\(help\|rt\)\.\(ncom\|networklubbock\)\.com'
RT_MAILGATE="/opt/rt3/bin/rt-mailgate"
RT_URL="http://rt.ncom.com/"

LOGABSTRACT=all

### Trying to  process using the rt-mailgate script
# the following line extracts the recipient from Received-headers.
# Simply using the To: does not work, as tickets are often created
# by sending a CC/BCC to RT
TO=`formail -c -xReceived: |grep $MAILDOMAIN |sed -e 's/.*for *<*\(.*\)>* *;.*$/\1/'`
QUEUE=`echo $TO| $HOME/get_queue.pl`
ACTION=`echo $TO| $HOME/get_action.pl`
:0w 
|/usr/bin/perl $RT_MAILGATE --queue $QUEUE --action $ACTION --url $RT_URL

# the formail command below looks at the message sender and basically
# swallows the message if it's seen the sender before.  The number
# is the size of the cache file of seen addresses.  A lock file is
# used because multiple formail processes editing that cache will
# corrupt it.
:0w:no-queue.lock
| formail -rD 8192 no-queue.cache

### Upon failure, I want to send back an error message to the user, saying
###   "Queue does not exist." I took this code from the procmailex manpage.
# Don't send if this was a bounce from a mailer, and don't send if this
# message contains the header put there to indicate a loop.
:0
* !^FROM_DAEMON
* !^X-Loop: noloop@rt.ncom.com
|(formail -rI"Precedence: junk" -A"X-Loop: noloop@rt.ncom.com" ; \
  echo "The Queue or Action was invalid."; echo "--" \
  ) | $SENDMAIL -oi -t

# trash anything that falls all the way through.  This should only ever
# happen if the message was a bounce or if it was a loop.
:0
/dev/null

J'espère que cela vous aidera. N'hésitez pas à commenter si vous avez des questions sur l'une ou l'autre partie et j'essaierai de vous expliquer. Ou j'essaierai de comprendre comment je me suis trompé si ça ne marche pas.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X