Procmail: 파이프에서 프로그램으로, 그렇지 않으면 보낸 사람에게 오류 반환

Procmail: 파이프에서 프로그램으로, 그렇지 않으면 보낸 사람에게 오류 반환

procmail을 사용하려고 합니다.모든 메시지 보내기특정 도메인에 대해RT(요청 추적기). 하지만 이것은 .procmailrc 파일에 관한 질문에 가깝습니다.

내 현재 .procmailrc 파일은 다음과 같습니다.

#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: [email protected]
| formail -rD 8192 no-queue.cache

  :0 ehc
  |(formail -rI"Precedence: junk" -A"X-Loop: [email protected]" ; \
    echo "The Queue or Action was invalid."; echo "--" \
    ) | $SENDMAIL -oi -t

}

내 .procmailrc 파일에 문제가 있습니까? 대기열이 있으면 제대로 작동하지만 그 이후에는 메일을 /var/mail/username으로 보냅니다. 이메일을 버리고 오류 메시지를 반환하고 싶습니다.

답변1

나는 솔직하게 한동안 procmail을 사용하지 않았기 때문에 이것이 즉시 작동하지 않는다면 사과드립니다.

우선, 스크립트의 중첩으로 인해 레시피가 거의 절반으로 줄어들었기 때문에 문제가 발생했습니다. 어쨌든 필요하지 않으므로 제거했습니다. 또한 구조를 단순화하고 로컬 사서함으로 넘어가지 않도록 설정했습니다.

#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: [email protected]
|(formail -rI"Precedence: junk" -A"X-Loop: [email protected]" ; \
  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

도움이 되길 바랍니다. 혹시 궁금한 부분이 있으면 댓글 달아주시면 설명해 드리겠습니다. 아니면 작동하지 않으면 내가 어떻게 실수했는지 알아보세요.

관련 정보