Я пытаюсь использовать procmail дляотправить все сообщениядля определенного доменаРТ(Request Tracker). Хотя это скорее вопрос о файле .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
Надеюсь, это поможет. Пожалуйста, комментируйте, если у вас есть вопросы по любой части, и я постараюсь объяснить. Или выясните, где я облажался, если это не сработает.