Take the 2-minute tour ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

I'm trying to use procmail to send all messages for a certain domain to RT (Request Tracker). This is more of a question about the .procmailrc file, though.

Here's my current .procmailrc file:

#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

}

Do you see a problem with my .procmailrc file? It works fine if the queue exists, but after that point, it just sends the mail to /var/mail/username. I want to throw away the email and return an error message.

share|improve this question

1 Answer 1

up vote 2 down vote accepted

I haven't used procmail in a while honestly, so I appologize if this doesn't immediately work.

First off, the nesting in the script you had was causing problems because it pretty much cut a recipe in half. They aren't necessary anyway, so I removed them. I also simplified the structure and set it up so it will never fall through to the local mailbox.

#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

Hope that helps. Please comment if you have questions about any part of it and I'll try to explain. Or figure out how I goofed up if it doesn't work.

share|improve this answer
    
Ah, nice work. It works perfectly. But, it will continue to send error messages, won't it? I did get back two error messages in my tests, but just want to be sure. –  bradlis7 Jan 21 '10 at 17:52
    
Ah, yes. Replace the lowercase w with an uppercase W on the two first rules and it should stop that. –  Jeff Snider Jan 21 '10 at 19:29

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.